Add Pit Scouting Tab

Signed-off-by: Emily Markova <emily.markova@gmail.com>
Change-Id: Iede446546e20f2915bb53e134050b5025976da36
diff --git a/scouting/db/db.go b/scouting/db/db.go
index 1a43634..578edb6 100644
--- a/scouting/db/db.go
+++ b/scouting/db/db.go
@@ -1,6 +1,7 @@
 package db
 
 import (
+	"crypto/sha256"
 	"errors"
 	"fmt"
 	"gorm.io/driver/postgres"
@@ -27,6 +28,19 @@
 	R1scouter, R2scouter, R3scouter, B1scouter, B2scouter, B3scouter string
 }
 
+type PitImage struct {
+	TeamNumber string `gorm:"primaryKey"`
+	CheckSum   string `gorm:"primaryKey"`
+	ImagePath  string
+	ImageData  []byte
+}
+
+type RequestedPitImage struct {
+	TeamNumber string
+	CheckSum   string `gorm:"primaryKey"`
+	ImagePath  string
+}
+
 type Stats2023 struct {
 	// This is set to `true` for "pre-scouted" matches. This means that the
 	// match information is unlikely to correspond with an entry in the
@@ -125,7 +139,7 @@
 		return nil, errors.New(fmt.Sprint("Failed to connect to postgres: ", err))
 	}
 
-	err = database.AutoMigrate(&TeamMatch{}, &Shift{}, &Stats2023{}, &Action{}, &NotesData{}, &Ranking{}, &DriverRankingData{}, &ParsedDriverRankingData{})
+	err = database.AutoMigrate(&TeamMatch{}, &Shift{}, &Stats2023{}, &Action{}, &PitImage{}, &NotesData{}, &Ranking{}, &DriverRankingData{}, &ParsedDriverRankingData{})
 	if err != nil {
 		database.Delete()
 		return nil, errors.New(fmt.Sprint("Failed to create/migrate tables: ", err))
@@ -167,6 +181,11 @@
 	return result.Error
 }
 
+func (database *Database) AddPitImage(p PitImage) error {
+	result := database.Create(&p)
+	return result.Error
+}
+
 func (database *Database) AddToStats2023(s Stats2023) error {
 	if !s.PreScouting {
 		matches, err := database.QueryMatchesString(s.TeamNumber)
@@ -250,6 +269,12 @@
 	return actions, result.Error
 }
 
+func (database *Database) ReturnPitImages() ([]PitImage, error) {
+	var images []PitImage
+	result := database.Find(&images)
+	return images, result.Error
+}
+
 func (database *Database) ReturnStats2023() ([]Stats2023, error) {
 	var stats2023 []Stats2023
 	result := database.Find(&stats2023)
@@ -279,6 +304,28 @@
 	return matches, result.Error
 }
 
+func (database *Database) QueryPitImages(teamNumber_ string) ([]RequestedPitImage, error) {
+	var requestedPitImages []RequestedPitImage
+	result := database.Model(&PitImage{}).
+		Where("team_number = $1", teamNumber_).
+		Find(&requestedPitImages)
+
+	return requestedPitImages, result.Error
+}
+
+func (database *Database) QueryPitImageByChecksum(checksum_ string) (PitImage, error) {
+	var pitImage PitImage
+	result := database.
+		Where("check_sum = $1", checksum_).
+		Find(&pitImage)
+	return pitImage, result.Error
+}
+
+func ComputeSha256FromByteArray(arr []byte) string {
+	sum := sha256.Sum256(arr)
+	return fmt.Sprintf("%x", sum)
+}
+
 func (database *Database) QueryMatchesString(teamNumber_ string) ([]TeamMatch, error) {
 	var matches []TeamMatch
 	result := database.