package service import ( "web-app-template/db" "web-app-template/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") }