group.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728
  1. package controller
  2. import (
  3. "net/http"
  4. "strconv"
  5. "time"
  6. "github.com/bytedance/sonic"
  7. "github.com/gin-gonic/gin"
  8. "github.com/labring/aiproxy/core/middleware"
  9. "github.com/labring/aiproxy/core/model"
  10. )
  11. type GroupResponse struct {
  12. *model.Group
  13. AccessedAt time.Time `json:"accessed_at,omitempty"`
  14. }
  15. func (g *GroupResponse) MarshalJSON() ([]byte, error) {
  16. type Alias model.Group
  17. return sonic.Marshal(&struct {
  18. *Alias
  19. CreatedAt int64 `json:"created_at,omitempty"`
  20. AccessedAt int64 `json:"accessed_at,omitempty"`
  21. }{
  22. Alias: (*Alias)(g.Group),
  23. CreatedAt: g.CreatedAt.UnixMilli(),
  24. AccessedAt: g.AccessedAt.UnixMilli(),
  25. })
  26. }
  27. // GetGroups godoc
  28. //
  29. // @Summary Get all groups
  30. // @Description Returns a list of all groups with pagination
  31. // @Tags groups
  32. // @Produce json
  33. // @Security ApiKeyAuth
  34. // @Param page query int false "Page number"
  35. // @Param per_page query int false "Items per page"
  36. // @Success 200 {object} middleware.APIResponse{data=map[string]any{groups=[]GroupResponse,total=int}}
  37. // @Router /api/groups [get]
  38. func GetGroups(c *gin.Context) {
  39. page, perPage := parsePageParams(c)
  40. order := c.DefaultQuery("order", "")
  41. groups, total, err := model.GetGroups(page, perPage, order, false)
  42. if err != nil {
  43. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  44. return
  45. }
  46. groupResponses := make([]*GroupResponse, len(groups))
  47. for i, group := range groups {
  48. lastRequestAt, _ := model.GetGroupLastRequestTime(group.ID)
  49. groupResponses[i] = &GroupResponse{
  50. Group: group,
  51. AccessedAt: lastRequestAt,
  52. }
  53. }
  54. middleware.SuccessResponse(c, gin.H{
  55. "groups": groupResponses,
  56. "total": total,
  57. })
  58. }
  59. // SearchGroups godoc
  60. //
  61. // @Summary Search groups
  62. // @Description Search groups with keyword and pagination
  63. // @Tags groups
  64. // @Produce json
  65. // @Security ApiKeyAuth
  66. // @Param keyword query string true "Search keyword"
  67. // @Param page query int false "Page number"
  68. // @Param per_page query int false "Items per page"
  69. // @Param status query int false "Status"
  70. // @Param order query string false "Order"
  71. // @Success 200 {object} middleware.APIResponse{data=map[string]any{groups=[]GroupResponse,total=int}}
  72. // @Router /api/groups/search [get]
  73. func SearchGroups(c *gin.Context) {
  74. keyword := c.Query("keyword")
  75. page, perPage := parsePageParams(c)
  76. order := c.DefaultQuery("order", "")
  77. status, _ := strconv.Atoi(c.Query("status"))
  78. groups, total, err := model.SearchGroup(keyword, page, perPage, order, status)
  79. if err != nil {
  80. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  81. return
  82. }
  83. groupResponses := make([]*GroupResponse, len(groups))
  84. for i, group := range groups {
  85. lastRequestAt, _ := model.GetGroupLastRequestTime(group.ID)
  86. groupResponses[i] = &GroupResponse{
  87. Group: group,
  88. AccessedAt: lastRequestAt,
  89. }
  90. }
  91. middleware.SuccessResponse(c, gin.H{
  92. "groups": groupResponses,
  93. "total": total,
  94. })
  95. }
  96. // GetGroup godoc
  97. //
  98. // @Summary Get a group
  99. // @Description Returns detailed information about a specific group
  100. // @Tags group
  101. // @Produce json
  102. // @Security ApiKeyAuth
  103. // @Param group path string true "Group name"
  104. // @Success 200 {object} middleware.APIResponse{data=GroupResponse}
  105. // @Router /api/group/{group} [get]
  106. func GetGroup(c *gin.Context) {
  107. group := c.Param("group")
  108. if group == "" {
  109. middleware.ErrorResponse(c, http.StatusOK, "group id is empty")
  110. return
  111. }
  112. _group, err := model.GetGroupByID(group, false)
  113. if err != nil {
  114. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  115. return
  116. }
  117. lastRequestAt, _ := model.GetGroupLastRequestTime(group)
  118. groupResponse := &GroupResponse{
  119. Group: _group,
  120. AccessedAt: lastRequestAt,
  121. }
  122. middleware.SuccessResponse(c, groupResponse)
  123. }
  124. type UpdateGroupRPMRatioRequest struct {
  125. RPMRatio float64 `json:"rpm_ratio"`
  126. }
  127. // UpdateGroupRPMRatio godoc
  128. //
  129. // @Summary Update group RPM ratio
  130. // @Description Updates the RPM (Requests Per Minute) ratio for a group
  131. // @Tags group
  132. // @Accept json
  133. // @Produce json
  134. // @Security ApiKeyAuth
  135. // @Param group path string true "Group name"
  136. // @Param data body UpdateGroupRPMRatioRequest true "RPM ratio information"
  137. // @Success 200 {object} middleware.APIResponse
  138. // @Router /api/group/{group}/rpm_ratio [post]
  139. func UpdateGroupRPMRatio(c *gin.Context) {
  140. group := c.Param("group")
  141. if group == "" {
  142. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  143. return
  144. }
  145. req := UpdateGroupRPMRatioRequest{}
  146. err := sonic.ConfigDefault.NewDecoder(c.Request.Body).Decode(&req)
  147. if err != nil {
  148. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  149. return
  150. }
  151. err = model.UpdateGroupRPMRatio(group, req.RPMRatio)
  152. if err != nil {
  153. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  154. return
  155. }
  156. middleware.SuccessResponse(c, nil)
  157. }
  158. type UpdateGroupTPMRatioRequest struct {
  159. TPMRatio float64 `json:"tpm_ratio"`
  160. }
  161. // UpdateGroupTPMRatio godoc
  162. //
  163. // @Summary Update group TPM ratio
  164. // @Description Updates the TPM (Tokens Per Minute) ratio for a group
  165. // @Tags group
  166. // @Accept json
  167. // @Produce json
  168. // @Security ApiKeyAuth
  169. // @Param group path string true "Group name"
  170. // @Param data body UpdateGroupTPMRatioRequest true "TPM ratio information"
  171. // @Success 200 {object} middleware.APIResponse
  172. // @Router /api/group/{group}/tpm_ratio [post]
  173. func UpdateGroupTPMRatio(c *gin.Context) {
  174. group := c.Param("group")
  175. if group == "" {
  176. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  177. return
  178. }
  179. req := UpdateGroupTPMRatioRequest{}
  180. err := sonic.ConfigDefault.NewDecoder(c.Request.Body).Decode(&req)
  181. if err != nil {
  182. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  183. return
  184. }
  185. err = model.UpdateGroupTPMRatio(group, req.TPMRatio)
  186. if err != nil {
  187. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  188. return
  189. }
  190. middleware.SuccessResponse(c, nil)
  191. }
  192. type UpdateGroupStatusRequest struct {
  193. Status int `json:"status"`
  194. }
  195. // UpdateGroupStatus godoc
  196. //
  197. // @Summary Update group status
  198. // @Description Updates the status of a group
  199. // @Tags group
  200. // @Accept json
  201. // @Produce json
  202. // @Security ApiKeyAuth
  203. // @Param group path string true "Group name"
  204. // @Param status body UpdateGroupStatusRequest true "Status information"
  205. // @Success 200 {object} middleware.APIResponse
  206. // @Router /api/group/{group}/status [post]
  207. func UpdateGroupStatus(c *gin.Context) {
  208. group := c.Param("group")
  209. if group == "" {
  210. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  211. return
  212. }
  213. req := UpdateGroupStatusRequest{}
  214. err := sonic.ConfigDefault.NewDecoder(c.Request.Body).Decode(&req)
  215. if err != nil {
  216. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  217. return
  218. }
  219. err = model.UpdateGroupStatus(group, req.Status)
  220. if err != nil {
  221. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  222. return
  223. }
  224. middleware.SuccessResponse(c, nil)
  225. }
  226. // DeleteGroup godoc
  227. //
  228. // @Summary Delete a group
  229. // @Description Deletes a group by its name
  230. // @Tags group
  231. // @Produce json
  232. // @Security ApiKeyAuth
  233. // @Param group path string true "Group name"
  234. // @Success 200 {object} middleware.APIResponse
  235. // @Router /api/group/{group} [delete]
  236. func DeleteGroup(c *gin.Context) {
  237. group := c.Param("group")
  238. if group == "" {
  239. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  240. return
  241. }
  242. err := model.DeleteGroupByID(group)
  243. if err != nil {
  244. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  245. return
  246. }
  247. middleware.SuccessResponse(c, nil)
  248. }
  249. // DeleteGroups godoc
  250. //
  251. // @Summary Delete multiple groups
  252. // @Description Deletes multiple groups by their IDs
  253. // @Tags groups
  254. // @Accept json
  255. // @Produce json
  256. // @Security ApiKeyAuth
  257. // @Param ids body []string true "Group IDs"
  258. // @Success 200 {object} middleware.APIResponse
  259. // @Router /api/groups/batch_delete [post]
  260. func DeleteGroups(c *gin.Context) {
  261. ids := []string{}
  262. err := c.ShouldBindJSON(&ids)
  263. if err != nil {
  264. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  265. return
  266. }
  267. err = model.DeleteGroupsByIDs(ids)
  268. if err != nil {
  269. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  270. return
  271. }
  272. middleware.SuccessResponse(c, nil)
  273. }
  274. type UpdateGroupsStatusRequest struct {
  275. Status int `json:"status"`
  276. Groups []string `json:"groups"`
  277. }
  278. // UpdateGroupsStatus godoc
  279. //
  280. // @Summary Update multiple groups status
  281. // @Description Updates the status of multiple groups
  282. // @Tags groups
  283. // @Accept json
  284. // @Produce json
  285. // @Security ApiKeyAuth
  286. // @Param data body UpdateGroupsStatusRequest true "Group IDs and status"
  287. // @Success 200 {object} middleware.APIResponse
  288. // @Router /api/groups/batch_status [post]
  289. func UpdateGroupsStatus(c *gin.Context) {
  290. req := UpdateGroupsStatusRequest{}
  291. err := c.ShouldBindJSON(&req)
  292. if err != nil {
  293. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  294. return
  295. }
  296. _, err = model.UpdateGroupsStatus(req.Groups, req.Status)
  297. if err != nil {
  298. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  299. return
  300. }
  301. middleware.SuccessResponse(c, nil)
  302. }
  303. type CreateGroupRequest struct {
  304. RPMRatio float64 `json:"rpm_ratio"`
  305. TPMRatio float64 `json:"tpm_ratio"`
  306. AvailableSets []string `json:"available_sets"`
  307. BalanceAlertEnabled bool `json:"balance_alert_enabled"`
  308. BalanceAlertThreshold float64 `json:"balance_alert_threshold"`
  309. }
  310. func (r *CreateGroupRequest) ToGroup() *model.Group {
  311. return &model.Group{
  312. RPMRatio: r.RPMRatio,
  313. TPMRatio: r.TPMRatio,
  314. AvailableSets: r.AvailableSets,
  315. BalanceAlertEnabled: r.BalanceAlertEnabled,
  316. BalanceAlertThreshold: r.BalanceAlertThreshold,
  317. }
  318. }
  319. // CreateGroup godoc
  320. //
  321. // @Summary Create a new group
  322. // @Description Creates a new group with the given information
  323. // @Tags group
  324. // @Accept json
  325. // @Produce json
  326. // @Security ApiKeyAuth
  327. // @Param group path string true "Group name"
  328. // @Param data body CreateGroupRequest true "Group information"
  329. // @Success 200 {object} middleware.APIResponse{data=model.Group}
  330. // @Router /api/group/{group} [post]
  331. func CreateGroup(c *gin.Context) {
  332. group := c.Param("group")
  333. if group == "" {
  334. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  335. return
  336. }
  337. req := CreateGroupRequest{}
  338. err := sonic.ConfigDefault.NewDecoder(c.Request.Body).Decode(&req)
  339. if err != nil {
  340. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  341. return
  342. }
  343. g := req.ToGroup()
  344. g.ID = group
  345. if err := model.CreateGroup(g); err != nil {
  346. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  347. return
  348. }
  349. middleware.SuccessResponse(c, g)
  350. }
  351. // UpdateGroup godoc
  352. //
  353. // @Summary Update a group
  354. // @Description Updates an existing group with the given information
  355. // @Tags group
  356. // @Accept json
  357. // @Produce json
  358. // @Security ApiKeyAuth
  359. // @Param group path string true "Group name"
  360. // @Param data body CreateGroupRequest true "Updated group information"
  361. // @Success 200 {object} middleware.APIResponse{data=model.Group}
  362. // @Router /api/group/{group} [put]
  363. func UpdateGroup(c *gin.Context) {
  364. group := c.Param("group")
  365. if group == "" {
  366. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  367. return
  368. }
  369. req := CreateGroupRequest{}
  370. err := sonic.ConfigDefault.NewDecoder(c.Request.Body).Decode(&req)
  371. if err != nil {
  372. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  373. return
  374. }
  375. g := req.ToGroup()
  376. err = model.UpdateGroup(group, g)
  377. if err != nil {
  378. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  379. return
  380. }
  381. middleware.SuccessResponse(c, g)
  382. }
  383. type SaveGroupModelConfigRequest struct {
  384. Model string `json:"model"`
  385. OverrideLimit bool `json:"override_limit"`
  386. RPM int64 `json:"rpm"`
  387. TPM int64 `json:"tpm"`
  388. OverridePrice bool `json:"override_price"`
  389. ImagePrices map[string]float64 `json:"image_prices"`
  390. Price model.Price `json:"price"`
  391. }
  392. func (r *SaveGroupModelConfigRequest) ToGroupModelConfig(groupID string) model.GroupModelConfig {
  393. return model.GroupModelConfig{
  394. GroupID: groupID,
  395. Model: r.Model,
  396. OverrideLimit: r.OverrideLimit,
  397. RPM: r.RPM,
  398. TPM: r.TPM,
  399. OverridePrice: r.OverridePrice,
  400. ImagePrices: r.ImagePrices,
  401. Price: r.Price,
  402. }
  403. }
  404. // SaveGroupModelConfigs godoc
  405. //
  406. // @Summary Save group model configs
  407. // @Description Save group model configs
  408. // @Tags group
  409. // @Accept json
  410. // @Produce json
  411. // @Security ApiKeyAuth
  412. // @Param group path string true "Group name"
  413. // @Param data body []SaveGroupModelConfigRequest true "Group model config information"
  414. // @Success 200 {object} middleware.APIResponse
  415. // @Router /api/group/{group}/model_configs/ [post]
  416. func SaveGroupModelConfigs(c *gin.Context) {
  417. group := c.Param("group")
  418. if group == "" {
  419. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  420. return
  421. }
  422. req := []SaveGroupModelConfigRequest{}
  423. err := c.ShouldBindJSON(&req)
  424. if err != nil {
  425. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  426. return
  427. }
  428. configs := make([]model.GroupModelConfig, len(req))
  429. for i, config := range req {
  430. configs[i] = config.ToGroupModelConfig(group)
  431. }
  432. err = model.SaveGroupModelConfigs(group, configs)
  433. if err != nil {
  434. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  435. return
  436. }
  437. middleware.SuccessResponse(c, nil)
  438. }
  439. // SaveGroupModelConfig godoc
  440. //
  441. // @Summary Save group model config
  442. // @Description Save group model config
  443. // @Tags group
  444. // @Accept json
  445. // @Produce json
  446. // @Security ApiKeyAuth
  447. // @Param group path string true "Group name"
  448. // @Param data body SaveGroupModelConfigRequest true "Group model config information"
  449. // @Success 200 {object} middleware.APIResponse
  450. // @Router /api/group/{group}/model_config/{model} [post]
  451. func SaveGroupModelConfig(c *gin.Context) {
  452. group := c.Param("group")
  453. if group == "" {
  454. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  455. return
  456. }
  457. modelName := c.Param("model")
  458. if modelName == "" {
  459. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  460. return
  461. }
  462. req := SaveGroupModelConfigRequest{}
  463. err := c.ShouldBindJSON(&req)
  464. if err != nil {
  465. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  466. return
  467. }
  468. modelConfig := req.ToGroupModelConfig(group)
  469. modelConfig.Model = modelName
  470. err = model.SaveGroupModelConfig(modelConfig)
  471. if err != nil {
  472. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  473. return
  474. }
  475. middleware.SuccessResponse(c, nil)
  476. }
  477. // DeleteGroupModelConfig godoc
  478. //
  479. // @Summary Delete group model config
  480. // @Description Delete group model config
  481. // @Tags group
  482. // @Produce json
  483. // @Security ApiKeyAuth
  484. // @Param group path string true "Group name"
  485. // @Param model path string true "Model name"
  486. // @Success 200 {object} middleware.APIResponse
  487. // @Router /api/group/{group}/model_config/{model} [delete]
  488. func DeleteGroupModelConfig(c *gin.Context) {
  489. group := c.Param("group")
  490. if group == "" {
  491. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  492. return
  493. }
  494. modelName := c.Param("model")
  495. if modelName == "" {
  496. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  497. return
  498. }
  499. err := model.DeleteGroupModelConfig(group, modelName)
  500. if err != nil {
  501. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  502. return
  503. }
  504. middleware.SuccessResponse(c, nil)
  505. }
  506. // DeleteGroupModelConfigs godoc
  507. //
  508. // @Summary Delete group model configs
  509. // @Description Delete group model configs
  510. // @Tags group
  511. // @Produce json
  512. // @Security ApiKeyAuth
  513. // @Param group path string true "Group name"
  514. // @Param models body []string true "Model names"
  515. // @Success 200 {object} middleware.APIResponse
  516. // @Router /api/group/{group}/model_configs/ [delete]
  517. func DeleteGroupModelConfigs(c *gin.Context) {
  518. group := c.Param("group")
  519. if group == "" {
  520. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  521. return
  522. }
  523. models := []string{}
  524. err := c.ShouldBindJSON(&models)
  525. if err != nil {
  526. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  527. return
  528. }
  529. err = model.DeleteGroupModelConfigs(group, models)
  530. if err != nil {
  531. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  532. return
  533. }
  534. middleware.SuccessResponse(c, nil)
  535. }
  536. // GetGroupModelConfigs godoc
  537. //
  538. // @Summary Get group model configs
  539. // @Description Get group model configs
  540. // @Tags group
  541. // @Produce json
  542. // @Security ApiKeyAuth
  543. // @Param group path string true "Group name"
  544. // @Success 200 {object} middleware.APIResponse{data=[]model.GroupModelConfig}
  545. // @Router /api/group/{group}/model_configs/ [get]
  546. func GetGroupModelConfigs(c *gin.Context) {
  547. group := c.Param("group")
  548. if group == "" {
  549. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  550. return
  551. }
  552. modelConfigs, err := model.GetGroupModelConfigs(group)
  553. if err != nil {
  554. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  555. return
  556. }
  557. middleware.SuccessResponse(c, modelConfigs)
  558. }
  559. // GetGroupModelConfig godoc
  560. //
  561. // @Summary Get group model config
  562. // @Description Get group model config
  563. // @Tags group
  564. // @Produce json
  565. // @Security ApiKeyAuth
  566. // @Param group path string true "Group name"
  567. // @Param model path string true "Model name"
  568. // @Success 200 {object} middleware.APIResponse{data=model.GroupModelConfig}
  569. // @Router /api/group/{group}/model_config/{model} [get]
  570. func GetGroupModelConfig(c *gin.Context) {
  571. group := c.Param("group")
  572. if group == "" {
  573. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  574. return
  575. }
  576. modelName := c.Param("model")
  577. if modelName == "" {
  578. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  579. return
  580. }
  581. modelConfig, err := model.GetGroupModelConfig(group, modelName)
  582. if err != nil {
  583. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  584. return
  585. }
  586. middleware.SuccessResponse(c, modelConfig)
  587. }
  588. // UpdateGroupModelConfig godoc
  589. //
  590. // @Summary Update group model config
  591. // @Description Update group model config
  592. // @Tags group
  593. // @Accept json
  594. // @Produce json
  595. // @Security ApiKeyAuth
  596. // @Param group path string true "Group name"
  597. // @Param model path string true "Model name"
  598. // @Param data body SaveGroupModelConfigRequest true "Group model config information"
  599. // @Success 200 {object} middleware.APIResponse
  600. // @Router /api/group/{group}/model_config/{model} [put]
  601. func UpdateGroupModelConfig(c *gin.Context) {
  602. group := c.Param("group")
  603. if group == "" {
  604. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  605. return
  606. }
  607. modelName := c.Param("model")
  608. if modelName == "" {
  609. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  610. return
  611. }
  612. req := SaveGroupModelConfigRequest{}
  613. err := c.ShouldBindJSON(&req)
  614. if err != nil {
  615. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  616. return
  617. }
  618. modelConfig := req.ToGroupModelConfig(group)
  619. modelConfig.Model = modelName
  620. err = model.UpdateGroupModelConfig(modelConfig)
  621. if err != nil {
  622. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  623. return
  624. }
  625. middleware.SuccessResponse(c, nil)
  626. }
  627. // UpdateGroupModelConfigs godoc
  628. //
  629. // @Summary Update group model configs
  630. // @Description Update group model configs
  631. // @Tags group
  632. // @Accept json
  633. // @Produce json
  634. // @Security ApiKeyAuth
  635. // @Param group path string true "Group name"
  636. // @Param data body []SaveGroupModelConfigRequest true "Group model config information"
  637. // @Success 200 {object} middleware.APIResponse
  638. // @Router /api/group/{group}/model_configs/ [put]
  639. func UpdateGroupModelConfigs(c *gin.Context) {
  640. group := c.Param("group")
  641. if group == "" {
  642. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  643. return
  644. }
  645. req := []SaveGroupModelConfigRequest{}
  646. err := c.ShouldBindJSON(&req)
  647. if err != nil {
  648. middleware.ErrorResponse(c, http.StatusOK, "invalid parameter")
  649. return
  650. }
  651. configs := make([]model.GroupModelConfig, len(req))
  652. for i, config := range req {
  653. configs[i] = config.ToGroupModelConfig(group)
  654. }
  655. err = model.UpdateGroupModelConfigs(group, configs)
  656. if err != nil {
  657. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  658. return
  659. }
  660. middleware.SuccessResponse(c, nil)
  661. }
  662. // GetIPGroupList godoc
  663. //
  664. // @Summary Get IP group list
  665. // @Description Get IP group list
  666. // @Tags groups
  667. // @Produce json
  668. // @Security ApiKeyAuth
  669. // @Param threshold query int false "Threshold"
  670. // @Param start_timestamp query int false "Start timestamp"
  671. // @Param end_timestamp query int false "End timestamp"
  672. // @Success 200 {object} middleware.APIResponse{data=map[string][]string}
  673. // @Router /api/groups/ip_groups [get]
  674. func GetIPGroupList(c *gin.Context) {
  675. threshold, _ := strconv.Atoi(c.Query("threshold"))
  676. startTime, endTime := parseTimeRange(c)
  677. ipGroupList, err := model.GetIPGroups(threshold, startTime, endTime)
  678. if err != nil {
  679. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  680. return
  681. }
  682. middleware.SuccessResponse(c, ipGroupList)
  683. }