token.go 19 KB

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