scouting: Add support for /requests/request/matches_for_team
Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: I00bf80f2a8ee45db896adf025290e4dad4ba4273
diff --git a/scouting/webserver/requests/requests.go b/scouting/webserver/requests/requests.go
index 0a28ca0..44c0b60 100644
--- a/scouting/webserver/requests/requests.go
+++ b/scouting/webserver/requests/requests.go
@@ -9,6 +9,8 @@
"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/error_response"
"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches"
"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
+ "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_matches_for_team"
+ "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_matches_for_team_response"
"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting"
_ "github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting_response"
"github.com/frc971/971-Robot-Code/scouting/webserver/server"
@@ -18,6 +20,8 @@
type SubmitDataScouting = submit_data_scouting.SubmitDataScouting
type RequestAllMatches = request_all_matches.RequestAllMatches
type RequestAllMatchesResponseT = request_all_matches_response.RequestAllMatchesResponseT
+type RequestMatchesForTeam = request_matches_for_team.RequestMatchesForTeam
+type RequestMatchesForTeamResponseT = request_matches_for_team_response.RequestMatchesForTeamResponseT
// The interface we expect the database abstraction to conform to.
// We use an interface here because it makes unit testing easier.
@@ -26,7 +30,7 @@
AddToStats(db.Stats) error
ReturnMatches() ([]db.Match, error)
ReturnStats() ([]db.Stats, error)
- QueryMatches(int) ([]db.Match, error)
+ QueryMatches(int32) ([]db.Match, error)
QueryStats(int) ([]db.Stats, error)
}
@@ -140,8 +144,64 @@
w.Write(builder.FinishedBytes())
}
+// TODO(phil): Can we turn this into a generic?
+func parseRequestMatchesForTeam(w http.ResponseWriter, buf []byte) (*RequestMatchesForTeam, bool) {
+ success := true
+ defer func() {
+ if r := recover(); r != nil {
+ respondWithError(w, http.StatusBadRequest, fmt.Sprintf("Failed to parse SubmitDataScouting: %v", r))
+ success = false
+ }
+ }()
+ result := request_matches_for_team.GetRootAsRequestMatchesForTeam(buf, 0)
+ return result, success
+}
+
+// Handles a RequestMatchesForTeam request.
+type requestMatchesForTeamHandler struct {
+ db Database
+}
+
+func (handler requestMatchesForTeamHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+ requestBytes, err := io.ReadAll(req.Body)
+ if err != nil {
+ respondWithError(w, http.StatusBadRequest, fmt.Sprint("Failed to read request bytes:", err))
+ return
+ }
+
+ request, success := parseRequestMatchesForTeam(w, requestBytes)
+ if !success {
+ return
+ }
+
+ matches, err := handler.db.QueryMatches(request.Team())
+ if err != nil {
+ respondWithError(w, http.StatusInternalServerError, fmt.Sprint("Faled to query database: ", err))
+ }
+
+ var response RequestAllMatchesResponseT
+ for _, match := range matches {
+ response.MatchList = append(response.MatchList, &request_all_matches_response.MatchT{
+ MatchNumber: match.MatchNumber,
+ Round: match.Round,
+ CompLevel: match.CompLevel,
+ R1: match.R1,
+ R2: match.R2,
+ R3: match.R3,
+ B1: match.B1,
+ B2: match.B2,
+ B3: match.B3,
+ })
+ }
+
+ builder := flatbuffers.NewBuilder(50 * 1024)
+ builder.Finish((&response).Pack(builder))
+ w.Write(builder.FinishedBytes())
+}
+
func HandleRequests(db Database, scoutingServer server.ScoutingServer) {
scoutingServer.HandleFunc("/requests", unknown)
scoutingServer.Handle("/requests/submit/data_scouting", submitDataScoutingHandler{db})
scoutingServer.Handle("/requests/request/all_matches", requestAllMatchesHandler{db})
+ scoutingServer.Handle("/requests/request/matches_for_team", requestMatchesForTeamHandler{db})
}