template-monorepo/internal/model/permission/usecase/permission_usecase.go

111 lines
2.9 KiB
Go

// Package usecase implements the permission module's domain interfaces.
// Use NewModuleFromParam (module.go) to wire all seven usecases against a
// shared Mongo + Redis backend.
package usecase
import (
"context"
"gateway/internal/model/permission/domain/entity"
"gateway/internal/model/permission/domain/enum"
domrepo "gateway/internal/model/permission/domain/repository"
dom "gateway/internal/model/permission/domain/usecase"
)
// PermissionUseCaseParam injects the catalog repository.
type PermissionUseCaseParam struct {
Permissions domrepo.PermissionRepository
}
type permissionUseCase struct {
repo domrepo.PermissionRepository
}
// NewPermissionUseCase returns the catalog-facing usecase.
func NewPermissionUseCase(param PermissionUseCaseParam) dom.PermissionUseCase {
return &permissionUseCase{repo: param.Permissions}
}
func (uc *permissionUseCase) GetCatalogTree(
ctx context.Context,
query *dom.CatalogQuery,
) ([]*dom.PermissionTreeNode, error) {
perms, err := uc.repo.GetAll(ctx, nil)
if err != nil {
return nil, wrapRepoErr(err)
}
tree := buildPermissionTree(perms)
if query == nil {
return tree, nil
}
if query.OnlyOpen {
tree = filterOpenNodes(tree)
}
if query.Type != nil {
tree = filterByType(tree, *query.Type)
}
return tree, nil
}
func (uc *permissionUseCase) List(ctx context.Context, query *dom.CatalogQuery) ([]*entity.Permission, error) {
var status *enum.Status
if query != nil && query.OnlyOpen {
open := enum.StatusOpen
status = &open
}
perms, err := uc.repo.GetAll(ctx, status)
if err != nil {
return nil, wrapRepoErr(err)
}
if query != nil && query.Type != nil {
filtered := perms[:0]
for _, p := range perms {
if p.Type == *query.Type {
filtered = append(filtered, p)
}
}
perms = filtered
}
return perms, nil
}
func (uc *permissionUseCase) GetByID(ctx context.Context, id string) (*entity.Permission, error) {
perm, err := uc.repo.GetByID(ctx, id)
if err != nil {
return nil, wrapRepoErr(err)
}
return perm, nil
}
func (uc *permissionUseCase) GetByName(ctx context.Context, name string) (*entity.Permission, error) {
perm, err := uc.repo.GetByName(ctx, name)
if err != nil {
return nil, wrapRepoErr(err)
}
return perm, nil
}
func (uc *permissionUseCase) UpsertCatalog(ctx context.Context, perms []*entity.Permission) error {
for _, perm := range perms {
if perm.Status == "" {
perm.Status = enum.StatusOpen
}
if err := uc.repo.UpsertByName(ctx, perm); err != nil {
return wrapRepoErr(err, "upsert catalog")
}
}
return nil
}
func (uc *permissionUseCase) UpdateStatus(ctx context.Context, id string, status enum.Status) error {
if !status.IsValid() {
return errb.InputInvalidFormat("invalid status").WithCause(nil)
}
if err := uc.repo.UpdateStatus(ctx, id, status); err != nil {
return wrapRepoErr(err, "update status")
}
return nil
}
var _ dom.PermissionUseCase = (*permissionUseCase)(nil)