group.go 22 KB

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