sys_api.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package system
  2. import (
  3. "errors"
  4. "fmt"
  5. "server/global"
  6. "server/model/common/request"
  7. "server/model/system"
  8. "gorm.io/gorm"
  9. )
  10. //@author: [piexlmax](https://github.com/piexlmax)
  11. //@function: CreateApi
  12. //@description: 新增基础api
  13. //@param: api model.SysApi
  14. //@return: err error
  15. type ApiService struct{}
  16. var ApiServiceApp = new(ApiService)
  17. func (apiService *ApiService) CreateApi(api system.SysApi) (err error) {
  18. if !errors.Is(global.GVA_DB.Where("path = ? AND method = ?", api.Path, api.Method).First(&system.SysApi{}).Error, gorm.ErrRecordNotFound) {
  19. return errors.New("存在相同api")
  20. }
  21. return global.GVA_DB.Create(&api).Error
  22. }
  23. //@author: [piexlmax](https://github.com/piexlmax)
  24. //@function: DeleteApi
  25. //@description: 删除基础api
  26. //@param: api model.SysApi
  27. //@return: err error
  28. func (apiService *ApiService) DeleteApi(api system.SysApi) (err error) {
  29. var entity system.SysApi
  30. err = global.GVA_DB.First(&entity, "id = ?", api.ID).Error // 根据id查询api记录
  31. if errors.Is(err, gorm.ErrRecordNotFound) { // api记录不存在
  32. return err
  33. }
  34. err = global.GVA_DB.Delete(&entity).Error
  35. if err != nil {
  36. return err
  37. }
  38. CasbinServiceApp.ClearCasbin(1, entity.Path, entity.Method)
  39. if err != nil {
  40. return err
  41. }
  42. return nil
  43. }
  44. //@author: [piexlmax](https://github.com/piexlmax)
  45. //@function: GetAPIInfoList
  46. //@description: 分页获取数据,
  47. //@param: api model.SysApi, info request.PageInfo, order string, desc bool
  48. //@return: list interface{}, total int64, err error
  49. func (apiService *ApiService) GetAPIInfoList(api system.SysApi, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
  50. limit := info.PageSize
  51. offset := info.PageSize * (info.Page - 1)
  52. db := global.GVA_DB.Model(&system.SysApi{})
  53. var apiList []system.SysApi
  54. if api.Path != "" {
  55. db = db.Where("path LIKE ?", "%"+api.Path+"%")
  56. }
  57. if api.Description != "" {
  58. db = db.Where("description LIKE ?", "%"+api.Description+"%")
  59. }
  60. if api.Method != "" {
  61. db = db.Where("method = ?", api.Method)
  62. }
  63. if api.ApiGroup != "" {
  64. db = db.Where("api_group = ?", api.ApiGroup)
  65. }
  66. err = db.Count(&total).Error
  67. if err != nil {
  68. return apiList, total, err
  69. }
  70. db = db.Limit(limit).Offset(offset)
  71. OrderStr := "id desc"
  72. if order != "" {
  73. orderMap := make(map[string]bool, 5)
  74. orderMap["id"] = true
  75. orderMap["path"] = true
  76. orderMap["api_group"] = true
  77. orderMap["description"] = true
  78. orderMap["method"] = true
  79. if !orderMap[order] {
  80. err = fmt.Errorf("非法的排序字段: %v", order)
  81. return apiList, total, err
  82. }
  83. OrderStr = order
  84. if desc {
  85. OrderStr = order + " desc"
  86. }
  87. }
  88. err = db.Order(OrderStr).Find(&apiList).Error
  89. return apiList, total, err
  90. }
  91. //@author: [piexlmax](https://github.com/piexlmax)
  92. //@function: GetAllApis
  93. //@description: 获取所有的api
  94. //@return: apis []model.SysApi, err error
  95. func (apiService *ApiService) GetAllApis() (apis []system.SysApi, err error) {
  96. err = global.GVA_DB.Find(&apis).Error
  97. return
  98. }
  99. //@author: [piexlmax](https://github.com/piexlmax)
  100. //@function: GetApiById
  101. //@description: 根据id获取api
  102. //@param: id float64
  103. //@return: api model.SysApi, err error
  104. func (apiService *ApiService) GetApiById(id int) (api system.SysApi, err error) {
  105. err = global.GVA_DB.First(&api, "id = ?", id).Error
  106. return
  107. }
  108. //@author: [piexlmax](https://github.com/piexlmax)
  109. //@function: UpdateApi
  110. //@description: 根据id更新api
  111. //@param: api model.SysApi
  112. //@return: err error
  113. func (apiService *ApiService) UpdateApi(api system.SysApi) (err error) {
  114. var oldA system.SysApi
  115. err = global.GVA_DB.First(&oldA, "id = ?", api.ID).Error
  116. if oldA.Path != api.Path || oldA.Method != api.Method {
  117. var duplicateApi system.SysApi
  118. if err := global.GVA_DB.First(&duplicateApi, "path = ? AND method = ?", api.Path, api.Method).Error; err != nil {
  119. if !errors.Is(err, gorm.ErrRecordNotFound) {
  120. return err
  121. }
  122. }
  123. if duplicateApi.ID != api.ID {
  124. return errors.New("存在相同api路径")
  125. }
  126. }
  127. if err != nil {
  128. return err
  129. }
  130. err = CasbinServiceApp.UpdateCasbinApi(oldA.Path, api.Path, oldA.Method, api.Method)
  131. if err != nil {
  132. return err
  133. }
  134. return global.GVA_DB.Save(&api).Error
  135. }
  136. //@author: [piexlmax](https://github.com/piexlmax)
  137. //@function: DeleteApis
  138. //@description: 删除选中API
  139. //@param: apis []model.SysApi
  140. //@return: err error
  141. func (apiService *ApiService) DeleteApisByIds(ids request.IdsReq) (err error) {
  142. return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  143. var apis []system.SysApi
  144. err = tx.Find(&apis, "id in ?", ids.Ids).Error
  145. if err != nil {
  146. return err
  147. }
  148. err = tx.Delete(&[]system.SysApi{}, "id in ?", ids.Ids).Error
  149. if err != nil {
  150. return err
  151. }
  152. for _, sysApi := range apis {
  153. CasbinServiceApp.ClearCasbin(1, sysApi.Path, sysApi.Method)
  154. }
  155. return err
  156. })
  157. }