package category import ( "enaklo-pos-be/internal/common/logger" "enaklo-pos-be/internal/common/mycontext" "enaklo-pos-be/internal/entity" "github.com/pkg/errors" "go.uber.org/zap" ) type Service interface { Create(ctx mycontext.Context, category *entity.Category) (*entity.Category, error) GetByPartnerID(ctx mycontext.Context, partnerID int64) ([]*entity.Category, error) Update(ctx mycontext.Context, category *entity.Category) error Delete(ctx mycontext.Context, id int64) error GetByID(ctx mycontext.Context, id int64) (*entity.Category, error) } type Repository interface { Create(ctx mycontext.Context, category *entity.Category) (*entity.Category, error) GetByPartnerID(ctx mycontext.Context, partnerID int64) ([]*entity.Category, error) Update(ctx mycontext.Context, category *entity.Category) error Delete(ctx mycontext.Context, id int64) error GetByID(ctx mycontext.Context, id int64) (*entity.Category, error) } type categorySvc struct { repo Repository } func New(repo Repository) Service { return &categorySvc{repo: repo} } func (s *categorySvc) Create(ctx mycontext.Context, category *entity.Category) (*entity.Category, error) { existing, err := s.repo.GetByPartnerID(ctx, category.PartnerID) if err != nil { return nil, errors.Wrap(err, "failed to fetch categories") } for _, cat := range existing { if cat.Name == category.Name { return nil, errors.New("category name already exists for this partner") } } newCategory, err := s.repo.Create(ctx, category) if err != nil { logger.ContextLogger(ctx).Error("failed to create category", zap.Error(err)) return nil, errors.Wrap(err, "failed to create category") } return newCategory, nil } func (s *categorySvc) GetByPartnerID(ctx mycontext.Context, partnerID int64) ([]*entity.Category, error) { categories, err := s.repo.GetByPartnerID(ctx, partnerID) if err != nil { return nil, errors.Wrap(err, "failed to get categories by partner") } return categories, nil } func (s *categorySvc) Update(ctx mycontext.Context, category *entity.Category) error { err := s.repo.Update(ctx, category) if err != nil { logger.ContextLogger(ctx).Error("failed to update category", zap.Error(err)) return errors.Wrap(err, "failed to update category") } return nil } func (s *categorySvc) Delete(ctx mycontext.Context, id int64) error { err := s.repo.Delete(ctx, id) if err != nil { logger.ContextLogger(ctx).Error("failed to delete category", zap.Error(err)) return errors.Wrap(err, "failed to delete category") } return nil } func (s *categorySvc) GetByID(ctx mycontext.Context, id int64) (*entity.Category, error) { category, err := s.repo.GetByID(ctx, id) if err != nil { return nil, errors.Wrap(err, "failed to get category by ID") } return category, nil }