this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

back(database): switch to sqlx

Clément 19ce4270 27e7f200

+36 -34
+4 -2
backend/cmd/api/main.go
··· 5 5 6 6 "github.com/go-chi/chi/v5" 7 7 chimiddleware "github.com/go-chi/chi/v5/middleware" 8 + "github.com/go-sqlx/sqlx" 8 9 "github.com/syumai/workers" 9 10 _ "github.com/syumai/workers/cloudflare/d1" // register driver 10 11 "uiua.online/internal/handlers" ··· 13 14 ) 14 15 15 16 func main() { 16 - db, err := sql.Open("d1", "DB") 17 + d1, err := sql.Open("d1", "DB") 17 18 if err != nil { 18 19 panic(err) 19 20 } 21 + db := sqlx.NewDb(d1, "d1") 20 22 21 23 sessionSvc := services.NewSessionService(db) 22 24 userSvc := services.NewUserService(db) 23 - authSvc := services.NewAuthService(db, userSvc, sessionSvc) 25 + authSvc := services.NewAuthService(userSvc, sessionSvc) 24 26 25 27 auth := middlewares.NewAuthMiddleware(sessionSvc) 26 28
+2
backend/go.mod
··· 11 11 github.com/gofrs/uuid v4.4.0+incompatible 12 12 golang.org/x/crypto v0.40.0 13 13 ) 14 + 15 + require github.com/go-sqlx/sqlx v1.3.8
+8
backend/go.sum
··· 1 1 github.com/go-chi/chi/v5 v5.2.4 h1:WtFKPHwlywe8Srng8j2BhOD9312j9cGUxG1SP4V2cR4= 2 2 github.com/go-chi/chi/v5 v5.2.4/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= 3 + github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= 4 + github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= 5 + github.com/go-sqlx/sqlx v1.3.8 h1:safGa2UUYWLwuW71S0Bfyw8+Ag5lMeVduN4Fm3OBkIQ= 6 + github.com/go-sqlx/sqlx v1.3.8/go.mod h1:8IQsxeiq14kP8ndB8cebAO8lTo0k9UMzMA+AWXJ6030= 3 7 github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= 4 8 github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= 9 + github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= 10 + github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= 11 + github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= 12 + github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= 5 13 github.com/syumai/workers v0.31.0 h1:i9PCkjfuwRvJv0DwaF7pxDNv9oeyEQfolyPtFTtkwEY= 6 14 github.com/syumai/workers v0.31.0/go.mod h1:ZnqmdiHNBrbxOLrZ/HJ5jzHy6af9cmiNZk10R9NrIEA= 7 15 golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
+4 -4
backend/internal/models/session.go
··· 5 5 ) 6 6 7 7 type Session struct { 8 - ID uuid.UUID `json:"id"` 9 - UserID uuid.UUID `json:"user_id"` 10 - Token string `json:"token"` 11 - CreatedAt string `json:"created_at"` 8 + ID uuid.UUID `json:"id" db:"id"` 9 + UserID uuid.UUID `json:"user_id" db:"user_id"` 10 + Token string `json:"token" db:"token"` 11 + CreatedAt string `json:"created_at" db:"created_at"` 12 12 }
+4 -4
backend/internal/models/user.go
··· 5 5 ) 6 6 7 7 type User struct { 8 - ID uuid.UUID `json:"id"` 9 - Email string `json:"email"` 10 - PasswordHash string `json:"password_hash"` 11 - CreatedAt string `json:"created_at"` 8 + ID uuid.UUID `json:"id" db:"id"` 9 + Email string `json:"email" db:"email"` 10 + PasswordHash string `json:"password_hash" db:"password_hash"` 11 + CreatedAt string `json:"created_at" db:"created_at"` 12 12 }
+2 -4
backend/internal/services/auth.go
··· 2 2 3 3 import ( 4 4 "context" 5 - "database/sql" 6 5 "errors" 7 6 8 7 "github.com/gofrs/uuid" ··· 10 9 ) 11 10 12 11 type AuthService struct { 13 - db *sql.DB 14 12 user *UserService 15 13 session *SessionService 16 14 } 17 15 18 - func NewAuthService(db *sql.DB, user *UserService, session *SessionService) *AuthService { 19 - return &AuthService{db: db, user: user, session: session} 16 + func NewAuthService(user *UserService, session *SessionService) *AuthService { 17 + return &AuthService{user: user, session: session} 20 18 } 21 19 22 20 var InvalidPassword = errors.New("invalid password")
+6 -8
backend/internal/services/session.go
··· 2 2 3 3 import ( 4 4 "crypto/rand" 5 - "database/sql" 6 5 "encoding/hex" 7 6 7 + "github.com/go-sqlx/sqlx" 8 8 "github.com/gofrs/uuid" 9 9 "uiua.online/internal/models" 10 10 ) 11 11 12 12 type SessionService struct { 13 - db *sql.DB 13 + db *sqlx.DB 14 14 } 15 15 16 - func NewSessionService(db *sql.DB) *SessionService { 16 + func NewSessionService(db *sqlx.DB) *SessionService { 17 17 return &SessionService{db: db} 18 18 } 19 19 20 20 func (s *SessionService) GetUserFromSession(token string) (uuid.UUID, error) { 21 21 var userID uuid.UUID 22 - if err := s.db.QueryRow("select user_id from \"session\" where token = ?", token).Scan(&userID); err != nil { 22 + if err := s.db.Get(&token, "select user_id from \"session\" where token = ?"); err != nil { 23 23 return uuid.Nil, err 24 24 } 25 25 return userID, nil ··· 37 37 UserID: user.ID, 38 38 Token: hex.EncodeToString(token), 39 39 } 40 - if _, err := s.db.Exec("insert into \"session\" (id, user_id, token) values (?, ?, ?)", 41 - session.ID, session.UserID, session.Token); err != nil { 42 - return "", err 43 - } 40 + s.db.MustExec("insert into \"session\" (id, user_id, token) values (?, ?, ?)", 41 + session.ID, session.UserID, session.Token) 44 42 return session.Token, nil 45 43 }
+6 -12
backend/internal/services/user.go
··· 1 1 package services 2 2 3 3 import ( 4 - "database/sql" 5 4 "errors" 6 5 6 + "github.com/go-sqlx/sqlx" 7 7 "github.com/gofrs/uuid" 8 8 "golang.org/x/crypto/bcrypt" 9 9 "uiua.online/internal/models" 10 10 ) 11 11 12 12 type UserService struct { 13 - db *sql.DB 13 + db *sqlx.DB 14 14 } 15 15 16 - func NewUserService(db *sql.DB) *UserService { 16 + func NewUserService(db *sqlx.DB) *UserService { 17 17 return &UserService{db: db} 18 18 } 19 19 20 20 // get a user by its email 21 21 func (s *UserService) GetFromEmail(email string) (*models.User, error) { 22 - row := s.db.QueryRow("select * from \"users\" where email = ?", email) 23 22 var user models.User 24 - if err := row.Scan(&user.ID, &user.Email, &user.PasswordHash, &user.CreatedAt); err != nil { 23 + if err := s.db.Get(&user, "select * from \"users\" where email = ?", email); err != nil { 25 24 return nil, err 26 25 } 27 26 return &user, nil ··· 42 41 } 43 42 44 43 func (s *UserService) GetFromID(userId uuid.UUID) (*models.User, error) { 45 - row := s.db.QueryRow("select * from \"users\" where id = ?", userId) 46 44 var user models.User 47 - if err := row.Scan(&user.ID, &user.Email, &user.PasswordHash, &user.CreatedAt); err != nil { 45 + if err := s.db.Get(&user, "select * from \"users\" where id = ?", userId); err != nil { 48 46 return nil, err 49 47 } 50 48 return &user, nil ··· 56 54 return err 57 55 } 58 56 59 - _, err = s.db.Exec("update \"users\" set password_hash = ? where id = ?", hashedPassword, user.ID) 60 - if err != nil { 61 - return err 62 - } 63 - 57 + s.db.MustExec("update \"users\" set password_hash = ? where id = ?", hashedPassword, user.ID) 64 58 return nil 65 59 }