Files
Georgios Komninos cfb0440472 Upgrades scrapemate to v1.4.0 and Go 1.27.1 (#329)
- upgrade Scrapemate to v1.4.0
- update the project and Docker images to Go 1.27.1
- replace google/uuid usage with Go's standard uuid package
- migrate golangci-lint to v2 and fix lint issues
- update Dockerfiles for AMD64 and ARM64 compatibility
2026-09-13 10:59:25 +03:00

95 lines
2.2 KiB
Go

package admin
import (
"encoding/json"
"net/http"
"github.com/gosom/google-maps-scraper/log"
)
// DashboardHandler renders the admin dashboard.
func DashboardHandler(appState *AppState) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
session := SessionFromContext(r.Context())
if session == nil {
http.Redirect(w, r, "/admin/login", http.StatusSeeOther)
return
}
user, err := appState.Store.GetUserByID(r.Context(), session.UserID)
if err != nil {
http.Redirect(w, r, "/admin/login?error=User+not+found", http.StatusSeeOther)
return
}
stats, err := appState.RQueueClient.GetDashboardStats(r.Context())
if err != nil {
log.Error("failed to get dashboard stats", "error", err)
}
data := map[string]any{
templateTOTPEnabledKey: user.TOTPEnabled,
"Username": user.Username,
templateSuccessKey: r.URL.Query().Get("success"),
templateErrorKey: r.URL.Query().Get("error"),
}
if stats != nil {
data["JobsToday"] = stats.JobsToday
data["TotalResults"] = stats.TotalResults
} else {
data["StatsError"] = "Could not load dashboard stats"
}
workers, err := appState.Store.ListProvisionedResources(r.Context(), "")
if err != nil {
log.Error("failed to list workers for aggregate stats", "error", err)
} else {
var (
totalWorkers int
reachableWorkers int
clusterResultsRPM float64
clusterJobs int64
)
for i := range workers {
wr := &workers[i]
if wr.ResourceType != "worker" || wr.DeletedAt != nil {
continue
}
totalWorkers++
healthRaw, ok := wr.Metadata["health"]
if !ok {
continue
}
b, err := json.Marshal(healthRaw)
if err != nil {
continue
}
var health WorkerHealth
if err := json.Unmarshal(b, &health); err != nil {
continue
}
if health.Reachable {
reachableWorkers++
}
clusterResultsRPM += health.ResultsPerMinute
clusterJobs += health.JobsProcessed
}
data["WorkersTotal"] = totalWorkers
data["WorkersReachable"] = reachableWorkers
data["ClusterResultsPerMinute"] = clusterResultsRPM
data["ClusterJobsProcessed"] = clusterJobs
}
renderTemplate(appState, w, r, "dashboard.html", data)
}
}