kra/internal/service/system/authority.go

272 lines
8.2 KiB
Go

package system
import (
"context"
"kra/internal/biz/system"
"kra/internal/server/middleware"
"github.com/go-kratos/kratos/v2/errors"
"github.com/go-kratos/kratos/v2/transport/http"
)
// AuthorityService 角色服务
type AuthorityService struct {
uc *system.AuthorityUsecase
casbin system.CasbinRepo
}
// NewAuthorityService 创建角色服务
func NewAuthorityService(uc *system.AuthorityUsecase, casbin system.CasbinRepo) *AuthorityService {
return &AuthorityService{
uc: uc,
casbin: casbin,
}
}
// AuthorityInfo 角色信息
type AuthorityFullInfo struct {
AuthorityId uint `json:"authorityId"`
AuthorityName string `json:"authorityName"`
ParentId *uint `json:"parentId,omitempty"`
DefaultRouter string `json:"defaultRouter"`
DataAuthorityId []*AuthorityInfo `json:"dataAuthorityId,omitempty"`
Children []*AuthorityFullInfo `json:"children,omitempty"`
}
// CreateAuthorityRequest 创建角色请求
type CreateAuthorityRequest struct {
AuthorityId uint `json:"authorityId"`
AuthorityName string `json:"authorityName"`
ParentId uint `json:"parentId"`
DefaultRouter string `json:"defaultRouter"`
}
// CreateAuthority 创建角色
func (s *AuthorityService) CreateAuthority(ctx context.Context, req *CreateAuthorityRequest) (*AuthorityFullInfo, error) {
auth := &system.Authority{
AuthorityId: req.AuthorityId,
AuthorityName: req.AuthorityName,
DefaultRouter: req.DefaultRouter,
}
if req.ParentId != 0 {
auth.ParentId = &req.ParentId
}
result, err := s.uc.CreateAuthority(ctx, auth)
if err != nil {
return nil, err
}
// 刷新Casbin
_ = s.casbin.FreshCasbin()
return toAuthorityFullInfo(result), nil
}
// CopyAuthorityRequest 复制角色请求
type CopyAuthorityRequest struct {
Authority CreateAuthorityRequest `json:"authority"`
OldAuthorityId uint `json:"oldAuthorityId"`
}
// CopyAuthority 复制角色
func (s *AuthorityService) CopyAuthority(ctx context.Context, adminAuthorityID uint, req *CopyAuthorityRequest) (*AuthorityFullInfo, error) {
newAuth := &system.Authority{
AuthorityId: req.Authority.AuthorityId,
AuthorityName: req.Authority.AuthorityName,
DefaultRouter: req.Authority.DefaultRouter,
}
if req.Authority.ParentId != 0 {
newAuth.ParentId = &req.Authority.ParentId
}
result, err := s.uc.CopyAuthority(ctx, adminAuthorityID, req.OldAuthorityId, newAuth)
if err != nil {
return nil, err
}
return toAuthorityFullInfo(result), nil
}
// UpdateAuthorityRequest 更新角色请求
type UpdateAuthorityRequest struct {
AuthorityId uint `json:"authorityId"`
AuthorityName string `json:"authorityName"`
ParentId uint `json:"parentId"`
DefaultRouter string `json:"defaultRouter"`
}
// UpdateAuthority 更新角色
func (s *AuthorityService) UpdateAuthority(ctx context.Context, req *UpdateAuthorityRequest) (*AuthorityFullInfo, error) {
auth := &system.Authority{
AuthorityId: req.AuthorityId,
AuthorityName: req.AuthorityName,
DefaultRouter: req.DefaultRouter,
}
if req.ParentId != 0 {
auth.ParentId = &req.ParentId
}
result, err := s.uc.UpdateAuthority(ctx, auth)
if err != nil {
return nil, err
}
return toAuthorityFullInfo(result), nil
}
// DeleteAuthority 删除角色
func (s *AuthorityService) DeleteAuthority(ctx context.Context, authorityId uint) error {
if err := s.uc.DeleteAuthority(ctx, authorityId); err != nil {
return err
}
// 刷新Casbin
_ = s.casbin.FreshCasbin()
return nil
}
// GetAuthorityList 获取角色列表
func (s *AuthorityService) GetAuthorityList(ctx context.Context, authorityId uint) ([]*AuthorityFullInfo, error) {
list, err := s.uc.GetAuthorityInfoList(ctx, authorityId)
if err != nil {
return nil, err
}
return toAuthorityFullInfoList(list), nil
}
// SetDataAuthorityRequest 设置角色资源权限请求
type SetDataAuthorityRequest struct {
AuthorityId uint `json:"authorityId"`
DataAuthorityIds []uint `json:"dataAuthorityId"`
}
// SetDataAuthority 设置角色资源权限
func (s *AuthorityService) SetDataAuthority(ctx context.Context, adminAuthorityID uint, req *SetDataAuthorityRequest) error {
return s.uc.SetDataAuthority(ctx, adminAuthorityID, req.AuthorityId, req.DataAuthorityIds)
}
// 转换函数
func toAuthorityFullInfo(auth *system.Authority) *AuthorityFullInfo {
info := &AuthorityFullInfo{
AuthorityId: auth.AuthorityId,
AuthorityName: auth.AuthorityName,
ParentId: auth.ParentId,
DefaultRouter: auth.DefaultRouter,
}
return info
}
func toAuthorityFullInfoList(list []*system.AuthorityFull) []*AuthorityFullInfo {
result := make([]*AuthorityFullInfo, len(list))
for i, auth := range list {
result[i] = &AuthorityFullInfo{
AuthorityId: auth.AuthorityId,
AuthorityName: auth.AuthorityName,
ParentId: auth.ParentId,
DefaultRouter: auth.DefaultRouter,
Children: toAuthorityFullInfoList(auth.Children),
}
// DataAuthorityId
if len(auth.DataAuthorityId) > 0 {
result[i].DataAuthorityId = make([]*AuthorityInfo, len(auth.DataAuthorityId))
for j, da := range auth.DataAuthorityId {
result[i].DataAuthorityId[j] = &AuthorityInfo{
AuthorityId: da.AuthorityId,
AuthorityName: da.AuthorityName,
ParentId: da.ParentId,
DefaultRouter: da.DefaultRouter,
}
}
}
}
return result
}
// RegisterRoutes 注册路由
func (s *AuthorityService) RegisterRoutes(srv *http.Server) {
r := srv.Route("/")
r.POST("/authority/createAuthority", s.handleCreateAuthority)
r.POST("/authority/copyAuthority", s.handleCopyAuthority)
r.PUT("/authority/updateAuthority", s.handleUpdateAuthority)
r.POST("/authority/deleteAuthority", s.handleDeleteAuthority)
r.POST("/authority/getAuthorityList", s.handleGetAuthorityList)
r.POST("/authority/setDataAuthority", s.handleSetDataAuthority)
}
// HTTP Handlers
func (s *AuthorityService) handleCreateAuthority(ctx http.Context) error {
var req CreateAuthorityRequest
if err := ctx.Bind(&req); err != nil {
return err
}
resp, err := s.CreateAuthority(ctx, &req)
if err != nil {
return errors.BadRequest("CREATE_FAILED", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "创建成功", "data": map[string]any{"authority": resp}})
}
func (s *AuthorityService) handleCopyAuthority(ctx http.Context) error {
var req CopyAuthorityRequest
if err := ctx.Bind(&req); err != nil {
return err
}
adminAuthorityID := middleware.GetAuthorityID(ctx)
resp, err := s.CopyAuthority(ctx, adminAuthorityID, &req)
if err != nil {
return errors.BadRequest("COPY_FAILED", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "复制成功", "data": map[string]any{"authority": resp}})
}
func (s *AuthorityService) handleUpdateAuthority(ctx http.Context) error {
var req UpdateAuthorityRequest
if err := ctx.Bind(&req); err != nil {
return err
}
resp, err := s.UpdateAuthority(ctx, &req)
if err != nil {
return errors.BadRequest("UPDATE_FAILED", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "更新成功", "data": map[string]any{"authority": resp}})
}
func (s *AuthorityService) handleDeleteAuthority(ctx http.Context) error {
var req struct {
AuthorityId uint `json:"authorityId"`
}
if err := ctx.Bind(&req); err != nil {
return err
}
if err := s.DeleteAuthority(ctx, req.AuthorityId); err != nil {
return errors.BadRequest("DELETE_FAILED", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "删除成功"})
}
func (s *AuthorityService) handleGetAuthorityList(ctx http.Context) error {
authorityId := middleware.GetAuthorityID(ctx)
resp, err := s.GetAuthorityList(ctx, authorityId)
if err != nil {
return errors.InternalServer("LIST_ERROR", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "获取成功", "data": map[string]any{"list": resp}})
}
func (s *AuthorityService) handleSetDataAuthority(ctx http.Context) error {
var req SetDataAuthorityRequest
if err := ctx.Bind(&req); err != nil {
return err
}
adminAuthorityID := middleware.GetAuthorityID(ctx)
if err := s.SetDataAuthority(ctx, adminAuthorityID, &req); err != nil {
return errors.BadRequest("SET_FAILED", err.Error())
}
return ctx.Result(200, map[string]any{"code": 0, "msg": "设置成功"})
}