fix: refactor code to be testable #181
This commit was merged in pull request #212.
This commit is contained in:
110
db/workout.go
Normal file
110
db/workout.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"me-fit/types"
|
||||
"me-fit/utils"
|
||||
|
||||
"database/sql"
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrWorkoutNotExists = errors.New("Workout does not exist")
|
||||
)
|
||||
|
||||
type WorkoutDb interface {
|
||||
InsertWorkout(userId uuid.UUID, workout *WorkoutInsert) (*Workout, error)
|
||||
GetWorkouts(userId uuid.UUID) ([]Workout, error)
|
||||
DeleteWorkout(userId uuid.UUID, rowId int) error
|
||||
}
|
||||
|
||||
type WorkoutDbSqlite struct {
|
||||
db *sql.DB
|
||||
}
|
||||
|
||||
func NewWorkoutDbSqlite(db *sql.DB) *WorkoutDbSqlite {
|
||||
return &WorkoutDbSqlite{db: db}
|
||||
}
|
||||
|
||||
type WorkoutInsert struct {
|
||||
Date time.Time
|
||||
Type string
|
||||
Sets int
|
||||
Reps int
|
||||
}
|
||||
|
||||
type Workout struct {
|
||||
RowId int
|
||||
Date time.Time
|
||||
Type string
|
||||
Sets int
|
||||
Reps int
|
||||
}
|
||||
|
||||
func NewWorkoutInsert(date time.Time, workoutType string, sets int, reps int) *WorkoutInsert {
|
||||
return &WorkoutInsert{Date: date, Type: workoutType, Sets: sets, Reps: reps}
|
||||
}
|
||||
|
||||
func NewWorkoutFromInsert(rowId int, workoutInsert *WorkoutInsert) *Workout {
|
||||
return &Workout{RowId: rowId, Date: workoutInsert.Date, Type: workoutInsert.Type, Sets: workoutInsert.Sets, Reps: workoutInsert.Reps}
|
||||
}
|
||||
|
||||
func (db WorkoutDbSqlite) InsertWorkout(userId uuid.UUID, workout *WorkoutInsert) (*Workout, error) {
|
||||
var rowId int
|
||||
err := db.db.QueryRow(`
|
||||
INSERT INTO workout (user_id, date, type, sets, reps)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
RETURNING rowid`, userId, workout.Date, workout.Type, workout.Sets, workout.Reps).Scan(&rowId)
|
||||
if err != nil {
|
||||
utils.LogError("Error inserting workout", err)
|
||||
return nil, types.ErrInternal
|
||||
}
|
||||
|
||||
return NewWorkoutFromInsert(rowId, workout), nil
|
||||
}
|
||||
|
||||
func (db WorkoutDbSqlite) GetWorkouts(userId uuid.UUID) ([]Workout, error) {
|
||||
|
||||
rows, err := db.db.Query("SELECT rowid, date, type, sets, reps FROM workout WHERE user_id = ? ORDER BY date desc", userId)
|
||||
if err != nil {
|
||||
utils.LogError("Could not get workouts", err)
|
||||
return nil, types.ErrInternal
|
||||
}
|
||||
|
||||
var workouts = make([]Workout, 0)
|
||||
for rows.Next() {
|
||||
var workout Workout
|
||||
|
||||
err = rows.Scan(&workout.RowId, &workout.Date, &workout.Type, &workout.Sets, &workout.Reps)
|
||||
if err != nil {
|
||||
utils.LogError("Could not scan workout", err)
|
||||
return nil, types.ErrInternal
|
||||
}
|
||||
|
||||
workouts = append(workouts, workout)
|
||||
}
|
||||
|
||||
return workouts, nil
|
||||
}
|
||||
|
||||
func (db WorkoutDbSqlite) DeleteWorkout(userId uuid.UUID, rowId int) error {
|
||||
|
||||
res, err := db.db.Exec("DELETE FROM workout WHERE user_id = ? AND rowid = ?", userId, rowId)
|
||||
if err != nil {
|
||||
return types.ErrInternal
|
||||
}
|
||||
|
||||
rows, err := res.RowsAffected()
|
||||
if err != nil {
|
||||
return types.ErrInternal
|
||||
}
|
||||
|
||||
if rows == 0 {
|
||||
return ErrWorkoutNotExists
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user