272 lines
8.2 KiB
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": "设置成功"})
|
|
}
|