116 lines
3.4 KiB
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,
|
|
},
|
|
}
|
|
}
|