mirror of
https://github.com/AmanTahiliani/box-box.git
synced 2026-08-07 11:54:59 -04:00
Backend-only re-cut of the #76 availability work onto main, stacked on the canonical Weekend Context API. Adds request-scoped freshness reporting so aggregate responses cannot report fresh when a component is stale, plus local-first driver summary resolution and cache/pacing truth. The frontend half of #76 is deliberately excluded: it is built on the Weekend shell that failed owner review, including the full-width Partial banner treatment. Availability presentation is re-cut with the shell in #89. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
58 lines
1.8 KiB
Go
58 lines
1.8 KiB
Go
package web
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/AmanTahiliani/box-box/internal/chapters"
|
|
"github.com/AmanTahiliani/box-box/internal/models"
|
|
"github.com/AmanTahiliani/box-box/internal/query"
|
|
)
|
|
|
|
func (s *Server) handleRaceHub(w http.ResponseWriter, r *http.Request) {
|
|
sessionKey, err := strconv.Atoi(r.URL.Query().Get("session_key"))
|
|
if err != nil || sessionKey == 0 {
|
|
http.Error(w, "session_key required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if !s.hasLocalQuery() {
|
|
markDataResponse(w, "none", "limited")
|
|
writeJSON(w, emptyRaceHub(sessionKey))
|
|
return
|
|
}
|
|
|
|
hub, err := s.query.GetRaceHub(sessionKey)
|
|
if err != nil {
|
|
writeError(w, err, http.StatusInternalServerError, false)
|
|
return
|
|
}
|
|
switch hub.Source {
|
|
case query.ResponseSourceNone:
|
|
markDataResponse(w, "none", "limited")
|
|
case query.ResponseSourcePartial:
|
|
markLocalResponse(w, true)
|
|
default:
|
|
markLocalResponse(w, false)
|
|
}
|
|
writeJSON(w, hub)
|
|
}
|
|
|
|
func emptyRaceHub(sessionKey int) query.RaceHub {
|
|
return query.RaceHub{
|
|
Source: query.ResponseSourceNone,
|
|
SessionKey: sessionKey,
|
|
Datasets: map[string]query.DatasetInfo{
|
|
"meeting": query.DatasetInfo{Status: query.DatasetStatusMissing, Source: query.DataSourceNone, Count: 0},
|
|
"session": query.DatasetInfo{Status: query.DatasetStatusMissing, Source: query.DataSourceNone, Count: 0},
|
|
"drivers": query.DatasetInfo{Status: query.DatasetStatusMissing, Source: query.DataSourceNone, Count: 0},
|
|
"results": query.DatasetInfo{Status: query.DatasetStatusMissing, Source: query.DataSourceNone, Count: 0},
|
|
"starting_grid": query.DatasetInfo{Status: query.DatasetStatusMissing, Source: query.DataSourceNone, Count: 0},
|
|
},
|
|
Drivers: []models.Driver{},
|
|
Results: []query.EnrichedResult{},
|
|
StartingGrid: []query.EnrichedGrid{},
|
|
Chapters: []chapters.Chapter{},
|
|
}
|
|
}
|