package budget import ( "context" "log/slog" "spend-sparrow/internal/core" "github.com/google/uuid" "github.com/jmoiron/sqlx" ) type Db interface { Insert(ctx context.Context, budget Budget) (*Budget, error) Update(ctx context.Context, budget Budget) (*Budget, error) Delete(ctx context.Context, userId uuid.UUID, budgetId uuid.UUID) error Get(ctx context.Context, userId uuid.UUID, budgetId uuid.UUID) (*Budget, error) GetAll(ctx context.Context, userId uuid.UUID) ([]Budget, error) } type DbSqlite struct { db *sqlx.DB } func NewDbSqlite(db *sqlx.DB) *DbSqlite { return &DbSqlite{db: db} } func (db DbSqlite) Insert(ctx context.Context, budget Budget) (*Budget, error) { r, err := db.db.ExecContext(ctx, ` INSERT INTO budget (id, user_id, name, value, created_at, created_by, updated_at, updated_by) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, budget.Id, budget.UserId, budget.Name, budget.Value, budget.CreatedAt, budget.CreatedBy, budget.UpdatedAt, budget.UpdatedBy, ) err = core.TransformAndLogDbError(ctx, "budget", r, err) if err != nil { return nil, core.ErrInternal } return db.Get(ctx, budget.UserId, budget.Id) } func (db DbSqlite) Update(ctx context.Context, budget Budget) (*Budget, error) { _, err := db.db.ExecContext(ctx, ` UPDATE budget SET name = ?, value = ?, updated_at = ?, updated_by = ? WHERE user_id = ? AND id = ?`, budget.Name, budget.Value, budget.UpdatedAt, budget.UpdatedBy, budget.UserId, budget.Id) if err != nil { slog.ErrorContext(ctx, "SQL error UpdateUser", "err", err) return nil, core.ErrInternal } return db.Get(ctx, budget.UserId, budget.Id) } func (db DbSqlite) Delete(ctx context.Context, userId uuid.UUID, budgetId uuid.UUID) error { r, err := db.db.ExecContext( ctx, "DELETE FROM budget WHERE user_id = ? AND id = ?", userId, budgetId) err = core.TransformAndLogDbError(ctx, "budget", r, err) if err != nil { return err } return nil } func (db DbSqlite) Get(ctx context.Context, userId uuid.UUID, budgetId uuid.UUID) (*Budget, error) { var budget Budget err := db.db.Get(&budget, "SELECT * FROM budget WHERE id = ? AND user_id = ?", budgetId, userId) if err != nil { slog.ErrorContext(ctx, "Could not get budget", "err", err) return nil, core.ErrInternal } return &budget, nil } func (db DbSqlite) GetAll(ctx context.Context, userId uuid.UUID) ([]Budget, error) { var budgets []Budget err := db.db.Select(&budgets, "SELECT * FROM budget WHERE user_id = ?", userId) if err != nil { slog.ErrorContext(ctx, "Could not GetAll budget", "err", err) return nil, core.ErrInternal } return budgets, nil }