permission.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package permission
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. "sghgogs.com/micro/auth-client/model/base"
  6. "sghgogs.com/micro/auth-client/model/response/admin"
  7. "sghgogs.com/micro/auth-client/response"
  8. "sghgogs.com/micro/auth-client/utils"
  9. pb "sghgogs.com/micro/auth-service/proto"
  10. "sghgogs.com/micro/common"
  11. "strconv"
  12. )
  13. // binding:"required"
  14. type ListResponse struct {
  15. Items []admin.AdminPermission `json:"items"`
  16. TotalCount int64 `json:"total_count"`
  17. }
  18. type Request struct {
  19. Page int32 `json:"page"` // 页码, 默认1
  20. PageSize int32 `json:"page_size"` // 页大小, 默认20
  21. Keyword string `json:"keyword"` // 关键词
  22. Status base.Status `json:"status"` // 状态 ENABLED DISABLED DELETED
  23. }
  24. // GetAdminPermissionList
  25. // @summary 权限列表
  26. // @Tags Permissions
  27. // @Accept json
  28. // @Produce json
  29. // @Param Authorization header string true "Bearer 用户令牌"
  30. // @Param page query int true "页码"
  31. // @Param page_size query int true "每页数量"
  32. // @Param keyword query string false "关键字"
  33. // @Param status query string false "状态" Enums(enabled, disabled)
  34. // @Success 200 {object} response.ApiResponse{data=ListResponse} "成功"
  35. // @Failure 400 {object} response.ApiResponse "请求错误"
  36. // @Failure 500 {object} response.ApiResponse "内部错误"
  37. // @Router /v1/api/admin/permissions [get]
  38. func (svc *AdminPermission) GetAdminPermissionList(c *gin.Context) {
  39. validationConfig := response.ValidationConfig{
  40. Validators: map[string]func(interface{}) error{
  41. "page": response.ValidateInt, // 验证是否为整数
  42. "page_size": response.ValidateInt, // 验证是否为整数
  43. },
  44. Required: []string{"page", "page_size"},
  45. }
  46. params, err := response.ParseQueryParameters(c, validationConfig)
  47. if err != nil {
  48. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, err.Error()))
  49. return
  50. }
  51. page, _ := strconv.Atoi(params["page"].(string))
  52. pageSize, _ := strconv.Atoi(params["page_size"].(string))
  53. keyword, status := "", ""
  54. if value, ok := params["keyword"]; ok {
  55. keyword = value.(string)
  56. }
  57. if value, ok := params["status"]; ok {
  58. status = value.(string)
  59. if status != "" && !base.IsValidStatus(status) {
  60. c.JSON(http.StatusBadRequest, gin.H{"error": common.ErrorMessage[common.StatusIsNotValid]})
  61. return
  62. }
  63. }
  64. ctx, _ := utils.CreateContextWithToken(c, "authorizationservice", "AdminPermissionService.GetAdminPermissionList")
  65. listRequest := pb.GetAdminPermissionListRequest{
  66. Page: int32(page),
  67. PageSize: int32(pageSize),
  68. Keyword: keyword,
  69. }
  70. if status != "" {
  71. enum, _ := base.MapStatusToEnum(base.Status(status))
  72. listRequest.Status = enum
  73. }
  74. list, err := svc.Service.GetAdminPermissionList(ctx, &listRequest)
  75. if err != nil {
  76. code, mgs := response.MicroErrorRequest(err)
  77. c.JSON(code, response.ErrorResponse(code, mgs))
  78. return
  79. }
  80. permissions := make([]admin.AdminPermission, 0)
  81. for _, permission := range list.Items {
  82. var item admin.AdminPermission
  83. common.SwapTo(permission, &item)
  84. toStatus, _ := base.MapEnumToStatus(permission.Status)
  85. item.Status = string(toStatus)
  86. if permission.UpdatedAt > 0 {
  87. item.UpdatedAt = utils.ConvertInt64ToTime(permission.UpdatedAt)
  88. }
  89. item.CreatedAt = utils.ConvertInt64ToTime(permission.CreatedAt)
  90. item.IsReserved = permission.IsReserved
  91. item.Roles = base.RolesToResponse(permission.Roles)
  92. item.Endpoint = permission.Endpoint
  93. permissions = append(permissions, item)
  94. }
  95. c.JSON(http.StatusOK, response.SuccessResponse(ListResponse{
  96. Items: permissions,
  97. TotalCount: list.TotalCount,
  98. }))
  99. }
  100. // GetAdminPermission
  101. // @summary 获取权限详情
  102. // @Tags Permissions
  103. // @Accept json
  104. // @Produce json
  105. // @Param Authorization header string true "Bearer 用户令牌"
  106. // @Param id path int true "权限ID"
  107. // @Success 200 {object} response.ApiResponse{data=admin.AdminPermission} "成功"
  108. // @Failure 400 {object} response.ApiResponse "请求错误"
  109. // @Failure 500 {object} response.ApiResponse "内部错误"
  110. // @Router /v1/api/admin/permission/{permissionID} [get]
  111. func (svc *AdminPermission) GetAdminPermission(c *gin.Context) {
  112. permissionID, err := strconv.ParseInt(c.Param("permissionID"), 10, 64)
  113. if err != nil || permissionID <= 0 {
  114. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, common.ErrorMessage[common.InvalidRoleID]))
  115. return
  116. }
  117. ctx, _ := utils.CreateContextWithToken(c, "authorizationservice", "AdminRoleService.GetAdminRole")
  118. list, err := svc.Service.GetAdminPermission(ctx, &pb.GetAdminPermissionRequest{
  119. Id: permissionID,
  120. })
  121. if err != nil {
  122. code, mgs := response.MicroErrorRequest(err)
  123. c.JSON(http.StatusBadRequest, response.ErrorResponse(code, mgs))
  124. return
  125. }
  126. permission := list.Data
  127. status, _ := base.MapEnumToStatus(permission.Status)
  128. c.JSON(http.StatusOK, response.SuccessResponse(admin.AdminPermission{
  129. ID: permission.Id,
  130. Name: permission.Name,
  131. Description: permission.Description,
  132. Roles: base.RolesToResponse(permission.Roles),
  133. CreatedAt: utils.ConvertInt64ToTime(permission.CreatedAt),
  134. UpdatedAt: utils.ConvertInt64ToTime(permission.UpdatedAt),
  135. Status: string(status),
  136. IsReserved: permission.IsReserved,
  137. }))
  138. }
  139. type CreateRequest struct {
  140. Name string `json:"name" binding:"required,max=50,min=3"` // 权限名称
  141. Description string `json:"description"` // 非必填,描述
  142. Endpoint string `json:"endpoint" binding:"required"`
  143. Roles []int64 `json:"roles"` // 角色
  144. }
  145. // CreateAdminPermission
  146. // @summary 新增权限
  147. // @Tags Permissions
  148. // @Accept json
  149. // @Produce json
  150. // @Param Authorization header string true "Bearer 用户令牌"
  151. // @Param body body CreateRequest true "请求body"
  152. // @Success 200 {object} response.ApiResponse "成功"
  153. // @Failure 400 {object} response.ApiResponse "请求错误"
  154. // @Failure 500 {object} response.ApiResponse "内部错误"
  155. // @Router /v1/api/admin/permission [post]
  156. func (svc *AdminPermission) CreateAdminPermission(c *gin.Context) {
  157. var req CreateRequest
  158. if err := c.BindJSON(&req); err != nil {
  159. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, err.Error()))
  160. return
  161. }
  162. if len(req.Roles) > 0 {
  163. if isBool, err := common.ValidateNumericInt64(req.Roles); !isBool {
  164. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, err.Error()))
  165. return
  166. }
  167. }
  168. ctx, _ := utils.CreateContextWithToken(c, "authorizationservice", "AdminPermissionService.CreateAdminPermission")
  169. _, err := svc.Service.CreateAdminPermission(ctx, &pb.CreateAdminPermissionRequest{
  170. Name: req.Name,
  171. Description: req.Description,
  172. Endpoint: req.Endpoint,
  173. Roles: req.Roles,
  174. Status: pb.StatusEnum_ENABLED,
  175. })
  176. if err != nil {
  177. code, mgs := response.MicroErrorRequest(err)
  178. c.JSON(code, response.ErrorResponse(code, mgs))
  179. return
  180. }
  181. c.JSON(http.StatusOK, response.SuccessResponse(nil))
  182. }
  183. type UpdateRequest struct {
  184. Description string `json:"description"` // 非必填,描述
  185. Roles []int64 `json:"roles"` // 角色
  186. }
  187. // UpdateAdminPermission
  188. // @summary 更新权限
  189. // @Tags Permissions
  190. // @Accept json
  191. // @Produce json
  192. // @Param Authorization header string true "Bearer 用户令牌"
  193. // @Param id path int true "权限ID"
  194. // @Param body body UpdateRequest true "请求body"
  195. // @Success 200 {object} response.ApiResponse "成功"
  196. // @Failure 400 {object} response.ApiResponse "请求错误"
  197. // @Failure 500 {object} response.ApiResponse "内部错误"
  198. // @Router /v1/api/admin/permission/{permissionID} [put]
  199. func (svc *AdminPermission) UpdateAdminPermission(c *gin.Context) {
  200. var req UpdateRequest
  201. if err := c.BindJSON(&req); err != nil {
  202. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, err.Error()))
  203. return
  204. }
  205. permissionID, err := strconv.ParseInt(c.Param("permissionID"), 10, 64)
  206. if err != nil || permissionID <= 0 {
  207. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, common.ErrorMessage[common.InvalidRoleID]))
  208. return
  209. }
  210. if len(req.Roles) > 0 {
  211. if isBool, err := common.ValidateNumericInt64(req.Roles); !isBool {
  212. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, err.Error()))
  213. return
  214. }
  215. }
  216. ctx, _ := utils.CreateContextWithToken(c, "authorizationservice", "AdminRoleService.UpdateAdminRole")
  217. _, err = svc.Service.UpdateAdminPermission(ctx, &pb.UpdateAdminPermissionRequest{
  218. PermissionId: permissionID,
  219. Description: req.Description,
  220. Roles: req.Roles,
  221. })
  222. if err != nil {
  223. code, mgs := response.MicroErrorRequest(err)
  224. c.JSON(code, response.ErrorResponse(code, mgs))
  225. return
  226. }
  227. c.JSON(http.StatusOK, response.SuccessResponse(nil))
  228. }
  229. // DeleteAdminPermission
  230. // @summary 删除权限
  231. // @Tags Permissions
  232. // @Accept json
  233. // @Produce json
  234. // @Param Authorization header string true "Bearer 用户令牌"
  235. // @Param id path int true "权限ID"
  236. // @Success 200 {object} response.ApiResponse "成功"
  237. // @Failure 400 {object} response.ApiResponse "请求错误"
  238. // @Failure 500 {object} response.ApiResponse "内部错误"
  239. // @Router /v1/api/admin/permission/{permissionID} [delete]
  240. func (svc *AdminPermission) DeleteAdminPermission(c *gin.Context) {
  241. permissionID, err := strconv.ParseInt(c.Param("permissionID"), 10, 64)
  242. if err != nil || permissionID <= 0 {
  243. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, common.ErrorMessage[common.InvalidRoleID]))
  244. return
  245. }
  246. ctx, _ := utils.CreateContextWithToken(c, "authorizationservice", "AdminRoleService.DeleteAdminRole")
  247. _, err = svc.Service.DeleteAdminPermission(ctx, &pb.DeleteAdminPermissionRequest{
  248. PermissionId: permissionID,
  249. })
  250. if err != nil {
  251. code, mgs := response.MicroErrorRequest(err)
  252. c.JSON(code, response.ErrorResponse(code, mgs))
  253. return
  254. }
  255. c.JSON(http.StatusOK, response.SuccessResponse(nil))
  256. }
  257. type ToggleRequest struct {
  258. Status base.Status `json:"status" binding:"required"` // "enabled"|"disabled"
  259. }
  260. // ToggleAdminPermission
  261. // @summary 启用/禁用
  262. // @Tags Permissions
  263. // @Accept json
  264. // @Produce json
  265. // @Param Authorization header string true "Bearer 用户令牌"
  266. // @Param body body ToggleRequest true "请求body"
  267. // @Success 200 {object} response.ApiResponse "成功"
  268. // @Failure 400 {object} response.ApiResponse "请求错误"
  269. // @Failure 500 {object} response.ApiResponse "内部错误"
  270. // @Router /v1/api/admin/permission/{permissionID}/toggle [put]
  271. func (svc *AdminPermission) ToggleAdminPermission(c *gin.Context) {
  272. var req ToggleRequest
  273. if err := c.ShouldBindJSON(&req); err != nil {
  274. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, err.Error()))
  275. return
  276. }
  277. permissionID, err := strconv.ParseInt(c.Param("permissionID"), 10, 64)
  278. if err != nil || permissionID <= 0 {
  279. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, common.ErrorMessage[common.InvalidRoleID]))
  280. return
  281. }
  282. enum, err := base.MapStatusToEnum(req.Status)
  283. if err != nil {
  284. c.JSON(http.StatusBadRequest, response.ErrorResponse(http.StatusBadRequest, common.ErrorMessage[common.StatusIsNotValid]))
  285. return
  286. }
  287. ctx, _ := utils.CreateContextWithToken(c, "authorizationservice", "AdminPermissionService.ToggleAdminPermission")
  288. _, err = svc.Service.ToggleAdminPermission(ctx, &pb.ToggleAdminPermissionRequest{
  289. PermissionId: permissionID,
  290. Status: enum,
  291. })
  292. if err != nil {
  293. code, mgs := response.MicroErrorRequest(err)
  294. c.JSON(code, response.ErrorResponse(code, mgs))
  295. return
  296. }
  297. c.JSON(http.StatusOK, response.SuccessResponse(nil))
  298. }