131 lines
2.7 KiB
Go
131 lines
2.7 KiB
Go
package service
|
|
|
|
import (
|
|
"spend-sparrow/db"
|
|
"spend-sparrow/types"
|
|
|
|
"errors"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type Workout interface {
|
|
AddWorkout(user *types.User, workoutDto *WorkoutDto) (*WorkoutDto, error)
|
|
DeleteWorkout(user *types.User, rowId int) error
|
|
GetWorkouts(user *types.User) ([]*WorkoutDto, error)
|
|
}
|
|
|
|
type WorkoutImpl struct {
|
|
db db.WorkoutDb
|
|
random Random
|
|
clock Clock
|
|
mail Mail
|
|
settings *types.Settings
|
|
}
|
|
|
|
func NewWorkoutImpl(db db.WorkoutDb, random Random, clock Clock, mail Mail, settings *types.Settings) Workout {
|
|
return WorkoutImpl{
|
|
db: db,
|
|
random: random,
|
|
clock: clock,
|
|
mail: mail,
|
|
settings: settings,
|
|
}
|
|
}
|
|
|
|
type WorkoutDto struct {
|
|
RowId string
|
|
Date string
|
|
Type string
|
|
Sets string
|
|
Reps string
|
|
}
|
|
|
|
func NewWorkoutDtoFromDb(workout *db.Workout) *WorkoutDto {
|
|
return &WorkoutDto{
|
|
RowId: strconv.Itoa(workout.RowId),
|
|
Date: renderDate(workout.Date),
|
|
Type: workout.Type,
|
|
Sets: strconv.Itoa(workout.Sets),
|
|
Reps: strconv.Itoa(workout.Reps),
|
|
}
|
|
}
|
|
func NewWorkoutDto(rowId string, date string, workoutType string, sets string, reps string) *WorkoutDto {
|
|
return &WorkoutDto{
|
|
RowId: rowId,
|
|
Date: date,
|
|
Type: workoutType,
|
|
Sets: sets,
|
|
Reps: reps,
|
|
}
|
|
}
|
|
|
|
var (
|
|
ErrInputValues = errors.New("invalid input values")
|
|
)
|
|
|
|
func (service WorkoutImpl) AddWorkout(user *types.User, workoutDto *WorkoutDto) (*WorkoutDto, error) {
|
|
|
|
if workoutDto.Date == "" || workoutDto.Type == "" || workoutDto.Sets == "" || workoutDto.Reps == "" {
|
|
return nil, ErrInputValues
|
|
}
|
|
|
|
date, err := time.Parse("2006-01-02", workoutDto.Date)
|
|
if err != nil {
|
|
return nil, ErrInputValues
|
|
}
|
|
|
|
sets, err := strconv.Atoi(workoutDto.Sets)
|
|
if err != nil {
|
|
return nil, ErrInputValues
|
|
}
|
|
|
|
reps, err := strconv.Atoi(workoutDto.Reps)
|
|
if err != nil {
|
|
return nil, ErrInputValues
|
|
}
|
|
|
|
workoutInsert := db.NewWorkoutInsert(date, workoutDto.Type, sets, reps)
|
|
|
|
workout, err := service.db.InsertWorkout(user.Id, workoutInsert)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return NewWorkoutDtoFromDb(workout), nil
|
|
}
|
|
|
|
func (service WorkoutImpl) DeleteWorkout(user *types.User, rowId int) error {
|
|
if user == nil {
|
|
return types.ErrInternal
|
|
}
|
|
|
|
return service.db.DeleteWorkout(user.Id, rowId)
|
|
}
|
|
|
|
func (service WorkoutImpl) GetWorkouts(user *types.User) ([]*WorkoutDto, error) {
|
|
if user == nil {
|
|
return nil, types.ErrInternal
|
|
}
|
|
|
|
workouts, err := service.db.GetWorkouts(user.Id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// for _, workout := range workouts {
|
|
// workout.Date = renderDate(workout.Date)
|
|
// }
|
|
|
|
workoutsDto := make([]*WorkoutDto, len(workouts))
|
|
for i, workout := range workouts {
|
|
workoutsDto[i] = NewWorkoutDtoFromDb(&workout)
|
|
}
|
|
|
|
return workoutsDto, nil
|
|
}
|
|
|
|
func renderDate(date time.Time) string {
|
|
return date.Format("2006-01-02")
|
|
}
|