ldap-1-backend/service/isql/api_isql.go

192 lines
5.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package isql
import (
"errors"
"fmt"
"strings"
"github.com/eryajf/go-ldap-admin/model"
"github.com/eryajf/go-ldap-admin/public/common"
"github.com/eryajf/go-ldap-admin/public/tools"
"github.com/eryajf/go-ldap-admin/svc/request"
"gorm.io/gorm"
)
type ApiService struct{}
// List 获取数据列表
func (s ApiService) List(req *request.ApiListReq) ([]*model.Api, error) {
var list []*model.Api
db := common.DB.Model(&model.Api{}).Order("created_at DESC")
method := strings.TrimSpace(req.Method)
if method != "" {
db = db.Where("method LIKE ?", fmt.Sprintf("%%%s%%", method))
}
path := strings.TrimSpace(req.Path)
if path != "" {
db = db.Where("path LIKE ?", fmt.Sprintf("%%%s%%", path))
}
category := strings.TrimSpace(req.Category)
if category != "" {
db = db.Where("category LIKE ?", fmt.Sprintf("%%%s%%", category))
}
creator := strings.TrimSpace(req.Creator)
if creator != "" {
db = db.Where("creator LIKE ?", fmt.Sprintf("%%%s%%", creator))
}
pageReq := tools.NewPageOption(req.PageNum, req.PageSize)
err := db.Offset(pageReq.PageNum).Limit(pageReq.PageSize).Find(&list).Error
return list, err
}
// List 获取数据列表
func (s ApiService) ListAll() (list []*model.Api, err error) {
err = common.DB.Model(&model.Api{}).Order("created_at DESC").Find(&list).Error
return list, err
}
// Count 获取数据总数
func (s ApiService) Count() (int64, error) {
var count int64
err := common.DB.Model(&model.Api{}).Count(&count).Error
return count, err
}
// Add 添加资源
func (s ApiService) Add(api *model.Api) error {
return common.DB.Create(api).Error
}
// Update 更新资源
func (s ApiService) Update(api *model.Api) error {
// 根据id获取接口信息
var oldApi model.Api
err := common.DB.First(&oldApi, api.ID).Error
if err != nil {
return errors.New("根据接口ID获取接口信息失败")
}
err = common.DB.Model(api).Where("id = ?", api.ID).Updates(api).Error
if err != nil {
return err
}
// 更新了method和path就更新casbin中policy
if oldApi.Path != api.Path || oldApi.Method != api.Method {
policies := common.CasbinEnforcer.GetFilteredPolicy(1, oldApi.Path, oldApi.Method)
// 接口在casbin的policy中存在才进行操作
if len(policies) > 0 {
// 先删除
isRemoved, _ := common.CasbinEnforcer.RemovePolicies(policies)
if !isRemoved {
return errors.New("更新权限接口失败")
}
for _, policy := range policies {
policy[1] = api.Path
policy[2] = api.Method
}
// 新增
isAdded, _ := common.CasbinEnforcer.AddPolicies(policies)
if !isAdded {
return errors.New("更新权限接口失败")
}
// 加载policy
err := common.CasbinEnforcer.LoadPolicy()
if err != nil {
return errors.New("更新权限接口成功,权限接口策略加载失败")
} else {
return err
}
}
}
return err
}
// Find 获取单个资源
func (s ApiService) Find(filter map[string]interface{}, data *model.Api) error {
return common.DB.Where(filter).First(&data).Error
}
// Exist 判断资源是否存在
func (s ApiService) Exist(filter map[string]interface{}) bool {
var dataObj model.Api
err := common.DB.Debug().Order("created_at DESC").Where(filter).First(&dataObj).Error
return !errors.Is(err, gorm.ErrRecordNotFound)
}
// Delete 批量删除
func (s ApiService) Delete(ids []uint) error {
var apis []model.Api
for _, id := range ids {
// 根据ID获取用户
api := new(model.Api)
err := s.Find(tools.H{"id": id}, api)
if err != nil {
return errors.New(fmt.Sprintf("未获取到ID为%d的用户", id))
}
apis = append(apis, *api)
}
err := common.DB.Where("id IN (?)", ids).Unscoped().Delete(&model.Api{}).Error
// 如果删除成功删除casbin中policy
if err == nil {
for _, api := range apis {
policies := common.CasbinEnforcer.GetFilteredPolicy(1, api.Path, api.Method)
if len(policies) > 0 {
isRemoved, _ := common.CasbinEnforcer.RemovePolicies(policies)
if !isRemoved {
return errors.New("删除权限接口失败")
}
}
}
// 重新加载策略
err := common.CasbinEnforcer.LoadPolicy()
if err != nil {
return errors.New("删除权限接口成功,权限接口策略加载失败")
} else {
return err
}
}
return err
}
// // GetApiTree 获取接口树(按接口Category字段分类)
// func (s ApiService) GetApiTree() ([]*response.ApiTreeDto, error) {
// var apiList []*model.Api
// err := common.DB.Order("category").Order("created_at").Find(&apiList).Error
// // 获取所有的分类
// var categoryList []string
// for _, api := range apiList {
// categoryList = append(categoryList, api.Category)
// }
// // 获取去重后的分类
// categoryUniq := funk.UniqString(categoryList)
// apiTree := make([]*response.ApiTreeDto, len(categoryUniq))
// for i, category := range categoryUniq {
// apiTree[i] = &response.ApiTreeDto{
// ID: -i,
// Desc: category,
// Category: category,
// Children: nil,
// }
// for _, api := range apiList {
// if category == api.Category {
// apiTree[i].Children = append(apiTree[i].Children, api)
// }
// }
// }
// return apiTree, err
// }
// GetApisById 根据接口ID获取接口列表
func (s ApiService) GetApisById(apiIds []uint) ([]*model.Api, error) {
var apis []*model.Api
err := common.DB.Where("id IN (?)", apiIds).Find(&apis).Error
return apis, err
}