Add pit image submission test

Add submission test and add pit images to view tab.

Signed-off-by: Emily Markova <emily.markova@gmail.com>
Change-Id: I01e227f19c0622fcca09186662ab25ab34599045
diff --git a/scouting/webserver/requests/BUILD b/scouting/webserver/requests/BUILD
index a7593e7..7be151e 100644
--- a/scouting/webserver/requests/BUILD
+++ b/scouting/webserver/requests/BUILD
@@ -19,6 +19,8 @@
         "//scouting/webserver/requests/messages:request_all_matches_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_response_go_fbs",
+        "//scouting/webserver/requests/messages:request_all_pit_images_go_fbs",
+        "//scouting/webserver/requests/messages:request_all_pit_images_response_go_fbs",
         "//scouting/webserver/requests/messages:request_notes_for_team_go_fbs",
         "//scouting/webserver/requests/messages:request_notes_for_team_response_go_fbs",
         "//scouting/webserver/requests/messages:request_pit_images_go_fbs",
@@ -57,6 +59,8 @@
         "//scouting/webserver/requests/messages:request_all_matches_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_response_go_fbs",
+        "//scouting/webserver/requests/messages:request_all_pit_images_go_fbs",
+        "//scouting/webserver/requests/messages:request_all_pit_images_response_go_fbs",
         "//scouting/webserver/requests/messages:request_notes_for_team_go_fbs",
         "//scouting/webserver/requests/messages:request_pit_images_go_fbs",
         "//scouting/webserver/requests/messages:request_pit_images_response_go_fbs",
diff --git a/scouting/webserver/requests/debug/BUILD b/scouting/webserver/requests/debug/BUILD
index 11311d2..1224710 100644
--- a/scouting/webserver/requests/debug/BUILD
+++ b/scouting/webserver/requests/debug/BUILD
@@ -13,6 +13,7 @@
         "//scouting/webserver/requests/messages:request_all_driver_rankings_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_matches_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_response_go_fbs",
+        "//scouting/webserver/requests/messages:request_all_pit_images_response_go_fbs",
         "//scouting/webserver/requests/messages:request_notes_for_team_response_go_fbs",
         "//scouting/webserver/requests/messages:request_pit_images_response_go_fbs",
         "//scouting/webserver/requests/messages:request_shift_schedule_response_go_fbs",
diff --git a/scouting/webserver/requests/debug/debug.go b/scouting/webserver/requests/debug/debug.go
index 3e5b4f9..faf4a9d 100644
--- a/scouting/webserver/requests/debug/debug.go
+++ b/scouting/webserver/requests/debug/debug.go
@@ -15,6 +15,7 @@
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
 	"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_all_notes_response"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
@@ -144,6 +145,12 @@
 		request_pit_images_response.GetRootAsRequestPitImagesResponse)
 }
 
