Yimaru-BackEnd/internal/services/programs/service.go

86 lines
2.1 KiB
Go

package programs
import (
"Yimaru-Backend/internal/domain"
"Yimaru-Backend/internal/ports"
"context"
"errors"
"github.com/jackc/pgx/v5"
)
var ErrProgramNotFound = errors.New("program not found")
type Service struct {
store ports.ProgramStore
}
func NewService(store ports.ProgramStore) *Service {
return &Service{store: store}
}
func (s *Service) Create(ctx context.Context, input domain.CreateProgramInput) (domain.Program, error) {
return s.store.CreateProgram(ctx, input)
}
func (s *Service) GetByID(ctx context.Context, id int64) (domain.Program, error) {
p, err := s.store.GetProgramByID(ctx, id)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return domain.Program{}, ErrProgramNotFound
}
return domain.Program{}, err
}
return p, nil
}
func (s *Service) List(ctx context.Context, limit, offset int32) ([]domain.Program, int64, error) {
if limit <= 0 {
limit = 20
}
if limit > 200 {
limit = 200
}
if offset < 0 {
offset = 0
}
return s.store.ListPrograms(ctx, limit, offset)
}
func (s *Service) Update(ctx context.Context, id int64, input domain.UpdateProgramInput) (domain.Program, error) {
p, err := s.store.UpdateProgram(ctx, id, input)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return domain.Program{}, ErrProgramNotFound
}
return domain.Program{}, err
}
return p, nil
}
func (s *Service) Delete(ctx context.Context, id int64) error {
if _, err := s.store.GetProgramByID(ctx, id); err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return ErrProgramNotFound
}
return err
}
return s.store.DeleteProgram(ctx, id)
}
// Reorder sets program sort_order from ordered ids (1..n). ordered must list every program id exactly once
// (e.g. from GET /programs) in the desired display / learning order.
func (s *Service) Reorder(ctx context.Context, ordered []int64) error {
expected, err := s.store.ListAllProgramIDs(ctx)
if err != nil {
return err
}
if err := domain.ValidateReorderPermutation(ordered, expected); err != nil {
return err
}
if len(ordered) == 0 {
return nil
}
return s.store.ReorderPrograms(ctx, ordered)
}