token.go 19 KB

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