Files
NianAIGC/backend/internal/administration/organizations.go

83 lines
2.7 KiB
Go

package administration
import (
"context"
"strings"
)
func (s *Service) ListOrganizations(ctx context.Context, actor Actor) ([]OrganizationProjection, error) {
include := actor.Role == RoleSuperAdmin
if actor.Role != RoleSuperAdmin && actor.Role != RoleOrganizationAdmin {
return nil, problem(ErrorForbidden, "需要管理员权限。")
}
organizations, err := s.store.ListOrganizations(ctx, include)
if err != nil {
return nil, infrastructure("list organizations", err)
}
out := make([]OrganizationProjection, 0, len(organizations))
for _, org := range organizations {
if actor.Role == RoleSuperAdmin || org.ID == actor.OrganizationID {
out = append(out, ProjectOrganization(org))
}
}
return out, nil
}
func (s *Service) CreateOrganization(ctx context.Context, actor Actor, name string) (Organization, error) {
if err := requireSuper(actor); err != nil {
return Organization{}, err
}
name = strings.TrimSpace(name)
if name == "" {
return Organization{}, problem(ErrorValidation, "组织名称不能为空。")
}
now := s.now()
id := s.id("org")
org := Organization{ID: id, Name: name, Status: StatusActive, ArchiveOwnerID: "archive:" + id, CreatedAt: now, UpdatedAt: now}
created, err := s.store.CreateOrganization(ctx, org)
return created, infrastructure("create organization", err)
}
func (s *Service) UpdateOrganization(ctx context.Context, actor Actor, id string, patch UpdateOrganizationInput) (Organization, error) {
if err := requireSuper(actor); err != nil {
return Organization{}, err
}
current, found, err := s.store.GetOrganization(ctx, id)
if err != nil {
return Organization{}, infrastructure("get organization", err)
}
if !found {
return Organization{}, problem(ErrorNotFound, "组织不存在。")
}
if patch.Name != nil {
name := strings.TrimSpace(*patch.Name)
if name == "" {
return Organization{}, problem(ErrorValidation, "组织名称不能为空。")
}
current.Name = name
}
if patch.Status != nil {
if !validStatus(*patch.Status) {
return Organization{}, problem(ErrorValidation, "组织状态不正确。")
}
current.Status = *patch.Status
}
current.UpdatedAt = s.now()
updated, err := s.store.UpdateOrganization(ctx, current)
return updated, infrastructure("update organization", err)
}
func (s *Service) DeleteOrganization(ctx context.Context, actor Actor, id string) error {
if err := requireSuper(actor); err != nil {
return err
}
count, err := s.store.CountOrganizationMembers(ctx, id)
if err != nil {
return infrastructure("count organization members", err)
}
if count > 0 {
return problem(ErrorConflict, "组织仍有账号,不能删除。")
}
if err := s.store.DeleteOrganization(ctx, id); err != nil {
return infrastructure("delete organization", err)
}
return nil
}