100 lines
2.8 KiB
Go
100 lines
2.8 KiB
Go
package web
|
|
|
|
import (
|
|
"html/template"
|
|
"net/http"
|
|
"pool-stats/constants"
|
|
"pool-stats/database"
|
|
"pool-stats/models"
|
|
"time"
|
|
)
|
|
|
|
type DailyStatsPageData struct {
|
|
DailyStats []models.DailyStats
|
|
|
|
Start string
|
|
End string
|
|
|
|
NextPageAvailable bool
|
|
NextPageStart string
|
|
NextPageEnd string
|
|
|
|
PrevPageAvailable bool
|
|
PrevPageStart string
|
|
PrevPageEnd string
|
|
}
|
|
|
|
func (ws *WebServer) DailyStatsHandler(w http.ResponseWriter, r *http.Request) {
|
|
tmpl, err := template.Must(ws.templates.Clone()).ParseFiles("templates/daily_stats.html")
|
|
if err != nil {
|
|
http.Error(w, "Failed to parse template", http.StatusInternalServerError)
|
|
println("Error parsing template:", err.Error())
|
|
return
|
|
}
|
|
|
|
startParam := r.URL.Query().Get("start")
|
|
endParam := r.URL.Query().Get("end")
|
|
var startTime, endTime time.Time
|
|
|
|
if startParam == "" || endParam == "" {
|
|
endTime = time.Now().Truncate(24 * time.Hour)
|
|
startTime = endTime.AddDate(0, 0, -constants.DailyStatsPerPage+1)
|
|
} else {
|
|
startTime, err = time.Parse(time.DateOnly, startParam)
|
|
if err != nil {
|
|
http.Error(w, "Invalid start time format", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
endTime, err = time.Parse(time.DateOnly, endParam)
|
|
if err != nil {
|
|
http.Error(w, "Invalid end time format", http.StatusBadRequest)
|
|
return
|
|
}
|
|
}
|
|
|
|
daysCount := int(endTime.Sub(startTime).Hours() / 24)
|
|
if daysCount < 0 {
|
|
http.Error(w, "End time must be after start time", http.StatusBadRequest)
|
|
return
|
|
}
|
|
if daysCount > constants.DailyStatsPerPage {
|
|
http.Error(w, "Too many days requested", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
dailyStats := make([]models.DailyStats, 0)
|
|
for t := endTime; !t.Before(startTime); t = t.AddDate(0, 0, -1) {
|
|
stats, err := database.GetDailyStats(ws.db, t)
|
|
if err != nil {
|
|
http.Error(w, "Failed to fetch daily stats", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
dailyStats = append(dailyStats, *stats)
|
|
}
|
|
|
|
nextPageStart := endTime.AddDate(0, 0, 1)
|
|
nextPageEnd := endTime.AddDate(0, 0, constants.DailyStatsPerPage)
|
|
prevPageEnd := startTime.AddDate(0, 0, -1)
|
|
prevPageStart := startTime.AddDate(0, 0, -constants.DailyStatsPerPage)
|
|
|
|
data := DailyStatsPageData{
|
|
DailyStats: dailyStats,
|
|
Start: startTime.Format(time.DateOnly),
|
|
End: endTime.Format(time.DateOnly),
|
|
|
|
NextPageAvailable: nextPageStart.Before(time.Now()),
|
|
NextPageStart: nextPageStart.Format(time.DateOnly),
|
|
NextPageEnd: nextPageEnd.Format(time.DateOnly),
|
|
|
|
PrevPageAvailable: prevPageStart.After(constants.EpochTime),
|
|
PrevPageStart: prevPageStart.Format(time.DateOnly),
|
|
PrevPageEnd: prevPageEnd.Format(time.DateOnly),
|
|
}
|
|
if err := tmpl.ExecuteTemplate(w, "daily_stats.html", data); err != nil {
|
|
http.Error(w, "Failed to render template", http.StatusInternalServerError)
|
|
println("Error rendering template:", err.Error())
|
|
return
|
|
}
|
|
}
|