busniess-user-center/internal/service/organization/organization.go

143 lines
3.6 KiB
Go

package organization
import (
"busniess-user-center/config"
orgModel "busniess-user-center/internal/models/organization"
"busniess-user-center/internal/repo"
"busniess-user-center/pkg/redis"
"context"
"fmt"
"github.com/jinzhu/copier"
"github.com/samber/do"
"go.uber.org/zap"
"gorm.io/gorm"
)
func init() {
do.Provide(nil, NewOrganizationService)
}
type organizationService struct {
logger *zap.SugaredLogger
orgRepo repo.OrganizationRepo
redis *redis.Redis
conf *config.AppConfig
}
func NewOrganizationService(i *do.Injector) (OrganizationService, error) {
return &organizationService{
logger: do.MustInvoke[*zap.SugaredLogger](i),
orgRepo: do.MustInvoke[repo.OrganizationRepo](i),
redis: do.MustInvoke[*redis.Redis](i),
conf: do.MustInvoke[*config.AppConfig](i),
}, nil
}
func (o *organizationService) CreateOrganization(ctx context.Context, info *orgModel.CreateOrgReq) error {
if info.ParentId > 0 {
if exist, err := o.orgRepo.ExistOrgId(ctx, info.ParentId); err != nil {
return err
} else if !exist {
return fmt.Errorf("父组织%d不存在", info.ParentId)
}
}
dbOrg := repo.Organization{
Name: info.Name,
ParentID: info.ParentId,
Sort: uint(info.Sort),
Status: int(repo.OrganizationEnableStatus),
}
_, err := o.orgRepo.Create(ctx, dbOrg)
return err
}
func (o *organizationService) SaveOrganization(ctx context.Context, info *orgModel.SaveOrgReq) error {
dbOrg, err := o.orgRepo.GetById(ctx, info.Id)
if err != nil && err != gorm.ErrRecordNotFound {
return err
}
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("组织不存在")
}
dbOrg.Name = info.Name
err = o.orgRepo.Save(ctx, dbOrg)
return err
}
func (o *organizationService) DelOrganization(ctx context.Context, info *orgModel.DelOrgReq) error {
// todo 判断权限
// todo 判断组织下面有没有成员
// todo 删除组织授权和相应的用户
return o.orgRepo.DelById(ctx, info.Id)
}
func (o *organizationService) Organization(ctx context.Context, info *orgModel.GetOrgReq) (org orgModel.Organization, err error) {
dbOrg, err := o.orgRepo.GetById(ctx, info.Id)
if err != nil && err != gorm.ErrRecordNotFound {
return
}
if err != gorm.ErrRecordNotFound {
err = fmt.Errorf("组织不存在")
return
}
copier.Copy(org, dbOrg)
return
}
func (o *organizationService) MoveOrganization(ctx context.Context, info *orgModel.MoveOrgReq) error {
// todo 判断权限
dbOrg, err := o.orgRepo.GetById(ctx, info.Id)
if err != nil && err != gorm.ErrRecordNotFound {
return err
}
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("组织%d不存在", info.Id)
}
if dbOrg.ID == info.DestId || dbOrg.ParentID == info.DestId {
return nil
}
_, err = o.orgRepo.GetById(ctx, info.DestId)
if err != nil && err != gorm.ErrRecordNotFound {
return err
}
if err != gorm.ErrRecordNotFound {
return fmt.Errorf("目标组织%d不存在", info.DestId)
}
dbOrg.ParentID = info.DestId
return o.orgRepo.Save(ctx, dbOrg)
}
func (o *organizationService) OrganizationTree(ctx context.Context) (orgModel.OrgTree, error) {
dbOrgs, err := o.orgRepo.GetOrgs(ctx)
if err != nil {
return nil, err
}
tree := getOrgTree(dbOrgs)
return tree, nil
}
func (o *organizationService) DisableOrganization(ctx context.Context, info *orgModel.DisableOrgReq) error {
// todo 判断有没有权限
// 判断是否成员
return o.orgRepo.SetStatus(ctx, info.Id, repo.OrganizationDisableStatus)
}
func (o *organizationService) EnableOrganization(ctx context.Context, info *orgModel.EnableOrgReq) error {
// todo 判断有没有权限
return o.orgRepo.SetStatus(ctx, info.Id, repo.OrganizationEnableStatus)
}