wms-be/modules/permissions/service/permissions_service.go

116 lines
3.4 KiB
Go

package service
import (
"context"
"github.com/Caknoooo/go-gin-clean-starter/database/entities"
"github.com/Caknoooo/go-gin-clean-starter/modules/permissions/dto"
"github.com/Caknoooo/go-gin-clean-starter/modules/permissions/repository"
"github.com/google/uuid"
"gorm.io/gorm"
)
type PermissionsService interface {
Create(ctx context.Context, req dto.PermissionsCreateRequest) (dto.PermissionsResponse, error)
GetById(ctx context.Context, id string) (dto.PermissionsResponse, error)
GetByName(ctx context.Context, name string) (dto.PermissionsResponse, error)
Update(ctx context.Context, id string, req dto.PermissionsUpdateRequest) (dto.PermissionsResponse, error)
Delete(ctx context.Context, id string) error
GetAll(ctx context.Context) ([]dto.PermissionsResponse, error)
}
type permissionsService struct {
repo repository.PermissionsRepository
db *gorm.DB
}
func (s *permissionsService) Create(ctx context.Context, req dto.PermissionsCreateRequest) (dto.PermissionsResponse, error) {
menuID, err := uuid.Parse(req.MenuID)
if err != nil {
return dto.PermissionsResponse{}, err
}
entity := entities.M_Permissions{
Name: req.Name,
MenuID: menuID,
}
created, err := s.repo.Create(ctx, s.db, entity)
if err != nil {
return dto.PermissionsResponse{}, err
}
// Ambil ulang dengan preload agar relasi Menu terisi
createdWithMenu, err := s.repo.GetById(ctx, s.db, created.ID.String())
if err != nil {
return dto.PermissionsResponse{}, err
}
return toPermissionsResponse(createdWithMenu), nil
}
func (s *permissionsService) GetById(ctx context.Context, id string) (dto.PermissionsResponse, error) {
entity, err := s.repo.GetById(ctx, s.db, id)
if err != nil {
return dto.PermissionsResponse{}, err
}
return toPermissionsResponse(entity), nil
}
func (s *permissionsService) GetByName(ctx context.Context, name string) (dto.PermissionsResponse, error) {
entity, err := s.repo.GetByName(ctx, s.db, name)
if err != nil {
return dto.PermissionsResponse{}, err
}
return toPermissionsResponse(entity), nil
}
func (s *permissionsService) Update(ctx context.Context, id string, req dto.PermissionsUpdateRequest) (dto.PermissionsResponse, error) {
existing, err := s.repo.GetById(ctx, s.db, id)
if err != nil {
return dto.PermissionsResponse{}, dto.ErrGetPermissionsById
}
if req.Name != "" {
existing.Name = req.Name
}
if req.MenuID != "" {
menuID, err := uuid.Parse(req.MenuID)
if err != nil {
return dto.PermissionsResponse{}, err
}
existing.MenuID = menuID
}
updated, err := s.repo.Update(ctx, s.db, existing)
if err != nil {
return dto.PermissionsResponse{}, err
}
return toPermissionsResponse(updated), nil
}
func (s *permissionsService) Delete(ctx context.Context, id string) error {
return s.repo.Delete(ctx, s.db, id)
}
func (s *permissionsService) GetAll(ctx context.Context) ([]dto.PermissionsResponse, error) {
entities, err := s.repo.GetAll(ctx, s.db)
if err != nil {
return nil, err
}
var res []dto.PermissionsResponse
for _, e := range entities {
res = append(res, toPermissionsResponse(e))
}
return res, nil
}
func NewPermissionsService(repo repository.PermissionsRepository, db *gorm.DB) PermissionsService {
return &permissionsService{repo: repo, db: db}
}
func toPermissionsResponse(e entities.M_Permissions) dto.PermissionsResponse {
return dto.PermissionsResponse{
ID: e.ID.String(),
Name: e.Name,
Menu: dto.Menu{
ID: e.Menu.ID.String(),
Name: e.Menu.Name,
},
}
}