111 lines
2.9 KiB
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)
|