mirror of
https://github.com/wahyd4/badger.git
synced 2026-08-09 05:15:58 +10:00
56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/getsentry/sentry-go"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/jinzhu/gorm"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/wahyd4/badger/models"
|
|
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
|
|
)
|
|
|
|
type StatsHandler struct {
|
|
DB *gorm.DB
|
|
}
|
|
|
|
type StatsResult struct {
|
|
Date time.Time `json:"label"`
|
|
Count int `json:"data"`
|
|
}
|
|
|
|
func (handler *StatsHandler) GetStats(c *gin.Context) {
|
|
|
|
span := tracer.StartSpan("web.request", tracer.ResourceName("/api/stats"))
|
|
defer span.Finish()
|
|
|
|
badge := c.MustGet("badge").(*models.Badge)
|
|
result, err := handler.badgeStats(badge)
|
|
if err != nil {
|
|
logrus.Errorf("failed to generate stats information for %s, %v", badge.ULID, err)
|
|
sentry.CaptureException(err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": ErrorMessageInternalError})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
func (handler *StatsHandler) badgeStats(badge *models.Badge) ([]*StatsResult, error) {
|
|
oneYearAgoString := time.Now().Add(-time.Hour * 24 * 365).Format(time.RFC3339)
|
|
span := tracer.StartSpan("db.badgeStats")
|
|
defer span.Finish()
|
|
|
|
var result = make([]*StatsResult, 0)
|
|
err := handler.DB.Raw(`select
|
|
date_trunc('day', created_at AT TIME ZONE 'Australia/Melbourne') as date, -- or hour, day, week, month, year
|
|
count(1)
|
|
from view_records
|
|
where ulid = ? and created_at >= ?
|
|
group by 1
|
|
order by date ASC`, badge.ULID, oneYearAgoString).Scan(&result).Error
|
|
|
|
return result, err
|
|
}
|