(FIX): Some ORM things and an attempt to fix CI/CD #91

Merged
azpect merged 2 commits from feature/orm into master 2026-02-07 23:42:03 -07:00
3 changed files with 60 additions and 54 deletions
Showing only changes of commit eea1f09769 - Show all commits

View File

@ -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

View File

@ -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
}

View File

@ -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