package web import ( "net/http" "pool-stats/constants" "pool-stats/database" "pool-stats/models" "time" ) type DailyStatsPageData struct { PageDataBase 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) { startParam := r.URL.Query().Get("start") endParam := r.URL.Query().Get("end") var startTime, endTime time.Time var err error 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), } ws.renderTemplate(w, r, "templates/daily_stats.html", &data) }