utils.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package utils
  2. import (
  3. "strconv"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. )
  7. func ParsePageParams(c *gin.Context) (page, perPage int) {
  8. pageStr := c.Query("page")
  9. if pageStr == "" {
  10. pageStr = c.Query("p")
  11. }
  12. page, _ = strconv.Atoi(pageStr)
  13. perPage, _ = strconv.Atoi(c.Query("per_page"))
  14. return page, perPage
  15. }
  16. const (
  17. defaultMaxSpan = time.Hour * 24 * 7
  18. )
  19. func ParseTimeRange(c *gin.Context, maxSpan time.Duration) (startTime, endTime time.Time) {
  20. if maxSpan == 0 {
  21. maxSpan = defaultMaxSpan
  22. }
  23. startTime, _ = smartParseTimestamp(c.Query("start_timestamp"))
  24. endTime, _ = smartParseTimestamp(c.Query("end_timestamp"))
  25. if endTime.IsZero() {
  26. endTime = time.Now()
  27. }
  28. if maxSpan > 0 {
  29. sevenDaysAgo := endTime.Add(-maxSpan)
  30. if startTime.IsZero() || startTime.Before(sevenDaysAgo) {
  31. startTime = sevenDaysAgo
  32. }
  33. }
  34. return startTime, endTime
  35. }
  36. func smartParseTimestamp(timestampStr string) (time.Time, error) {
  37. timestamp, err := strconv.ParseInt(timestampStr, 10, 64)
  38. if err != nil {
  39. return time.Time{}, err
  40. }
  41. digits := len(timestampStr)
  42. switch {
  43. case digits <= 10:
  44. return time.Unix(timestamp, 0), nil
  45. case digits <= 13:
  46. return time.UnixMilli(timestamp), nil
  47. case digits <= 16:
  48. return time.UnixMicro(timestamp), nil
  49. default:
  50. return time.Unix(0, timestamp), nil
  51. }
  52. }