group.go 22 KB

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