Files
clean-architecture-go-v2/usecase/user/service.go
T
2020-10-12 07:35:29 -03:00

70 lines
1.3 KiB
Go

package user
import (
"strings"
"time"
"github.com/eminetto/clean-architecture-go-v2/entity"
)
//Service interface
type Service struct {
repo Repository
}
//NewService create new use case
func NewService(r Repository) *Service {
return &Service{
repo: r,
}
}
//CreateUser Create an user
func (s *Service) CreateUser(email, password, firstName, lastName string) (entity.ID, error) {
e, err := entity.NewUser(email, password, firstName, lastName)
if err != nil {
return e.ID, err
}
return s.repo.Create(e)
}
//GetUser Get an user
func (s *Service) GetUser(id entity.ID) (*entity.User, error) {
return s.repo.Get(id)
}
//SearchUsers Search users
func (s *Service) SearchUsers(query string) ([]*entity.User, error) {
return s.repo.Search(strings.ToLower(query))
}
//ListUsers List users
func (s *Service) ListUsers() ([]*entity.User, error) {
return s.repo.List()
}
//DeleteUser Delete an user
func (s *Service) DeleteUser(id entity.ID) error {
u, err := s.GetUser(id)
if u == nil {
return entity.ErrNotFound
}
if err != nil {
return err
}
if len(u.Books) > 0 {
return entity.ErrCannotBeDeleted
}
return s.repo.Delete(id)
}
//UpdateUser Update an user
func (s *Service) UpdateUser(e *entity.User) error {
err := e.Validate()
if err != nil {
return entity.ErrInvalidEntity
}
e.UpdatedAt = time.Now()
return s.repo.Update(e)
}