token.go 19 KB

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