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, }, } }