roles_controllers.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. package controllers
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. "xugu_license/internal/global"
  7. middlewares "xugu_license/internal/middleware"
  8. "xugu_license/internal/models"
  9. "github.com/gin-gonic/gin"
  10. )
  11. func InitRolesCache() error {
  12. return refreshRolesCache()
  13. }
  14. // 获取角色信息,如果请求角色名为空则查询所有角色
  15. func GetRoles(c *gin.Context) {
  16. var newRole struct {
  17. Name string `json:"name" binding:"required"`
  18. }
  19. if err := c.ShouldBindJSON(&newRole); err != nil {
  20. global.Logger.Errorln("解析请求失败 ", err.Error())
  21. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("解析请求失败: ", err.Error())})
  22. return
  23. }
  24. if newRole.Name != " " {
  25. if role, exists :=
  26. middlewares.Roles[newRole.Name]; exists {
  27. c.JSON(http.StatusOK, gin.H{"message": "ok", "data": role})
  28. return
  29. }
  30. c.JSON(http.StatusNotFound, gin.H{"error": "未找到该角色"})
  31. return
  32. } else {
  33. c.JSON(http.StatusOK, gin.H{"message": "ok", "data": middlewares.Roles})
  34. return
  35. }
  36. }
  37. // 刷新角色缓存
  38. func refreshRolesCache() error {
  39. rIS, err := models.GetRoleInfo("")
  40. if err != nil {
  41. return err
  42. }
  43. fmt.Println("rIS", rIS)
  44. var rolesTmp = map[string]middlewares.Role{
  45. "admin": middlewares.AdminRole,
  46. "supportRole": middlewares.SupportRole,
  47. "guest": middlewares.GuestRole,
  48. }
  49. for _, role := range rIS {
  50. result := strings.Split(role.Permissions, ",")
  51. Perm, err := middlewares.StringsToPermissions(result)
  52. if err != nil {
  53. global.Logger.Errorln(" 将字符串数组转换为 Permission 数组失败 ", err.Error())
  54. return err
  55. }
  56. rolesTmp[role.Name] = middlewares.Role{
  57. Id: role.Id,
  58. Name: role.Name,
  59. Permissions: Perm,
  60. }
  61. }
  62. middlewares.Roles = rolesTmp
  63. return nil
  64. }
  65. func CreateRole(c *gin.Context) {
  66. var newRole struct {
  67. Name string `json:"name" binding:"required"`
  68. Permissions []middlewares.Permission `json:"permissions"`
  69. }
  70. if err := c.ShouldBindJSON(&newRole); err != nil {
  71. global.Logger.Errorln("解析请求失败 ", err.Error())
  72. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("解析请求失败: ", err.Error())})
  73. return
  74. }
  75. if newRole.Name == "" || newRole.Permissions == nil {
  76. c.JSON(http.StatusBadRequest, gin.H{"error": "角色名称或权限不能为空"})
  77. return
  78. }
  79. //检测角色是否已经存在
  80. roleTmp, err := models.GetRoleInfo(newRole.Name)
  81. if err != nil {
  82. global.Logger.Errorln("查询角色失败 ", err.Error())
  83. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  84. return
  85. }
  86. if roleTmp != nil {
  87. c.JSON(http.StatusBadRequest, gin.H{"error": "角色已存在"})
  88. return
  89. }
  90. result := strings.Trim(fmt.Sprint(newRole.Permissions), "[]")
  91. result = strings.ReplaceAll(result, " ", ",")
  92. err = models.CreateRole(&models.RoleInfo{
  93. Name: newRole.Name,
  94. Permissions: result,
  95. })
  96. if err != nil {
  97. global.Logger.Errorln("创建角色失败 ", err.Error())
  98. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("创建角色失败: ", err.Error())})
  99. return
  100. }
  101. // if _, exists := roles[newRole.Name]; exists {
  102. // c.JSON(http.StatusConflict, gin.H{"error": "role already exists"})
  103. // return
  104. // }
  105. // roles[newRole.Name] = middlewares.Role{
  106. // Name: newRole.Name,
  107. // Permissions: newRole.Permissions,
  108. // }
  109. //刷新角色缓存
  110. err = refreshRolesCache()
  111. if err != nil {
  112. global.Logger.Errorln("刷新角色缓存 %s", err.Error())
  113. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("刷新角色缓存: ", err.Error())})
  114. }
  115. // fmt.Printf("roles: %#v\n",
  116. // middlewares.Roles)
  117. c.JSON(http.StatusOK, gin.H{"success": true, "message": "Role created successfully"})
  118. }
  119. func UpdateRole(c *gin.Context) {
  120. var updateRole struct {
  121. Id int `json:"id" binding:"required"`
  122. Name string `json:"name" binding:"required"`
  123. Permissions []string `json:"permissions" binding:"required"`
  124. }
  125. if err := c.ShouldBindJSON(&updateRole); err != nil {
  126. global.Logger.Errorln("解析请求失败 ", err.Error())
  127. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("解析请求失败: ", err.Error())})
  128. return
  129. }
  130. result := strings.Trim(fmt.Sprint(updateRole.Permissions), "[]")
  131. result = strings.ReplaceAll(result, " ", ",")
  132. err := models.UpdateRole(&models.RoleInfo{
  133. Id: updateRole.Id,
  134. Name: updateRole.Name,
  135. Permissions: result,
  136. })
  137. if err != nil {
  138. global.Logger.Errorln("更新角色失败 ", err.Error())
  139. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("更新角色失败: ", err.Error())})
  140. return
  141. }
  142. err = refreshRolesCache()
  143. if err != nil {
  144. global.Logger.Errorln("刷新角色缓存失败 ", err.Error())
  145. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("刷新角色缓存失败: ", err.Error())})
  146. }
  147. // fmt.Printf("roles: %#v\n",
  148. // middlewares.Roles)
  149. // role, exists := roles[updateRole.Name]
  150. // if !exists {
  151. // c.JSON(http.StatusNotFound, gin.H{"error": "role not found"})
  152. // return
  153. // }
  154. // role.Permissions = updateRole.Permissions
  155. // roles[updateRole.Name] = role
  156. c.JSON(http.StatusOK, gin.H{"success": true, "message": "Role permissions updated successfully"})
  157. return
  158. }
  159. // 删除角色
  160. func DeleteRole(c *gin.Context) {
  161. var deleteRole struct {
  162. Name string `json:"name" binding:"required"`
  163. }
  164. if err := c.ShouldBindJSON(&deleteRole); err != nil {
  165. global.Logger.Errorln("解析请求失败 ", err.Error())
  166. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("解析请求失败: ", err.Error())})
  167. return
  168. }
  169. // if _, exists := roles[deleteRole.Name]; !exists {
  170. // c.JSON(http.StatusNotFound, gin.H{"error": "role not found"})
  171. // return
  172. // }
  173. // 防止删除 admin 角色
  174. if deleteRole.Name == "admin" {
  175. global.Logger.Errorln("禁止删除admin ")
  176. c.JSON(http.StatusForbidden, gin.H{"error": "禁止删除admin角色"})
  177. return
  178. }
  179. err := models.DeleteRole(deleteRole.Name)
  180. if err != nil {
  181. global.Logger.Errorln("数据库删除角色失败 ", err.Error())
  182. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("数据库删除角色失败: ", err.Error())})
  183. return
  184. }
  185. //delete(roles, deleteRole.Name)
  186. err = refreshRolesCache()
  187. if err != nil {
  188. global.Logger.Errorln("刷新角色失败 ", err.Error())
  189. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("刷新角色失败: ", err.Error())})
  190. }
  191. // fmt.Printf("roles: %#v\n",
  192. // middlewares.Roles)
  193. c.JSON(http.StatusOK, gin.H{"success": true, "message": "Role deleted successfully"})
  194. }
  195. func GetRoleNames(c *gin.Context) {
  196. names := make([]string, 0, len(
  197. middlewares.Roles))
  198. for name := range middlewares.Roles {
  199. names = append(names, name)
  200. }
  201. c.JSON(http.StatusOK, gin.H{"roles": names})
  202. }