+func RequestAllPitImages(server string, requestBytes []byte) (*request_all_pit_images_response.RequestAllPitImagesResponseT, error) {
+	return sendMessage[request_all_pit_images_response.RequestAllPitImagesResponseT](
+		server+"/requests/request/all_pit_images", requestBytes,
+		request_all_pit_images_response.GetRootAsRequestAllPitImagesResponse)
+}
+
 func RequestAllNotes(server string, requestBytes []byte) (*request_all_notes_response.RequestAllNotesResponseT, error) {
 	return sendMessage[request_all_notes_response.RequestAllNotesResponseT](
 		server+"/requests/request/all_notes", requestBytes,
diff --git a/scouting/webserver/requests/messages/BUILD b/scouting/webserver/requests/messages/BUILD
index 13fdc45..735caab 100644
--- a/scouting/webserver/requests/messages/BUILD
+++ b/scouting/webserver/requests/messages/BUILD
@@ -19,6 +19,8 @@
     "submit_pit_image_response",
     "request_pit_images",
     "request_pit_images_response",
+    "request_all_pit_images",
+    "request_all_pit_images_response",
     "request_shift_schedule",
     "request_shift_schedule_response",
     "submit_shift_schedule",
diff --git a/scouting/webserver/requests/messages/request_all_pit_images.fbs b/scouting/webserver/requests/messages/request_all_pit_images.fbs
new file mode 100644
index 0000000..df2d085
--- /dev/null
+++ b/scouting/webserver/requests/messages/request_all_pit_images.fbs
@@ -0,0 +1,6 @@
+namespace scouting.webserver.requests;
+
+table RequestAllPitImages {
+}
+
+root_type RequestAllPitImages;
diff --git a/scouting/webserver/requests/messages/request_all_pit_images_response.fbs b/scouting/webserver/requests/messages/request_all_pit_images_response.fbs
new file mode 100644
index 0000000..d5a2abc
--- /dev/null
+++ b/scouting/webserver/requests/messages/request_all_pit_images_response.fbs
@@ -0,0 +1,13 @@
+namespace scouting.webserver.requests;
+
+table PitImage {
+	team_number:string (id:0);
+	check_sum:string (id:1);
+	image_path:string (id:2);
+}
+
+table RequestAllPitImagesResponse {
+	pit_image_list: [PitImage] (id:0);
+}
+
+root_type RequestAllPitImagesResponse;
diff --git a/scouting/webserver/requests/requests.go b/scouting/webserver/requests/requests.go
index af67386..9628c0d 100644
--- a/scouting/webserver/requests/requests.go
+++ b/scouting/webserver/requests/requests.go
@@ -23,6 +23,8 @@
 	"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_all_notes"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images"
@@ -57,6 +59,8 @@
 type SubmitPitImageResponseT = submit_pit_image_response.SubmitPitImageResponseT
 type RequestPitImages = request_pit_images.RequestPitImages
 type RequestPitImagesResponseT = request_pit_images_response.RequestPitImagesResponseT
+type RequestAllPitImages = request_all_pit_images.RequestAllPitImages
+type RequestAllPitImagesResponseT = request_all_pit_images_response.RequestAllPitImagesResponseT
 type RequestNotesForTeam = request_notes_for_team.RequestNotesForTeam
 type RequestNotesForTeamResponseT = request_notes_for_team_response.RequestNotesForTeamResponseT
 type RequestShiftSchedule = request_shift_schedule.RequestShiftSchedule
@@ -86,6 +90,7 @@
 	QueryAllShifts(int) ([]db.Shift, error)
 	QueryNotes(string) ([]string, error)
 	QueryPitImages(string) ([]db.RequestedPitImage, error)
+	ReturnPitImages() ([]db.PitImage, error)
 	AddNotes(db.NotesData) error
 	AddPitImage(db.PitImage) error
 	AddDriverRanking(db.DriverRankingData) error
@@ -619,6 +624,42 @@
 	w.Write(builder.FinishedBytes())
 }
 
+type requestAllPitImagesHandler struct {
+	db Database
+}
+
+func (handler requestAllPitImagesHandler) 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
+	}
+
+	_, success := parseRequest(w, requestBytes, "RequestAllPitImages", request_all_pit_images.GetRootAsRequestAllPitImages)
+	if !success {
+		return
+	}
+
+	images, err := handler.db.ReturnPitImages()
+	if err != nil {
+		respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to get pit images: %v", err))
+		return
+	}
+
+	var response RequestAllPitImagesResponseT
+	for _, data := range images {
+		response.PitImageList = append(response.PitImageList, &request_all_pit_images_response.PitImageT{
+			TeamNumber: data.TeamNumber,
+			ImagePath:  data.ImagePath,
+			CheckSum:   data.CheckSum,
+		})
+	}
+
+	builder := flatbuffers.NewBuilder(1024)
+	builder.Finish((&response).Pack(builder))
+	w.Write(builder.FinishedBytes())
+}
+
 type requestPitImagesHandler struct {
 	db Database
 }
