token.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. package controller
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strconv"
  6. "time"
  7. "github.com/bytedance/sonic"
  8. "github.com/gin-gonic/gin"
  9. "github.com/labring/aiproxy/core/common/network"
  10. "github.com/labring/aiproxy/core/controller/utils"
  11. "github.com/labring/aiproxy/core/middleware"
  12. "github.com/labring/aiproxy/core/model"
  13. )
  14. // TokenResponse represents the response structure for token endpoints
  15. type TokenResponse struct {
  16. *model.Token
  17. AccessedAt time.Time `json:"accessed_at"`
  18. }
  19. func (t *TokenResponse) MarshalJSON() ([]byte, error) {
  20. type Alias TokenResponse
  21. return sonic.Marshal(&struct {
  22. *Alias
  23. CreatedAt int64 `json:"created_at"`
  24. AccessedAt int64 `json:"accessed_at"`
  25. }{
  26. Alias: (*Alias)(t),
  27. CreatedAt: t.CreatedAt.UnixMilli(),
  28. AccessedAt: t.AccessedAt.UnixMilli(),
  29. })
  30. }
  31. type (
  32. AddTokenRequest struct {
  33. Name string `json:"name"`
  34. Subnets []string `json:"subnets"`
  35. Models []string `json:"models"`
  36. Quota float64 `json:"quota"`
  37. }
  38. UpdateTokenStatusRequest struct {
  39. Status int `json:"status"`
  40. }
  41. UpdateTokenNameRequest struct {
  42. Name string `json:"name"`
  43. }
  44. )
  45. func (at *AddTokenRequest) ToToken() *model.Token {
  46. return &model.Token{
  47. Name: model.EmptyNullString(at.Name),
  48. Subnets: at.Subnets,
  49. Models: at.Models,
  50. Quota: at.Quota,
  51. }
  52. }
  53. func validateToken(token AddTokenRequest) error {
  54. if err := network.IsValidSubnets(token.Subnets); err != nil {
  55. return fmt.Errorf("invalid subnet: %w", err)
  56. }
  57. return nil
  58. }
  59. func validateSubnets(subnets []string) error {
  60. if err := network.IsValidSubnets(subnets); err != nil {
  61. return fmt.Errorf("invalid subnet: %w", err)
  62. }
  63. return nil
  64. }
  65. func buildTokenResponse(token *model.Token) *TokenResponse {
  66. lastRequestAt, _ := model.GetGroupTokenLastRequestTimeMinute(token.GroupID, string(token.Name))
  67. return &TokenResponse{
  68. Token: token,
  69. AccessedAt: lastRequestAt,
  70. }
  71. }
  72. func buildTokenResponses(tokens []*model.Token) []*TokenResponse {
  73. responses := make([]*TokenResponse, len(tokens))
  74. for i, token := range tokens {
  75. responses[i] = buildTokenResponse(token)
  76. }
  77. return responses
  78. }
  79. // GetTokens godoc
  80. //
  81. // @Summary Get all tokens
  82. // @Description Returns a paginated list of all tokens
  83. // @Tags tokens
  84. // @Produce json
  85. // @Security ApiKeyAuth
  86. // @Param page query int false "Page number"
  87. // @Param per_page query int false "Items per page"
  88. // @Param group query string false "Group name"
  89. // @Param order query string false "Order"
  90. // @Param status query int false "Status"
  91. // @Success 200 {object} middleware.APIResponse{data=map[string]any{tokens=[]TokenResponse,total=int}}
  92. // @Router /api/tokens/ [get]
  93. func GetTokens(c *gin.Context) {
  94. page, perPage := utils.ParsePageParams(c)
  95. group := c.Query("group")
  96. order := c.Query("order")
  97. status, _ := strconv.Atoi(c.Query("status"))
  98. tokens, total, err := model.GetTokens(group, page, perPage, order, status)
  99. if err != nil {
  100. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  101. return
  102. }
  103. middleware.SuccessResponse(c, gin.H{
  104. "tokens": buildTokenResponses(tokens),
  105. "total": total,
  106. })
  107. }
  108. // GetGroupTokens godoc
  109. //
  110. // @Summary Get all tokens for a specific group
  111. // @Description Returns a paginated list of all tokens for a specific group
  112. // @Tags tokens
  113. // @Produce json
  114. // @Security ApiKeyAuth
  115. // @Param group path string true "Group name"
  116. // @Param page query int false "Page number"
  117. // @Param per_page query int false "Items per page"
  118. // @Param order query string false "Order"
  119. // @Param status query int false "Status"
  120. // @Success 200 {object} middleware.APIResponse{data=map[string]any{tokens=[]TokenResponse,total=int}}
  121. // @Router /api/tokens/{group} [get]
  122. func GetGroupTokens(c *gin.Context) {
  123. group := c.Param("group")
  124. if group == "" {
  125. middleware.ErrorResponse(c, http.StatusBadRequest, "group is required")
  126. return
  127. }
  128. page, perPage := utils.ParsePageParams(c)
  129. order := c.Query("order")
  130. status, _ := strconv.Atoi(c.Query("status"))
  131. tokens, total, err := model.GetTokens(group, page, perPage, order, status)
  132. if err != nil {
  133. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  134. return
  135. }
  136. middleware.SuccessResponse(c, gin.H{
  137. "tokens": buildTokenResponses(tokens),
  138. "total": total,
  139. })
  140. }
  141. // SearchTokens godoc
  142. //
  143. // @Summary Search tokens
  144. // @Description Returns a paginated list of tokens based on search criteria
  145. // @Tags tokens
  146. // @Produce json
  147. // @Security ApiKeyAuth
  148. // @Param keyword query string false "Keyword"
  149. // @Param page query int false "Page number"
  150. // @Param per_page query int false "Items per page"
  151. // @Param order query string false "Order"
  152. // @Param name query string false "Name"
  153. // @Param key query string false "Key"
  154. // @Param status query int false "Status"
  155. // @Param group query string false "Group"
  156. // @Success 200 {object} middleware.APIResponse{data=map[string]any{tokens=[]TokenResponse,total=int}}
  157. // @Router /api/tokens/search [get]
  158. func SearchTokens(c *gin.Context) {
  159. page, perPage := utils.ParsePageParams(c)
  160. keyword := c.Query("keyword")
  161. order := c.Query("order")
  162. name := c.Query("name")
  163. key := c.Query("key")
  164. status, _ := strconv.Atoi(c.Query("status"))
  165. group := c.Query("group")
  166. tokens, total, err := model.SearchTokens(
  167. group,
  168. keyword,
  169. page,
  170. perPage,
  171. order,
  172. status,
  173. name,
  174. key,
  175. )
  176. if err != nil {
  177. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  178. return
  179. }
  180. middleware.SuccessResponse(c, gin.H{
  181. "tokens": buildTokenResponses(tokens),
  182. "total": total,
  183. })
  184. }
  185. // SearchGroupTokens godoc
  186. //
  187. // @Summary Search tokens for a specific group
  188. // @Description Returns a paginated list of tokens for a specific group based on search criteria
  189. // @Tags token
  190. // @Produce json
  191. // @Security ApiKeyAuth
  192. // @Param group path string true "Group name"
  193. // @Param keyword query string false "Keyword"
  194. // @Param page query int false "Page number"
  195. // @Param per_page query int false "Items per page"
  196. // @Param order query string false "Order"
  197. // @Param name query string false "Name"
  198. // @Param key query string false "Key"
  199. // @Param status query int false "Status"
  200. // @Success 200 {object} middleware.APIResponse{data=map[string]any{tokens=[]TokenResponse,total=int}}
  201. // @Router /api/token/{group}/search [get]
  202. func SearchGroupTokens(c *gin.Context) {
  203. group := c.Param("group")
  204. if group == "" {
  205. middleware.ErrorResponse(c, http.StatusBadRequest, "group is required")
  206. return
  207. }
  208. page, perPage := utils.ParsePageParams(c)
  209. keyword := c.Query("keyword")
  210. order := c.Query("order")
  211. name := c.Query("name")
  212. key := c.Query("key")
  213. status, _ := strconv.Atoi(c.Query("status"))
  214. tokens, total, err := model.SearchGroupTokens(
  215. group,
  216. keyword,
  217. page,
  218. perPage,
  219. order,
  220. status,
  221. name,
  222. key,
  223. )
  224. if err != nil {
  225. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  226. return
  227. }
  228. middleware.SuccessResponse(c, gin.H{
  229. "tokens": buildTokenResponses(tokens),
  230. "total": total,
  231. })
  232. }
  233. // GetToken godoc
  234. //
  235. // @Summary Get token by ID
  236. // @Description Returns detailed information about a specific token
  237. // @Tags tokens
  238. // @Produce json
  239. // @Security ApiKeyAuth
  240. // @Param id path int true "Token ID"
  241. // @Success 200 {object} middleware.APIResponse{data=TokenResponse}
  242. // @Router /api/tokens/{id} [get]
  243. func GetToken(c *gin.Context) {
  244. id, err := strconv.Atoi(c.Param("id"))
  245. if err != nil {
  246. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  247. return
  248. }
  249. token, err := model.GetTokenByID(id)
  250. if err != nil {
  251. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  252. return
  253. }
  254. middleware.SuccessResponse(c, buildTokenResponse(token))
  255. }
  256. // GetGroupToken godoc
  257. //
  258. // @Summary Get token by ID for a specific group
  259. // @Description Returns detailed information about a specific token for a specific group
  260. // @Tags token
  261. // @Produce json
  262. // @Security ApiKeyAuth
  263. // @Param group path string true "Group name"
  264. // @Param id path int true "Token ID"
  265. // @Success 200 {object} middleware.APIResponse{data=TokenResponse}
  266. // @Router /api/token/{group}/{id} [get]
  267. func GetGroupToken(c *gin.Context) {
  268. group := c.Param("group")
  269. if group == "" {
  270. middleware.ErrorResponse(c, http.StatusBadRequest, "group is required")
  271. return
  272. }
  273. id, err := strconv.Atoi(c.Param("id"))
  274. if err != nil {
  275. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  276. return
  277. }
  278. token, err := model.GetGroupTokenByID(group, id)
  279. if err != nil {
  280. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  281. return
  282. }
  283. middleware.SuccessResponse(c, buildTokenResponse(token))
  284. }
  285. // AddGroupToken godoc
  286. //
  287. // @Summary Add group token
  288. // @Description Adds a new token to a specific group
  289. // @Tags token
  290. // @Accept json
  291. // @Produce json
  292. // @Security ApiKeyAuth
  293. // @Param group path string true "Group name"
  294. // @Param auto_create_group query bool false "Auto create group"
  295. // @Param ignore_exist query bool false "Ignore exist"
  296. // @Param token body AddTokenRequest true "Token information"
  297. // @Success 200 {object} middleware.APIResponse{data=TokenResponse}
  298. // @Router /api/token/{group} [post]
  299. func AddGroupToken(c *gin.Context) {
  300. group := c.Param("group")
  301. var req AddTokenRequest
  302. if err := c.ShouldBindJSON(&req); err != nil {
  303. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  304. return
  305. }
  306. if err := validateToken(req); err != nil {
  307. middleware.ErrorResponse(c, http.StatusBadRequest, "parameter error: "+err.Error())
  308. return
  309. }
  310. token := req.ToToken()
  311. token.GroupID = group
  312. if err := model.InsertToken(token, c.Query("auto_create_group") == "true", c.Query("ignore_exist") == "true"); err != nil {
  313. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  314. return
  315. }
  316. middleware.SuccessResponse(c, &TokenResponse{Token: token})
  317. }
  318. // DeleteToken godoc
  319. //
  320. // @Summary Delete token
  321. // @Description Deletes a specific token by ID
  322. // @Tags tokens
  323. // @Produce json
  324. // @Security ApiKeyAuth
  325. // @Param id path int true "Token ID"
  326. // @Success 200 {object} middleware.APIResponse
  327. // @Router /api/tokens/{id} [delete]
  328. func DeleteToken(c *gin.Context) {
  329. id, err := strconv.Atoi(c.Param("id"))
  330. if err != nil {
  331. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  332. return
  333. }
  334. if err := model.DeleteTokenByID(id); err != nil {
  335. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  336. return
  337. }
  338. middleware.SuccessResponse(c, nil)
  339. }
  340. // DeleteTokens godoc
  341. //
  342. // @Summary Delete multiple tokens
  343. // @Description Deletes multiple tokens by their IDs
  344. // @Tags tokens
  345. // @Accept json
  346. // @Produce json
  347. // @Security ApiKeyAuth
  348. // @Param ids body []int true "Token IDs"
  349. // @Success 200 {object} middleware.APIResponse
  350. // @Router /api/tokens/batch_delete [post]
  351. func DeleteTokens(c *gin.Context) {
  352. var ids []int
  353. if err := c.ShouldBindJSON(&ids); err != nil {
  354. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  355. return
  356. }
  357. if err := model.DeleteTokensByIDs(ids); err != nil {
  358. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  359. return
  360. }
  361. middleware.SuccessResponse(c, nil)
  362. }
  363. // DeleteGroupToken godoc
  364. //
  365. // @Summary Delete group token
  366. // @Description Deletes a specific token from a group
  367. // @Tags token
  368. // @Produce json
  369. // @Security ApiKeyAuth
  370. // @Param group path string true "Group name"
  371. // @Param id path int true "Token ID"
  372. // @Success 200 {object} middleware.APIResponse
  373. // @Router /api/token/{group}/{id} [delete]
  374. func DeleteGroupToken(c *gin.Context) {
  375. group := c.Param("group")
  376. id, err := strconv.Atoi(c.Param("id"))
  377. if err != nil {
  378. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  379. return
  380. }
  381. if err := model.DeleteGroupTokenByID(group, id); err != nil {
  382. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  383. return
  384. }
  385. middleware.SuccessResponse(c, nil)
  386. }
  387. // DeleteGroupTokens godoc
  388. //
  389. // @Summary Delete group tokens
  390. // @Description Deletes multiple tokens from a specific group
  391. // @Tags token
  392. // @Produce json
  393. // @Security ApiKeyAuth
  394. // @Param group path string true "Group name"
  395. // @Param ids body []int true "Token IDs"
  396. // @Success 200 {object} middleware.APIResponse
  397. // @Router /api/token/{group}/batch_delete [post]
  398. func DeleteGroupTokens(c *gin.Context) {
  399. group := c.Param("group")
  400. var ids []int
  401. if err := c.ShouldBindJSON(&ids); err != nil {
  402. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  403. return
  404. }
  405. if err := model.DeleteGroupTokensByIDs(group, ids); err != nil {
  406. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  407. return
  408. }
  409. middleware.SuccessResponse(c, nil)
  410. }
  411. // UpdateToken godoc
  412. //
  413. // @Summary Update token
  414. // @Description Updates an existing token's information
  415. // @Tags tokens
  416. // @Accept json
  417. // @Produce json
  418. // @Security ApiKeyAuth
  419. // @Param id path int true "Token ID"
  420. // @Param token body model.UpdateTokenRequest true "Updated token information"
  421. // @Success 200 {object} middleware.APIResponse{data=TokenResponse}
  422. // @Router /api/tokens/{id} [put]
  423. func UpdateToken(c *gin.Context) {
  424. id, err := strconv.Atoi(c.Param("id"))
  425. if err != nil {
  426. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  427. return
  428. }
  429. var req model.UpdateTokenRequest
  430. if err := c.ShouldBindJSON(&req); err != nil {
  431. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  432. return
  433. }
  434. if req.Subnets != nil {
  435. if err := validateSubnets(*req.Subnets); err != nil {
  436. middleware.ErrorResponse(c, http.StatusBadRequest, "parameter error: "+err.Error())
  437. return
  438. }
  439. }
  440. token, err := model.UpdateToken(id, req)
  441. if err != nil {
  442. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  443. return
  444. }
  445. middleware.SuccessResponse(c, &TokenResponse{Token: token})
  446. }
  447. // UpdateGroupToken godoc
  448. //
  449. // @Summary Update group token
  450. // @Description Updates an existing token in a specific group
  451. // @Tags token
  452. // @Accept json
  453. // @Produce json
  454. // @Security ApiKeyAuth
  455. // @Param group path string true "Group name"
  456. // @Param id path int true "Token ID"
  457. // @Param token body model.UpdateTokenRequest true "Updated token information"
  458. // @Success 200 {object} middleware.APIResponse{data=TokenResponse}
  459. // @Router /api/token/{group}/{id} [put]
  460. func UpdateGroupToken(c *gin.Context) {
  461. group := c.Param("group")
  462. id, err := strconv.Atoi(c.Param("id"))
  463. if err != nil {
  464. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  465. return
  466. }
  467. var req model.UpdateTokenRequest
  468. if err := c.ShouldBindJSON(&req); err != nil {
  469. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  470. return
  471. }
  472. if req.Subnets != nil {
  473. if err := validateSubnets(*req.Subnets); err != nil {
  474. middleware.ErrorResponse(c, http.StatusBadRequest, "parameter error: "+err.Error())
  475. return
  476. }
  477. }
  478. token, err := model.UpdateGroupToken(id, group, req)
  479. if err != nil {
  480. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  481. return
  482. }
  483. middleware.SuccessResponse(c, &TokenResponse{Token: token})
  484. }
  485. // UpdateTokenStatus godoc
  486. //
  487. // @Summary Update token status
  488. // @Description Updates the status of a specific token
  489. // @Tags tokens
  490. // @Accept json
  491. // @Produce json
  492. // @Security ApiKeyAuth
  493. // @Param id path int true "Token ID"
  494. // @Param status body UpdateTokenStatusRequest true "Status information"
  495. // @Success 200 {object} middleware.APIResponse
  496. // @Router /api/tokens/{id}/status [post]
  497. func UpdateTokenStatus(c *gin.Context) {
  498. id, err := strconv.Atoi(c.Param("id"))
  499. if err != nil {
  500. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  501. return
  502. }
  503. var req UpdateTokenStatusRequest
  504. if err := c.ShouldBindJSON(&req); err != nil {
  505. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  506. return
  507. }
  508. if err := model.UpdateTokenStatus(id, req.Status); err != nil {
  509. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  510. return
  511. }
  512. middleware.SuccessResponse(c, nil)
  513. }
  514. // UpdateGroupTokenStatus godoc
  515. //
  516. // @Summary Update group token status
  517. // @Description Updates the status of a token in a specific group
  518. // @Tags token
  519. // @Accept json
  520. // @Produce json
  521. // @Security ApiKeyAuth
  522. // @Param group path string true "Group name"
  523. // @Param id path int true "Token ID"
  524. // @Param status body UpdateTokenStatusRequest true "Status information"
  525. // @Success 200 {object} middleware.APIResponse
  526. // @Router /api/token/{group}/{id}/status [post]
  527. func UpdateGroupTokenStatus(c *gin.Context) {
  528. group := c.Param("group")
  529. id, err := strconv.Atoi(c.Param("id"))
  530. if err != nil {
  531. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  532. return
  533. }
  534. var req UpdateTokenStatusRequest
  535. if err := c.ShouldBindJSON(&req); err != nil {
  536. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  537. return
  538. }
  539. if err := model.UpdateGroupTokenStatus(group, id, req.Status); err != nil {
  540. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  541. return
  542. }
  543. middleware.SuccessResponse(c, nil)
  544. }
  545. // UpdateTokenName godoc
  546. //
  547. // @Summary Update token name
  548. // @Description Updates the name of a specific token
  549. // @Tags tokens
  550. // @Accept json
  551. // @Produce json
  552. // @Security ApiKeyAuth
  553. // @Param id path int true "Token ID"
  554. // @Param name body UpdateTokenNameRequest true "Name information"
  555. // @Success 200 {object} middleware.APIResponse
  556. // @Router /api/tokens/{id}/name [post]
  557. func UpdateTokenName(c *gin.Context) {
  558. id, err := strconv.Atoi(c.Param("id"))
  559. if err != nil {
  560. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  561. return
  562. }
  563. var req UpdateTokenNameRequest
  564. if err := c.ShouldBindJSON(&req); err != nil {
  565. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  566. return
  567. }
  568. if err := model.UpdateTokenName(id, req.Name); err != nil {
  569. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  570. return
  571. }
  572. middleware.SuccessResponse(c, nil)
  573. }
  574. // UpdateGroupTokenName godoc
  575. //
  576. // @Summary Update group token name
  577. // @Description Updates the name of a token in a specific group
  578. // @Tags token
  579. // @Accept json
  580. // @Produce json
  581. // @Security ApiKeyAuth
  582. // @Param group path string true "Group name"
  583. // @Param id path int true "Token ID"
  584. // @Param name body UpdateTokenNameRequest true "Name information"
  585. // @Success 200 {object} middleware.APIResponse
  586. // @Router /api/token/{group}/{id}/name [post]
  587. func UpdateGroupTokenName(c *gin.Context) {
  588. group := c.Param("group")
  589. id, err := strconv.Atoi(c.Param("id"))
  590. if err != nil {
  591. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  592. return
  593. }
  594. var req UpdateTokenNameRequest
  595. if err := c.ShouldBindJSON(&req); err != nil {
  596. middleware.ErrorResponse(c, http.StatusBadRequest, err.Error())
  597. return
  598. }
  599. if err := model.UpdateGroupTokenName(group, id, req.Name); err != nil {
  600. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  601. return
  602. }
  603. middleware.SuccessResponse(c, nil)
  604. }