group.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  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 := c.ShouldBindJSON(&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 := c.ShouldBindJSON(&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 := c.ShouldBindJSON(&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 := c.ShouldBindJSON(&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, &GroupResponse{
  352. Group: g,
  353. })
  354. }
  355. // UpdateGroup godoc
  356. //
  357. // @Summary Update a group
  358. // @Description Updates an existing group with the given information
  359. // @Tags group
  360. // @Accept json
  361. // @Produce json
  362. // @Security ApiKeyAuth
  363. // @Param group path string true "Group name"
  364. // @Param data body model.UpdateGroupRequest true "Updated group information"
  365. // @Success 200 {object} middleware.APIResponse{data=model.Group}
  366. // @Router /api/group/{group} [put]
  367. func UpdateGroup(c *gin.Context) {
  368. group := c.Param("group")
  369. if group == "" {
  370. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  371. return
  372. }
  373. req := model.UpdateGroupRequest{}
  374. err := c.ShouldBindJSON(&req)
  375. if err != nil {
  376. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  377. return
  378. }
  379. g, err := model.UpdateGroup(group, req)
  380. if err != nil {
  381. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  382. return
  383. }
  384. middleware.SuccessResponse(c, &GroupResponse{
  385. Group: g,
  386. })
  387. }
  388. type SaveGroupModelConfigRequest struct {
  389. Model string `json:"model"`
  390. OverrideLimit bool `json:"override_limit"`
  391. RPM int64 `json:"rpm"`
  392. TPM int64 `json:"tpm"`
  393. OverridePrice bool `json:"override_price"`
  394. ImagePrices map[string]float64 `json:"image_prices"`
  395. Price model.Price `json:"price"`
  396. OverrideRetryTimes bool `json:"override_retry_times"`
  397. RetryTimes int64 `json:"retry_times"`
  398. OverrideForceSaveDetail bool `json:"override_force_save_detail"`
  399. ForceSaveDetail bool `json:"force_save_detail"`
  400. }
  401. func (r *SaveGroupModelConfigRequest) ToGroupModelConfig(groupID string) model.GroupModelConfig {
  402. return model.GroupModelConfig{
  403. GroupID: groupID,
  404. Model: r.Model,
  405. OverrideLimit: r.OverrideLimit,
  406. RPM: r.RPM,
  407. TPM: r.TPM,
  408. OverridePrice: r.OverridePrice,
  409. ImagePrices: r.ImagePrices,
  410. Price: r.Price,
  411. OverrideRetryTimes: r.OverrideRetryTimes,
  412. RetryTimes: r.RetryTimes,
  413. OverrideForceSaveDetail: r.OverrideForceSaveDetail,
  414. ForceSaveDetail: r.ForceSaveDetail,
  415. }
  416. }
  417. // SaveGroupModelConfigs godoc
  418. //
  419. // @Summary Save group model configs
  420. // @Description Save group model configs
  421. // @Tags group
  422. // @Accept json
  423. // @Produce json
  424. // @Security ApiKeyAuth
  425. // @Param group path string true "Group name"
  426. // @Param data body []SaveGroupModelConfigRequest true "Group model config information"
  427. // @Success 200 {object} middleware.APIResponse
  428. // @Router /api/group/{group}/model_configs/ [post]
  429. func SaveGroupModelConfigs(c *gin.Context) {
  430. group := c.Param("group")
  431. if group == "" {
  432. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  433. return
  434. }
  435. req := []SaveGroupModelConfigRequest{}
  436. err := c.ShouldBindJSON(&req)
  437. if err != nil {
  438. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  439. return
  440. }
  441. configs := make([]model.GroupModelConfig, len(req))
  442. for i, config := range req {
  443. configs[i] = config.ToGroupModelConfig(group)
  444. }
  445. err = model.SaveGroupModelConfigs(group, configs)
  446. if err != nil {
  447. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  448. return
  449. }
  450. middleware.SuccessResponse(c, nil)
  451. }
  452. // SaveGroupModelConfig godoc
  453. //
  454. // @Summary Save group model config
  455. // @Description Save group model config
  456. // @Tags group
  457. // @Accept json
  458. // @Produce json
  459. // @Security ApiKeyAuth
  460. // @Param group path string true "Group name"
  461. // @Param data body SaveGroupModelConfigRequest true "Group model config information"
  462. // @Success 200 {object} middleware.APIResponse
  463. // @Router /api/group/{group}/model_config/{model} [post]
  464. func SaveGroupModelConfig(c *gin.Context) {
  465. group := c.Param("group")
  466. if group == "" {
  467. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  468. return
  469. }
  470. modelName := strings.TrimPrefix(c.Param("model"), "/")
  471. if modelName == "" {
  472. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  473. return
  474. }
  475. req := SaveGroupModelConfigRequest{}
  476. err := c.ShouldBindJSON(&req)
  477. if err != nil {
  478. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  479. return
  480. }
  481. modelConfig := req.ToGroupModelConfig(group)
  482. modelConfig.Model = modelName
  483. err = model.SaveGroupModelConfig(modelConfig)
  484. if err != nil {
  485. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  486. return
  487. }
  488. middleware.SuccessResponse(c, nil)
  489. }
  490. // DeleteGroupModelConfig godoc
  491. //
  492. // @Summary Delete group model config
  493. // @Description Delete group model config
  494. // @Tags group
  495. // @Produce json
  496. // @Security ApiKeyAuth
  497. // @Param group path string true "Group name"
  498. // @Param model path string true "Model name"
  499. // @Success 200 {object} middleware.APIResponse
  500. // @Router /api/group/{group}/model_config/{model} [delete]
  501. func DeleteGroupModelConfig(c *gin.Context) {
  502. group := c.Param("group")
  503. if group == "" {
  504. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  505. return
  506. }
  507. modelName := strings.TrimPrefix(c.Param("model"), "/")
  508. if modelName == "" {
  509. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  510. return
  511. }
  512. err := model.DeleteGroupModelConfig(group, modelName)
  513. if err != nil {
  514. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  515. return
  516. }
  517. middleware.SuccessResponse(c, nil)
  518. }
  519. // DeleteGroupModelConfigs godoc
  520. //
  521. // @Summary Delete group model configs
  522. // @Description Delete group model configs
  523. // @Tags group
  524. // @Produce json
  525. // @Security ApiKeyAuth
  526. // @Param group path string true "Group name"
  527. // @Param models body []string true "Model names"
  528. // @Success 200 {object} middleware.APIResponse
  529. // @Router /api/group/{group}/model_configs/ [delete]
  530. func DeleteGroupModelConfigs(c *gin.Context) {
  531. group := c.Param("group")
  532. if group == "" {
  533. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  534. return
  535. }
  536. models := []string{}
  537. err := c.ShouldBindJSON(&models)
  538. if err != nil {
  539. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  540. return
  541. }
  542. err = model.DeleteGroupModelConfigs(group, models)
  543. if err != nil {
  544. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  545. return
  546. }
  547. middleware.SuccessResponse(c, nil)
  548. }
  549. // GetGroupModelConfigs godoc
  550. //
  551. // @Summary Get group model configs
  552. // @Description Get group model configs
  553. // @Tags group
  554. // @Produce json
  555. // @Security ApiKeyAuth
  556. // @Param group path string true "Group name"
  557. // @Success 200 {object} middleware.APIResponse{data=[]model.GroupModelConfig}
  558. // @Router /api/group/{group}/model_configs/ [get]
  559. func GetGroupModelConfigs(c *gin.Context) {
  560. group := c.Param("group")
  561. if group == "" {
  562. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  563. return
  564. }
  565. modelConfigs, err := model.GetGroupModelConfigs(group)
  566. if err != nil {
  567. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  568. return
  569. }
  570. middleware.SuccessResponse(c, modelConfigs)
  571. }
  572. // GetGroupModelConfig godoc
  573. //
  574. // @Summary Get group model config
  575. // @Description Get group model config
  576. // @Tags group
  577. // @Produce json
  578. // @Security ApiKeyAuth
  579. // @Param group path string true "Group name"
  580. // @Param model path string true "Model name"
  581. // @Success 200 {object} middleware.APIResponse{data=model.GroupModelConfig}
  582. // @Router /api/group/{group}/model_config/{model} [get]
  583. func GetGroupModelConfig(c *gin.Context) {
  584. group := c.Param("group")
  585. if group == "" {
  586. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  587. return
  588. }
  589. modelName := strings.TrimPrefix(c.Param("model"), "/")
  590. if modelName == "" {
  591. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  592. return
  593. }
  594. modelConfig, err := model.GetGroupModelConfig(group, modelName)
  595. if err != nil {
  596. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  597. return
  598. }
  599. middleware.SuccessResponse(c, modelConfig)
  600. }
  601. // UpdateGroupModelConfig godoc
  602. //
  603. // @Summary Update group model config
  604. // @Description Update group model config
  605. // @Tags group
  606. // @Accept json
  607. // @Produce json
  608. // @Security ApiKeyAuth
  609. // @Param group path string true "Group name"
  610. // @Param model path string true "Model name"
  611. // @Param data body SaveGroupModelConfigRequest true "Group model config information"
  612. // @Success 200 {object} middleware.APIResponse
  613. // @Router /api/group/{group}/model_config/{model} [put]
  614. func UpdateGroupModelConfig(c *gin.Context) {
  615. group := c.Param("group")
  616. if group == "" {
  617. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  618. return
  619. }
  620. modelName := strings.TrimPrefix(c.Param("model"), "/")
  621. if modelName == "" {
  622. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  623. return
  624. }
  625. req := SaveGroupModelConfigRequest{}
  626. err := c.ShouldBindJSON(&req)
  627. if err != nil {
  628. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  629. return
  630. }
  631. modelConfig := req.ToGroupModelConfig(group)
  632. modelConfig.Model = modelName
  633. err = model.UpdateGroupModelConfig(modelConfig)
  634. if err != nil {
  635. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  636. return
  637. }
  638. middleware.SuccessResponse(c, nil)
  639. }
  640. // UpdateGroupModelConfigs godoc
  641. //
  642. // @Summary Update group model configs
  643. // @Description Update group model configs
  644. // @Tags group
  645. // @Accept json
  646. // @Produce json
  647. // @Security ApiKeyAuth
  648. // @Param group path string true "Group name"
  649. // @Param data body []SaveGroupModelConfigRequest true "Group model config information"
  650. // @Success 200 {object} middleware.APIResponse
  651. // @Router /api/group/{group}/model_configs/ [put]
  652. func UpdateGroupModelConfigs(c *gin.Context) {
  653. group := c.Param("group")
  654. if group == "" {
  655. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  656. return
  657. }
  658. req := []SaveGroupModelConfigRequest{}
  659. err := c.ShouldBindJSON(&req)
  660. if err != nil {
  661. middleware.ErrorResponse(c, http.StatusBadRequest, "invalid parameter")
  662. return
  663. }
  664. configs := make([]model.GroupModelConfig, len(req))
  665. for i, config := range req {
  666. configs[i] = config.ToGroupModelConfig(group)
  667. }
  668. err = model.UpdateGroupModelConfigs(group, configs)
  669. if err != nil {
  670. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  671. return
  672. }
  673. middleware.SuccessResponse(c, nil)
  674. }
  675. // GetIPGroupList godoc
  676. //
  677. // @Summary Get IP group list
  678. // @Description Get IP group list
  679. // @Tags groups
  680. // @Produce json
  681. // @Security ApiKeyAuth
  682. // @Param threshold query int false "Threshold"
  683. // @Param start_timestamp query int false "Start timestamp"
  684. // @Param end_timestamp query int false "End timestamp"
  685. // @Success 200 {object} middleware.APIResponse{data=map[string][]string}
  686. // @Router /api/groups/ip_groups [get]
  687. func GetIPGroupList(c *gin.Context) {
  688. threshold, _ := strconv.Atoi(c.Query("threshold"))
  689. startTime, endTime := utils.ParseTimeRange(c, 0)
  690. ipGroupList, err := model.GetIPGroups(threshold, startTime, endTime)
  691. if err != nil {
  692. middleware.ErrorResponse(c, http.StatusInternalServerError, err.Error())
  693. return
  694. }
  695. middleware.SuccessResponse(c, ipGroupList)
  696. }