84 lines
2.3 KiB
Go
84 lines
2.3 KiB
Go
package service
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"strings"
|
|
|
|
otherperson "wucher/internal/domain/other_person"
|
|
)
|
|
|
|
type OtherPersonService struct{ repo otherperson.Repository }
|
|
|
|
func NewOtherPersonService(repo otherperson.Repository) *OtherPersonService {
|
|
return &OtherPersonService{repo: repo}
|
|
}
|
|
|
|
func (s *OtherPersonService) Upsert(ctx context.Context, p *otherperson.OtherPerson) error {
|
|
return s.repo.Upsert(ctx, p)
|
|
}
|
|
|
|
// Create registers a new master person. Name is required and the (name, mobile_phone,
|
|
// email) identity must be unique among live rows.
|
|
func (s *OtherPersonService) Create(ctx context.Context, p *otherperson.OtherPerson) error {
|
|
p.Name = strings.TrimSpace(p.Name)
|
|
p.MobilePhone = strings.TrimSpace(p.MobilePhone)
|
|
p.Email = strings.TrimSpace(p.Email)
|
|
if p.Name == "" {
|
|
return otherperson.ErrNameRequired
|
|
}
|
|
existing, err := s.repo.FindByIdentity(ctx, p.Name, p.MobilePhone, p.Email)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if existing != nil {
|
|
return otherperson.ErrDuplicate
|
|
}
|
|
return s.repo.Create(ctx, p)
|
|
}
|
|
|
|
// Update replaces the identity fields of an existing master person. The new identity must
|
|
// not collide with a different live row.
|
|
func (s *OtherPersonService) Update(ctx context.Context, p *otherperson.OtherPerson) error {
|
|
p.Name = strings.TrimSpace(p.Name)
|
|
p.MobilePhone = strings.TrimSpace(p.MobilePhone)
|
|
p.Email = strings.TrimSpace(p.Email)
|
|
if p.Name == "" {
|
|
return otherperson.ErrNameRequired
|
|
}
|
|
current, err := s.repo.GetByID(ctx, p.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if current == nil {
|
|
return otherperson.ErrNotFound
|
|
}
|
|
existing, err := s.repo.FindByIdentity(ctx, p.Name, p.MobilePhone, p.Email)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if existing != nil && !bytes.Equal(existing.ID, p.ID) {
|
|
return otherperson.ErrDuplicate
|
|
}
|
|
return s.repo.Update(ctx, p)
|
|
}
|
|
|
|
func (s *OtherPersonService) Delete(ctx context.Context, id, actor []byte) error {
|
|
current, err := s.repo.GetByID(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if current == nil {
|
|
return otherperson.ErrNotFound
|
|
}
|
|
return s.repo.Delete(ctx, id, actor)
|
|
}
|
|
|
|
func (s *OtherPersonService) GetByID(ctx context.Context, id []byte) (*otherperson.OtherPerson, error) {
|
|
return s.repo.GetByID(ctx, id)
|
|
}
|
|
|
|
func (s *OtherPersonService) Search(ctx context.Context, q string, limit, offset int) ([]otherperson.OtherPerson, int64, error) {
|
|
return s.repo.Search(ctx, q, limit, offset)
|
|
}
|