From eea1f0976992bf23f201324a0e3b7d00d78e964f Mon Sep 17 00:00:00 2001 From: Hayden Hargreaves Date: Sat, 7 Feb 2026 23:41:31 -0700 Subject: [PATCH] (FIX): Some ORM things and an attempt to fix CI/CD --- Dockerfile | 3 + .../database/repository/recipe_repository.go | 7 +- .../database/repository/user_repository.go | 104 +++++++++--------- 3 files changed, 60 insertions(+), 54 deletions(-) diff --git a/Dockerfile b/Dockerfile index cbf0426..9b8013d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,9 @@ FROM golang:1.25-alpine WORKDIR /app +# Solution t IP block? +ENV GOPROXY=https://goproxy.io,https://athens.azurefd.net,direct + COPY go.mod go.sum ./ RUN go mod download diff --git a/internal/infrastructure/database/repository/recipe_repository.go b/internal/infrastructure/database/repository/recipe_repository.go index 7e5cc76..c31962a 100644 --- a/internal/infrastructure/database/repository/recipe_repository.go +++ b/internal/infrastructure/database/repository/recipe_repository.go @@ -237,7 +237,10 @@ func (r *RecipeRepository) GetRecipe(id int, userId *int) (*domain.Recipe, error &recipe.Created, &recipe.Deleted, ); err != nil { - return nil, fmt.Errorf("Failed to location recipe in database: %s", err.Error()) + if err == sql.ErrNoRows { + return nil, err + } + return nil, fmt.Errorf("Failed to location recipe (id: %d) in database: %s", id, err.Error()) } // Parse duration @@ -300,7 +303,7 @@ func (r *RecipeRepository) GetRecipes(ids []int, userId *int) ([]domain.Recipe, for _, id := range ids { recipe, err := r.GetRecipe(id, userId) - if err != nil { + if err != nil && err != sql.ErrNoRows { return nil, err } diff --git a/internal/infrastructure/database/repository/user_repository.go b/internal/infrastructure/database/repository/user_repository.go index f5e9cf3..ba5236f 100644 --- a/internal/infrastructure/database/repository/user_repository.go +++ b/internal/infrastructure/database/repository/user_repository.go @@ -4,6 +4,7 @@ import ( "database/sql" "fmt" + sq "github.com/Masterminds/squirrel" domain "github.com/haydenhargreaves/Potion/internal/domain/user" "github.com/jmoiron/sqlx" _ "github.com/lib/pq" @@ -31,42 +32,37 @@ func NewUserRepository(db *sqlx.DB) domain.UserRepository { // best results, pair this function with the GetGoogleUser which will return the user if it can find // it. func (r *UserRepository) CreateGoogleUser(googleUserInfo *domain.GoogleUserInfo, googleRefreshToken string) (domain.User, error) { - tx, err := r.db.Begin() - if err != nil { - return domain.User{}, err - } - if googleUserInfo == nil { return domain.User{}, fmt.Errorf("Google user info provided was nil") } - var user domain.User - query := `INSERT INTO users - (GoogleId, Name, Email, ImageUrl, GoogleRefreshToken) - VALUES ($1, $2, $3, $4, $5) RETURNING *;` + psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) - if err := tx.QueryRow( - query, - googleUserInfo.Id, - googleUserInfo.Name, - googleUserInfo.Email, - googleUserInfo.Picture, - googleRefreshToken, - ).Scan( - &user.Id, - &user.GoogleId, - &user.Name, - &user.Email, - &user.ImageUrl, - &user.GoogleRefreshToken, - &user.Created, - ); err != nil { - tx.Rollback() - return domain.User{}, err + query := psql. + Insert("users"). + Columns( + "googleid", + "name", + "email", + "imageurl", + "googlerefreshtoken"). + Values( + googleUserInfo.Id, + googleUserInfo.Name, + googleUserInfo.Email, + googleUserInfo.Picture, + googleRefreshToken, + ). + Suffix("RETURNING *") + + _sql, args, err := query.ToSql() + if err != nil { + return domain.User{}, fmt.Errorf("Failed to construct sql query: %w", err) } - if err := tx.Commit(); err != nil { - return domain.User{}, err + var user domain.User + if err := r.db.Get(&user, _sql, args...); err != nil { + return domain.User{}, fmt.Errorf("Failed to create user: %w", err) } return user, nil @@ -76,23 +72,26 @@ func (r *UserRepository) CreateGoogleUser(googleUserInfo *domain.GoogleUserInfo, // function is used when a user logs in with Google to prevent duplicate entries from being made. If // no user is found, this function will return a null pointer but not an error. func (r *UserRepository) GetGoogleUser(googleId string) (*domain.User, error) { - var user domain.User - query := `SELECT * FROM users WHERE GoogleId = $1` + psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) - if err := r.db.QueryRow(query, googleId).Scan( - &user.Id, - &user.GoogleId, - &user.Name, - &user.Email, - &user.ImageUrl, - &user.GoogleRefreshToken, - &user.Created, - ); err != nil { - // If no user was found, don't error, just return + query := psql. + Select("*"). + From("users"). + Where(sq.Eq{ + "GoogleId": googleId, + }) + + _sql, args, err := query.ToSql() + if err != nil { + return nil, fmt.Errorf("Failed to construct sql query: %w", err) + } + + var user domain.User + if err := r.db.Get(&user, _sql, args...); err != nil { if err == sql.ErrNoRows { return nil, nil } - return nil, err + return nil, fmt.Errorf("Failed to get Google user: %w", err) } return &user, nil @@ -103,18 +102,19 @@ func (r *UserRepository) GetGoogleUser(googleId string) (*domain.User, error) { // Callers are responsible for protecting against double nil results. Any errors will be bubbled // to the caller. func (r *UserRepository) GetUser(id int) (*domain.User, error) { - query := "SELECT * FROM users WHERE id = $1" + psql := sq.StatementBuilder.PlaceholderFormat(sq.Dollar) + query := psql. + Select("*"). + From("users"). + Where(sq.Eq{"id": id}) + + _sql, args, err := query.ToSql() + if err != nil { + return nil, fmt.Errorf("Failed to construct sql query: %w", err) + } var user domain.User - if err := r.db.QueryRow(query, id).Scan( - &user.Id, - &user.GoogleId, - &user.Name, - &user.Email, - &user.ImageUrl, - &user.GoogleRefreshToken, - &user.Created, - ); err != nil { + if err := r.db.Get(&user, _sql, args...); err != nil { // If no user was found, don't error, just return if err == sql.ErrNoRows { return nil, nil -- 2.47.2