Implement daily stats
This commit is contained in:
99
web/dailyStatsHandler.go
Normal file
99
web/dailyStatsHandler.go
Normal file
@@ -0,0 +1,99 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
@@ -21,6 +21,7 @@ func NewWebServer(db *clover.DB, port int) *WebServer {
|
||||
"add": func(a, b int) int { return a + b },
|
||||
"sub": func(a, b int) int { return a - b },
|
||||
"humanDiff": helpers.HumanDiff,
|
||||
"formatHashrate": helpers.FormatHashrate,
|
||||
"formatCreateDate": helpers.FormatCreateDate,
|
||||
})
|
||||
|
||||
@@ -39,6 +40,7 @@ func (ws *WebServer) Start() error {
|
||||
http.HandleFunc("/", ws.IndexHandler)
|
||||
http.HandleFunc("/shares", ws.SharesHandler)
|
||||
http.HandleFunc("/top-shares", ws.TopSharesHandler)
|
||||
http.HandleFunc("/daily-stats", ws.DailyStatsHandler)
|
||||
|
||||
address := ":" + fmt.Sprint(ws.port)
|
||||
println("Listening on", address)
|
||||
|
||||
Reference in New Issue
Block a user