Files
base/internal/application/profilerole/service.go
2026-04-10 18:25:21 +03:30

122 lines
2.7 KiB
Go

package profilerole
import (
"context"
"errors"
"github.com/google/uuid"
"github.com/rs/zerolog"
"go.uber.org/fx"
domainProfile "base/internal/domain/profile"
"base/internal/dto"
)
var ErrNotFound = domainProfile.ErrRoleNotFound
type Service interface {
List(ctx context.Context) ([]dto.ProfileRole, error)
ListWithLimit(ctx context.Context, limit, offset int) ([]dto.ProfileRole, error)
Create(ctx context.Context, req dto.CreateProfileRoleRequest) (*dto.ProfileRole, error)
GetByID(ctx context.Context, id uuid.UUID) (*dto.ProfileRole, error)
Update(ctx context.Context, req dto.UpdateProfileRoleRequest) (*dto.ProfileRole, error)
Delete(ctx context.Context, id uuid.UUID) error
}
type service struct {
logger zerolog.Logger
repo domainProfile.RoleRepository
}
type Param struct {
Logger zerolog.Logger
Repo domainProfile.RoleRepository
fx.In
}
func New(param Param) Service {
return &service{
logger: param.Logger,
repo: param.Repo,
}
}
func (s *service) List(ctx context.Context) ([]dto.ProfileRole, error) {
roles, err := s.repo.FindAll(ctx)
if err != nil {
return nil, err
}
return toDTOs(roles), nil
}
func (s *service) ListWithLimit(ctx context.Context, limit, offset int) ([]dto.ProfileRole, error) {
roles, err := s.repo.List(ctx, limit, offset)
if err != nil {
return nil, err
}
return toDTOs(roles), nil
}
func (s *service) Create(ctx context.Context, req dto.CreateProfileRoleRequest) (*dto.ProfileRole, error) {
role := &domainProfile.Role{
ID: uuid.New(),
Title: req.Title,
}
if err := s.repo.Create(ctx, role); err != nil {
return nil, err
}
return toDTO(role), nil
}
func (s *service) GetByID(ctx context.Context, id uuid.UUID) (*dto.ProfileRole, error) {
role, err := s.repo.FindByID(ctx, id)
if err != nil {
if errors.Is(err, ErrNotFound) {
return nil, ErrNotFound
}
return nil, err
}
return toDTO(role), nil
}
func (s *service) Update(ctx context.Context, req dto.UpdateProfileRoleRequest) (*dto.ProfileRole, error) {
id, err := uuid.Parse(req.ID)
if err != nil {
return nil, ErrNotFound
}
role, err := s.repo.FindByID(ctx, id)
if err != nil {
return nil, ErrNotFound
}
role.Title = req.Title
if err := s.repo.Update(ctx, role); err != nil {
return nil, err
}
return toDTO(role), nil
}
func (s *service) Delete(ctx context.Context, id uuid.UUID) error {
role, err := s.repo.FindByID(ctx, id)
if err != nil {
return ErrNotFound
}
return s.repo.Delete(ctx, role.ID)
}
func toDTO(r *domainProfile.Role) *dto.ProfileRole {
return &dto.ProfileRole{
Id: r.ID.String(),
Title: r.Title,
}
}
func toDTOs(roles []*domainProfile.Role) []dto.ProfileRole {
out := make([]dto.ProfileRole, len(roles))
for i, r := range roles {
out[i] = *toDTO(r)
}
return out
}