package service import ( "context" "errors" "financeiro-carvalho/internal/model" ) var ( ErrAccountEmptyName = errors.New("account name cannot be empty") ErrAccountInvalidType = errors.New("account type must be checking, savings, investment, or credit") ) var validAccountTypes = map[string]bool{ "checking": true, "savings": true, "investment": true, "credit": true, } type AccountRepo interface { List(ctx context.Context) ([]model.Account, error) GetByID(ctx context.Context, id int) (*model.Account, error) Create(ctx context.Context, in model.AccountInput) (*model.Account, error) Update(ctx context.Context, id int, in model.AccountInput) (*model.Account, error) Delete(ctx context.Context, id int) error TotalPatrimony(ctx context.Context) (float64, error) } type AccountService struct { repo AccountRepo } func NewAccountService(repo AccountRepo) *AccountService { return &AccountService{repo: repo} } func (s *AccountService) validate(in model.AccountInput) error { if in.Name == "" { return ErrAccountEmptyName } if !validAccountTypes[in.Type] { return ErrAccountInvalidType } return nil } func (s *AccountService) List(ctx context.Context) ([]model.Account, error) { return s.repo.List(ctx) } func (s *AccountService) Create(ctx context.Context, in model.AccountInput) (*model.Account, error) { if err := s.validate(in); err != nil { return nil, err } return s.repo.Create(ctx, in) } func (s *AccountService) Update(ctx context.Context, id int, in model.AccountInput) (*model.Account, error) { if err := s.validate(in); err != nil { return nil, err } return s.repo.Update(ctx, id, in) } func (s *AccountService) Delete(ctx context.Context, id int) error { return s.repo.Delete(ctx, id) } func (s *AccountService) TotalPatrimony(ctx context.Context) (float64, error) { return s.repo.TotalPatrimony(ctx) }