roles_controllers.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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. //检测角色是否已经存在
  76. roleTmp, err := models.GetRoleInfo(newRole.Name)
  77. if err != nil {
  78. global.Logger.Errorln("查询角色失败 ", err.Error())
  79. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  80. return
  81. }
  82. if roleTmp != nil {
  83. c.JSON(http.StatusBadRequest, gin.H{"error": "角色已存在"})
  84. return
  85. }
  86. result := strings.Trim(fmt.Sprint(newRole.Permissions), "[]")
  87. result = strings.ReplaceAll(result, " ", ",")
  88. err = models.CreateRole(&models.RoleInfo{
  89. Name: newRole.Name,
  90. Permissions: result,
  91. })
  92. if err != nil {
  93. global.Logger.Errorln("创建角色失败 ", err.Error())
  94. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("创建角色失败: ", err.Error())})
  95. return
  96. }
  97. // if _, exists := roles[newRole.Name]; exists {
  98. // c.JSON(http.StatusConflict, gin.H{"error": "role already exists"})
  99. // return
  100. // }
  101. // roles[newRole.Name] = middlewares.Role{
  102. // Name: newRole.Name,
  103. // Permissions: newRole.Permissions,
  104. // }
  105. //刷新角色缓存
  106. err = refreshRolesCache()
  107. if err != nil {
  108. global.Logger.Errorln("刷新角色缓存 %s", err.Error())
  109. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("刷新角色缓存: ", err.Error())})
  110. }
  111. // fmt.Printf("roles: %#v\n",
  112. // middlewares.Roles)
  113. c.JSON(http.StatusOK, gin.H{"success": true, "message": "Role created successfully"})
  114. }
  115. func UpdateRole(c *gin.Context) {
  116. var updateRole struct {
  117. Id int `json:"id" binding:"required"`
  118. Name string `json:"name" binding:"required"`
  119. Permissions []string `json:"permissions" binding:"required"`
  120. }
  121. if err := c.ShouldBindJSON(&updateRole); err != nil {
  122. global.Logger.Errorln("解析请求失败 ", err.Error())
  123. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("解析请求失败: ", err.Error())})
  124. return
  125. }
  126. result := strings.Trim(fmt.Sprint(updateRole.Permissions), "[]")
  127. result = strings.ReplaceAll(result, " ", ",")
  128. err := models.UpdateRole(&models.RoleInfo{
  129. Id: updateRole.Id,
  130. Name: updateRole.Name,
  131. Permissions: result,
  132. })
  133. if err != nil {
  134. global.Logger.Errorln("更新角色失败 ", err.Error())
  135. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("更新角色失败: ", err.Error())})
  136. return
  137. }
  138. err = refreshRolesCache()
  139. if err != nil {
  140. global.Logger.Errorln("刷新角色缓存失败 ", err.Error())
  141. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("刷新角色缓存失败: ", err.Error())})
  142. }
  143. // fmt.Printf("roles: %#v\n",
  144. // middlewares.Roles)
  145. // role, exists := roles[updateRole.Name]
  146. // if !exists {
  147. // c.JSON(http.StatusNotFound, gin.H{"error": "role not found"})
  148. // return
  149. // }
  150. // role.Permissions = updateRole.Permissions
  151. // roles[updateRole.Name] = role
  152. c.JSON(http.StatusOK, gin.H{"success": true, "message": "Role permissions updated successfully"})
  153. return
  154. }
  155. // 删除角色
  156. func DeleteRole(c *gin.Context) {
  157. var deleteRole struct {
  158. Name string `json:"name" binding:"required"`
  159. }
  160. if err := c.ShouldBindJSON(&deleteRole); err != nil {
  161. global.Logger.Errorln("解析请求失败 ", err.Error())
  162. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("解析请求失败: ", err.Error())})
  163. return
  164. }
  165. // if _, exists := roles[deleteRole.Name]; !exists {
  166. // c.JSON(http.StatusNotFound, gin.H{"error": "role not found"})
  167. // return
  168. // }
  169. // 防止删除 admin 角色
  170. if deleteRole.Name == "admin" {
  171. global.Logger.Errorln("禁止删除admin ")
  172. c.JSON(http.StatusForbidden, gin.H{"error": "禁止删除admin角色"})
  173. return
  174. }
  175. err := models.DeleteRole(deleteRole.Name)
  176. if err != nil {
  177. global.Logger.Errorln("数据库删除角色失败 ", err.Error())
  178. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("数据库删除角色失败: ", err.Error())})
  179. return
  180. }
  181. //delete(roles, deleteRole.Name)
  182. err = refreshRolesCache()
  183. if err != nil {
  184. global.Logger.Errorln("刷新角色失败 ", err.Error())
  185. c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintln("刷新角色失败: ", err.Error())})
  186. }
  187. // fmt.Printf("roles: %#v\n",
  188. // middlewares.Roles)
  189. c.JSON(http.StatusOK, gin.H{"success": true, "message": "Role deleted successfully"})
  190. }
  191. func GetRoleNames(c *gin.Context) {
  192. names := make([]string, 0, len(
  193. middlewares.Roles))
  194. for name := range middlewares.Roles {
  195. names = append(names, name)
  196. }
  197. c.JSON(http.StatusOK, gin.H{"roles": names})
  198. }