@@ -1009,6 +1050,7 @@
 	scoutingServer.Handle("/requests/submit/submit_notes", submitNoteScoutingHandler{db})
 	scoutingServer.Handle("/requests/submit/submit_pit_image", submitPitImageScoutingHandler{db})
 	scoutingServer.Handle("/requests/request/pit_images", requestPitImagesHandler{db})
+	scoutingServer.Handle("/requests/request/all_pit_images", requestAllPitImagesHandler{db})
 	scoutingServer.Handle("/requests/request/notes_for_team", requestNotesForTeamHandler{db})
 	scoutingServer.Handle("/requests/submit/shift_schedule", submitShiftScheduleHandler{db})
 	scoutingServer.Handle("/requests/request/shift_schedule", requestShiftScheduleHandler{db})
diff --git a/scouting/webserver/requests/requests_test.go b/scouting/webserver/requests/requests_test.go
index 0797bc1..d81b659 100644
--- a/scouting/webserver/requests/requests_test.go
+++ b/scouting/webserver/requests/requests_test.go
@@ -16,6 +16,8 @@
 	"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_all_notes"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images"
+	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_pit_images_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_pit_images_response"
@@ -597,6 +599,62 @@
 	}
 }
 
+func TestRequestAllPitImages(t *testing.T) {
+	db := MockDatabase{
+		images: []db.PitImage{
+			{
+				TeamNumber: "32", ImagePath: "pitimage.jpg",
+				ImageData: []byte{3, 43, 44, 32}, CheckSum: "cdhrj",
+			},
+			{
+				TeamNumber: "231", ImagePath: "232robot.png",
+				ImageData: []byte{64, 54, 54, 21, 76, 32}, CheckSum: "rgre",
+			},
+			{
+				TeamNumber: "90", ImagePath: "abcd.jpg",
+				ImageData: []byte{92, 94, 10, 30, 57, 32, 32}, CheckSum: "erfer",
+			},
+		},
+	}
+
+	scoutingServer := server.NewScoutingServer()
+	HandleRequests(&db, scoutingServer)
+	scoutingServer.Start(8080)
+	defer scoutingServer.Stop()
+
+	builder := flatbuffers.NewBuilder(1024)
+	builder.Finish((&request_all_pit_images.RequestAllPitImagesT{}).Pack(builder))
+
+	response, err := debug.RequestAllPitImages("http://localhost:8080", builder.FinishedBytes())
+	if err != nil {
+		t.Fatal("Failed to request pit images: ", err)
+	}
+
+	expected := request_all_pit_images_response.RequestAllPitImagesResponseT{
+		PitImageList: []*request_all_pit_images_response.PitImageT{
+			{
+				TeamNumber: "32", ImagePath: "pitimage.jpg", CheckSum: "cdhrj",
+			},
+			{
+				TeamNumber: "231", ImagePath: "232robot.png", CheckSum: "rgre",
+			},
+			{
+				TeamNumber: "90", ImagePath: "abcd.jpg", CheckSum: "erfer",
+			},
+		},
+	}
+
+	if len(expected.PitImageList) != len(response.PitImageList) {
+		t.Fatal("Expected ", expected, ", but got ", *response)
+	}
+
+	for i, pit_image := range expected.PitImageList {
+		if !reflect.DeepEqual(*pit_image, *response.PitImageList[i]) {
+			t.Fatal("Expected for pit image", i, ":", *pit_image, ", but got:", *response.PitImageList[i])
+		}
+	}
+}
+
 func TestRequestShiftSchedule(t *testing.T) {
 	db := MockDatabase{
 		shiftSchedule: []db.Shift{
@@ -1206,6 +1264,10 @@
 	return database.actions, nil
 }
 
+func (database *MockDatabase) ReturnPitImages() ([]db.PitImage, error) {
+	return database.images, nil
+}
+
 func (database *MockDatabase) DeleteFromStats(compLevel_ string, matchNumber_ int32, setNumber_ int32, teamNumber_ string) error {
 	for i, stat := range database.stats2023 {
 		if stat.CompLevel == compLevel_ &&