Files

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
}