log.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. package controller
  2. import (
  3. "net/http"
  4. "strconv"
  5. "time"
  6. "github.com/gin-gonic/gin"
  7. "github.com/labring/aiproxy/middleware"
  8. "github.com/labring/aiproxy/model"
  9. )
  10. func parseTimeRange(c *gin.Context) (startTime, endTime time.Time) {
  11. startTimestamp, _ := strconv.ParseInt(c.Query("start_timestamp"), 10, 64)
  12. endTimestamp, _ := strconv.ParseInt(c.Query("end_timestamp"), 10, 64)
  13. if startTimestamp != 0 {
  14. startTime = time.UnixMilli(startTimestamp)
  15. }
  16. sevenDaysAgo := time.Now().AddDate(0, 0, -7)
  17. if startTime.IsZero() || startTime.Before(sevenDaysAgo) {
  18. startTime = sevenDaysAgo
  19. }
  20. if endTimestamp != 0 {
  21. endTime = time.UnixMilli(endTimestamp)
  22. }
  23. return
  24. }
  25. func parseCommonParams(c *gin.Context) (params struct {
  26. tokenName string
  27. modelName string
  28. channelID int
  29. endpoint string
  30. tokenID int
  31. order string
  32. requestID string
  33. mode int
  34. codeType string
  35. withBody bool
  36. ip string
  37. },
  38. ) {
  39. params.tokenName = c.Query("token_name")
  40. params.modelName = c.Query("model_name")
  41. params.channelID, _ = strconv.Atoi(c.Query("channel"))
  42. params.endpoint = c.Query("endpoint")
  43. params.tokenID, _ = strconv.Atoi(c.Query("token_id"))
  44. params.order = c.Query("order")
  45. params.requestID = c.Query("request_id")
  46. params.mode, _ = strconv.Atoi(c.Query("mode"))
  47. params.codeType = c.Query("code_type")
  48. params.withBody, _ = strconv.ParseBool(c.Query("with_body"))
  49. params.ip = c.Query("ip")
  50. return
  51. }
  52. // Handler functions
  53. func GetLogs(c *gin.Context) {
  54. page, perPage := parsePageParams(c)
  55. startTime, endTime := parseTimeRange(c)
  56. params := parseCommonParams(c)
  57. group := c.Query("group")
  58. result, err := model.GetLogs(
  59. group,
  60. startTime,
  61. endTime,
  62. params.modelName,
  63. params.requestID,
  64. params.tokenID,
  65. params.tokenName,
  66. params.channelID,
  67. params.endpoint,
  68. params.order,
  69. params.mode,
  70. model.CodeType(params.codeType),
  71. params.withBody,
  72. params.ip,
  73. page,
  74. perPage,
  75. )
  76. if err != nil {
  77. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  78. return
  79. }
  80. middleware.SuccessResponse(c, result)
  81. }
  82. func GetGroupLogs(c *gin.Context) {
  83. group := c.Param("group")
  84. if group == "" {
  85. middleware.ErrorResponse(c, http.StatusOK, "group is required")
  86. return
  87. }
  88. page, perPage := parsePageParams(c)
  89. startTime, endTime := parseTimeRange(c)
  90. params := parseCommonParams(c)
  91. result, err := model.GetGroupLogs(
  92. group,
  93. startTime,
  94. endTime,
  95. params.modelName,
  96. params.requestID,
  97. params.tokenID,
  98. params.tokenName,
  99. params.channelID,
  100. params.endpoint,
  101. params.order,
  102. params.mode,
  103. model.CodeType(params.codeType),
  104. params.withBody,
  105. params.ip,
  106. page,
  107. perPage,
  108. )
  109. if err != nil {
  110. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  111. return
  112. }
  113. middleware.SuccessResponse(c, result)
  114. }
  115. func SearchLogs(c *gin.Context) {
  116. page, perPage := parsePageParams(c)
  117. startTime, endTime := parseTimeRange(c)
  118. params := parseCommonParams(c)
  119. keyword := c.Query("keyword")
  120. group := c.Query("group_id")
  121. result, err := model.SearchLogs(
  122. group,
  123. keyword,
  124. params.endpoint,
  125. params.requestID,
  126. params.tokenID,
  127. params.tokenName,
  128. params.modelName,
  129. startTime,
  130. endTime,
  131. params.channelID,
  132. params.order,
  133. params.mode,
  134. model.CodeType(params.codeType),
  135. params.withBody,
  136. params.ip,
  137. page,
  138. perPage,
  139. )
  140. if err != nil {
  141. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  142. return
  143. }
  144. middleware.SuccessResponse(c, result)
  145. }
  146. func SearchGroupLogs(c *gin.Context) {
  147. group := c.Param("group")
  148. if group == "" {
  149. middleware.ErrorResponse(c, http.StatusOK, "group is required")
  150. return
  151. }
  152. page, perPage := parsePageParams(c)
  153. startTime, endTime := parseTimeRange(c)
  154. params := parseCommonParams(c)
  155. keyword := c.Query("keyword")
  156. result, err := model.SearchGroupLogs(
  157. group,
  158. keyword,
  159. params.endpoint,
  160. params.requestID,
  161. params.tokenID,
  162. params.tokenName,
  163. params.modelName,
  164. startTime,
  165. endTime,
  166. params.channelID,
  167. params.order,
  168. params.mode,
  169. model.CodeType(params.codeType),
  170. params.withBody,
  171. params.ip,
  172. page,
  173. perPage,
  174. )
  175. if err != nil {
  176. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  177. return
  178. }
  179. middleware.SuccessResponse(c, result)
  180. }
  181. func GetLogDetail(c *gin.Context) {
  182. logID, _ := strconv.Atoi(c.Param("log_id"))
  183. log, err := model.GetLogDetail(logID)
  184. if err != nil {
  185. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  186. return
  187. }
  188. middleware.SuccessResponse(c, log)
  189. }
  190. func GetUsedModels(c *gin.Context) {
  191. startTime, endTime := parseTimeRange(c)
  192. models, err := model.GetUsedModels("", startTime, endTime)
  193. if err != nil {
  194. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  195. return
  196. }
  197. middleware.SuccessResponse(c, models)
  198. }
  199. func GetGroupLogDetail(c *gin.Context) {
  200. group := c.Param("group")
  201. if group == "" {
  202. middleware.ErrorResponse(c, http.StatusOK, "group is required")
  203. return
  204. }
  205. logID, _ := strconv.Atoi(c.Param("log_id"))
  206. log, err := model.GetGroupLogDetail(logID, group)
  207. if err != nil {
  208. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  209. return
  210. }
  211. middleware.SuccessResponse(c, log)
  212. }
  213. func GetGroupUsedModels(c *gin.Context) {
  214. group := c.Param("group")
  215. if group == "" {
  216. middleware.ErrorResponse(c, http.StatusOK, "group is required")
  217. return
  218. }
  219. startTime, endTime := parseTimeRange(c)
  220. models, err := model.GetUsedModels(group, startTime, endTime)
  221. if err != nil {
  222. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  223. return
  224. }
  225. middleware.SuccessResponse(c, models)
  226. }
  227. func GetGroupUsedTokenNames(c *gin.Context) {
  228. group := c.Param("group")
  229. if group == "" {
  230. middleware.ErrorResponse(c, http.StatusOK, "group is required")
  231. return
  232. }
  233. startTime, endTime := parseTimeRange(c)
  234. tokenNames, err := model.GetUsedTokenNames(group, startTime, endTime)
  235. if err != nil {
  236. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  237. return
  238. }
  239. middleware.SuccessResponse(c, tokenNames)
  240. }
  241. func DeleteHistoryLogs(c *gin.Context) {
  242. timestamp, _ := strconv.ParseInt(c.Query("timestamp"), 10, 64)
  243. if timestamp == 0 {
  244. middleware.ErrorResponse(c, http.StatusOK, "timestamp is required")
  245. return
  246. }
  247. count, err := model.DeleteOldLog(time.UnixMilli(timestamp))
  248. if err != nil {
  249. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  250. return
  251. }
  252. middleware.SuccessResponse(c, count)
  253. }
  254. func SearchConsumeError(c *gin.Context) {
  255. keyword := c.Query("keyword")
  256. group := c.Query("group")
  257. tokenName := c.Query("token_name")
  258. modelName := c.Query("model_name")
  259. content := c.Query("content")
  260. tokenID, _ := strconv.Atoi(c.Query("token_id"))
  261. usedAmount, _ := strconv.ParseFloat(c.Query("used_amount"), 64)
  262. page, _ := strconv.Atoi(c.Query("page"))
  263. perPage, _ := strconv.Atoi(c.Query("per_page"))
  264. if perPage <= 0 {
  265. perPage = 10
  266. } else if perPage > 100 {
  267. perPage = 100
  268. }
  269. order := c.Query("order")
  270. requestID := c.Query("request_id")
  271. logs, total, err := model.SearchConsumeError(
  272. keyword,
  273. requestID,
  274. group,
  275. tokenName,
  276. modelName,
  277. content,
  278. usedAmount,
  279. tokenID,
  280. page,
  281. perPage,
  282. order,
  283. )
  284. if err != nil {
  285. middleware.ErrorResponse(c, http.StatusOK, err.Error())
  286. return
  287. }
  288. middleware.SuccessResponse(c, gin.H{
  289. "logs": logs,
  290. "total": total,
  291. })
  292. }