Make team number a string

Signed-off-by: Emily Markova <emily.markova@gmail.com>
Change-Id: Ia1cff2cfb854e2202cbcaee6f1fd22fc7efd1c15
diff --git a/scouting/webserver/driver_ranking/driver_ranking.go b/scouting/webserver/driver_ranking/driver_ranking.go
index 82e34e1..82445bf 100644
--- a/scouting/webserver/driver_ranking/driver_ranking.go
+++ b/scouting/webserver/driver_ranking/driver_ranking.go
@@ -76,9 +76,9 @@
 			// Most of the data is unused so we just fill in empty
 			// strings.
 			"", "", "", "",
-			strconv.Itoa(int(ranking.Rank1)),
-			strconv.Itoa(int(ranking.Rank2)),
-			strconv.Itoa(int(ranking.Rank3)),
+			ranking.Rank1,
+			ranking.Rank2,
+			ranking.Rank3,
 		})
 	}
 
diff --git a/scouting/webserver/driver_ranking/driver_ranking_test.go b/scouting/webserver/driver_ranking/driver_ranking_test.go
index 47a412e..98a60e8 100644
--- a/scouting/webserver/driver_ranking/driver_ranking_test.go
+++ b/scouting/webserver/driver_ranking/driver_ranking_test.go
@@ -28,8 +28,8 @@
 func TestDriverRankingRun(t *testing.T) {
 	var database MockDatabase
 	database.rawRankings = []db.DriverRankingData{
-		db.DriverRankingData{MatchNumber: 1, Rank1: 1234, Rank2: 1235, Rank3: 1236},
-		db.DriverRankingData{MatchNumber: 2, Rank1: 971, Rank2: 972, Rank3: 973},
+		db.DriverRankingData{MatchNumber: 1, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
+		db.DriverRankingData{MatchNumber: 2, Rank1: "971", Rank2: "972", Rank3: "973"},
 	}
 
 	GenerateFullDriverRanking(&database, "./fake_driver_rank_script")
diff --git a/scouting/webserver/match_list/match_list.go b/scouting/webserver/match_list/match_list.go
index c5af661..2ac5133 100644
--- a/scouting/webserver/match_list/match_list.go
+++ b/scouting/webserver/match_list/match_list.go
@@ -6,7 +6,6 @@
 	"github.com/frc971/971-Robot-Code/scouting/db"
 	"github.com/frc971/971-Robot-Code/scouting/scraping"
 	"log"
-	"strconv"
 	"strings"
 )
 
@@ -14,66 +13,32 @@
 	AddToMatch(db.TeamMatch) error
 }
 
-func parseTeamKey(teamKey string) (int, error) {
+func parseTeamKey(teamKey string) string {
 	// TBA prefixes teams with "frc". Not sure why. Get rid of that.
 	teamKey = strings.TrimPrefix(teamKey, "frc")
-	magnitude := 0
-	if strings.HasSuffix(teamKey, "A") {
-		magnitude = 0
-		teamKey = strings.TrimSuffix(teamKey, "A")
-	} else if strings.HasSuffix(teamKey, "B") {
-		magnitude = 9
-		teamKey = strings.TrimSuffix(teamKey, "B")
-	} else if strings.HasSuffix(teamKey, "C") {
-		magnitude = 8
-		teamKey = strings.TrimSuffix(teamKey, "C")
-	} else if strings.HasSuffix(teamKey, "D") {
-		magnitude = 7
-		teamKey = strings.TrimSuffix(teamKey, "D")
-	} else if strings.HasSuffix(teamKey, "E") {
-		magnitude = 6
-		teamKey = strings.TrimSuffix(teamKey, "E")
-	} else if strings.HasSuffix(teamKey, "F") {
-		magnitude = 5
-		teamKey = strings.TrimSuffix(teamKey, "F")
-	}
-
-	if magnitude != 0 {
-		teamKey = strconv.Itoa(magnitude) + teamKey
-	}
-
-	result, err := strconv.Atoi(teamKey)
-	return result, err
+	return teamKey
 }
 
 // Parses the alliance data from the specified match and returns the three red
 // teams and the three blue teams.
-func parseTeamKeys(match *scraping.Match) ([3]int32, [3]int32, error) {
+func parseTeamKeys(match *scraping.Match) ([3]string, [3]string, error) {
 	redKeys := match.Alliances.Red.TeamKeys
 	blueKeys := match.Alliances.Blue.TeamKeys
 
 	if len(redKeys) != 3 || len(blueKeys) != 3 {
-		return [3]int32{}, [3]int32{}, errors.New(fmt.Sprintf(
+		return [3]string{}, [3]string{}, errors.New(fmt.Sprintf(
 			"Found %d red teams and %d blue teams.", len(redKeys), len(blueKeys)))
 	}
 
-	var red [3]int32
+	var red [3]string
 	for i, key := range redKeys {
-		team, err := parseTeamKey(key)
-		if err != nil {
-			return [3]int32{}, [3]int32{}, errors.New(fmt.Sprintf(
-				"Failed to parse red %d team '%s' as integer: %v", i+1, key, err))
-		}
-		red[i] = int32(team)
+		team := parseTeamKey(key)
+		red[i] = team
 	}
-	var blue [3]int32
+	var blue [3]string
 	for i, key := range blueKeys {
-		team, err := parseTeamKey(key)
-		if err != nil {
-			return [3]int32{}, [3]int32{}, errors.New(fmt.Sprintf(
-				"Failed to parse blue %d team '%s' as integer: %v", i+1, key, err))
-		}
-		blue[i] = int32(team)
+		team := parseTeamKey(key)
+		blue[i] = team
 	}
 	return red, blue, nil
 }
@@ -97,32 +62,32 @@
 			{
 				MatchNumber: int32(match.MatchNumber),
 				SetNumber:   int32(match.SetNumber), CompLevel: match.CompLevel,
-				Alliance: "R", AlliancePosition: 1, TeamNumber: strconv.Itoa(int(red[0])),
+				Alliance: "R", AlliancePosition: 1, TeamNumber: red[0],
 			},
 			{
 				MatchNumber: int32(match.MatchNumber),
 				SetNumber:   int32(match.SetNumber), CompLevel: match.CompLevel,
-				Alliance: "R", AlliancePosition: 2, TeamNumber: strconv.Itoa(int(red[1])),
+				Alliance: "R", AlliancePosition: 2, TeamNumber: red[1],
 			},
 			{
 				MatchNumber: int32(match.MatchNumber),
 				SetNumber:   int32(match.SetNumber), CompLevel: match.CompLevel,
-				Alliance: "R", AlliancePosition: 3, TeamNumber: strconv.Itoa(int(red[2])),
+				Alliance: "R", AlliancePosition: 3, TeamNumber: red[2],
 			},
 			{
 				MatchNumber: int32(match.MatchNumber),
 				SetNumber:   int32(match.SetNumber), CompLevel: match.CompLevel,
-				Alliance: "B", AlliancePosition: 1, TeamNumber: strconv.Itoa(int(blue[0])),
+				Alliance: "B", AlliancePosition: 1, TeamNumber: blue[0],
 			},
 			{
 				MatchNumber: int32(match.MatchNumber),
 				SetNumber:   int32(match.SetNumber), CompLevel: match.CompLevel,
-				Alliance: "B", AlliancePosition: 2, TeamNumber: strconv.Itoa(int(blue[1])),
+				Alliance: "B", AlliancePosition: 2, TeamNumber: blue[1],
 			},
 			{
 				MatchNumber: int32(match.MatchNumber),
 				SetNumber:   int32(match.SetNumber), CompLevel: match.CompLevel,
-				Alliance: "B", AlliancePosition: 3, TeamNumber: strconv.Itoa(int(blue[2])),
+				Alliance: "B", AlliancePosition: 3, TeamNumber: blue[2],
 			},
 		}
 
diff --git a/scouting/webserver/rankings/rankings.go b/scouting/webserver/rankings/rankings.go
index 0d20b54..9ffa503 100644
--- a/scouting/webserver/rankings/rankings.go
+++ b/scouting/webserver/rankings/rankings.go
@@ -4,7 +4,6 @@
 	"github.com/frc971/971-Robot-Code/scouting/db"
 	"github.com/frc971/971-Robot-Code/scouting/scraping"
 	"log"
-	"strconv"
 	"strings"
 )
 
@@ -12,10 +11,10 @@
 	AddOrUpdateRankings(db.Ranking) error
 }
 
-func parseTeamKey(teamKey string) (int, error) {
+func parseTeamKey(teamKey string) string {
 	// TBA prefixes teams with "frc". Not sure why. Get rid of that.
 	teamKey = strings.TrimPrefix(teamKey, "frc")
-	return strconv.Atoi(teamKey)
+	return teamKey
 }
 
 func GetRankings(database Database, year int32, eventCode string, blueAllianceConfig string) {
@@ -26,12 +25,7 @@
 	}
 
 	for _, rank := range rankings.Rankings {
-		teamKey, err := parseTeamKey(rank.TeamKey)
-
-		if err != nil {
-			log.Println("Failed to parse team key: ", err)
-			continue
-		}
+		teamKey := parseTeamKey(rank.TeamKey)
 
 		rankingInfo := db.Ranking{
 			TeamNumber: teamKey,
diff --git a/scouting/webserver/rankings/rankings_test.go b/scouting/webserver/rankings/rankings_test.go
index 4ab3c34..748bcf8 100644
--- a/scouting/webserver/rankings/rankings_test.go
+++ b/scouting/webserver/rankings/rankings_test.go
@@ -58,15 +58,15 @@
 	}
 
 	beginningThreeExpected := []db.Ranking{
-		{TeamNumber: 359, Losses: 1, Wins: 11, Ties: 0, Rank: 1, Dq: 0},
-		{TeamNumber: 5254, Losses: 1, Wins: 11, Ties: 0, Rank: 2, Dq: 0},
-		{TeamNumber: 3990, Losses: 1, Wins: 11, Ties: 0, Rank: 3, Dq: 0},
+		{TeamNumber: "359", Losses: 1, Wins: 11, Ties: 0, Rank: 1, Dq: 0},
+		{TeamNumber: "5254", Losses: 1, Wins: 11, Ties: 0, Rank: 2, Dq: 0},
+		{TeamNumber: "3990", Losses: 1, Wins: 11, Ties: 0, Rank: 3, Dq: 0},
 	}
 
 	endThreeExpected := []db.Ranking{
-		{TeamNumber: 5943, Losses: 10, Wins: 2, Ties: 0, Rank: 34, Dq: 0},
-		{TeamNumber: 4203, Losses: 10, Wins: 2, Ties: 0, Rank: 35, Dq: 0},
-		{TeamNumber: 5149, Losses: 10, Wins: 2, Ties: 0, Rank: 36, Dq: 0},
+		{TeamNumber: "5943", Losses: 10, Wins: 2, Ties: 0, Rank: 34, Dq: 0},
+		{TeamNumber: "4203", Losses: 10, Wins: 2, Ties: 0, Rank: 35, Dq: 0},
+		{TeamNumber: "5149", Losses: 10, Wins: 2, Ties: 0, Rank: 36, Dq: 0},
 	}
 
 	if !reflect.DeepEqual(beginningThreeExpected, database.rankings[0:3]) {
diff --git a/scouting/webserver/requests/debug/cli/cli_test.py b/scouting/webserver/requests/debug/cli/cli_test.py
index b944564..d11b506 100644
--- a/scouting/webserver/requests/debug/cli/cli_test.py
+++ b/scouting/webserver/requests/debug/cli/cli_test.py
@@ -101,7 +101,7 @@
 
         # First submit some data to be added to the database.
         json_path = write_json_request({
-            "team": 100,
+            "team": "100",
             "notes": "A very inspiring and useful comment",
             "good_driving": True,
             "bad_driving": False,
@@ -124,7 +124,7 @@
         self.assertIn(
             textwrap.dedent("""\
             {
-            Team: (int32) 100,
+            Team: (string) (len=3) "100",
             Notes: (string) (len=35) "A very inspiring and useful comment",
             GoodDriving: (bool) true,
             BadDriving: (bool) false,
@@ -140,10 +140,10 @@
 
         # First submit some data to be added to the database.
         json_path = write_json_request({
-            "matchNumber": 100,
-            "rank1": 101,
-            "rank2": 202,
-            "rank3": 303,
+            "match_number": 100,
+            "rank1": "101",
+            "rank2": "202",
+            "rank3": "303",
         })
         exit_code, _, stderr = run_debug_cli(
             ["-submitDriverRanking", json_path])
@@ -160,9 +160,9 @@
             textwrap.dedent("""\
             {
             MatchNumber: (int32) 100,
-            Rank1: (int32) 101,
-            Rank2: (int32) 202,
-            Rank3: (int32) 303
+            Rank1: (string) (len=3) "101",
+            Rank2: (string) (len=3) "202",
+            Rank3: (string) (len=3) "303"
             }"""), stdout)
 
     def test_request_all_matches(self):
diff --git a/scouting/webserver/requests/messages/request_all_driver_rankings_response.fbs b/scouting/webserver/requests/messages/request_all_driver_rankings_response.fbs
index dcc9712..8ce0ef2 100644
--- a/scouting/webserver/requests/messages/request_all_driver_rankings_response.fbs
+++ b/scouting/webserver/requests/messages/request_all_driver_rankings_response.fbs
@@ -1,10 +1,10 @@
 namespace scouting.webserver.requests;
 
 table Ranking {
-    matchNumber:int (id: 0);
-    rank1:int (id: 1);
-    rank2:int (id: 2);
-    rank3:int (id: 3);
+    match_number:int (id: 0);
+    rank1:string (id: 1);
+    rank2:string (id: 2);
+    rank3:string (id: 3);
 }
 
 table RequestAllDriverRankingsResponse {
diff --git a/scouting/webserver/requests/messages/request_all_notes_response.fbs b/scouting/webserver/requests/messages/request_all_notes_response.fbs
index 70504d3..1afdf25 100644
--- a/scouting/webserver/requests/messages/request_all_notes_response.fbs
+++ b/scouting/webserver/requests/messages/request_all_notes_response.fbs
@@ -1,7 +1,7 @@
 namespace scouting.webserver.requests;
 
 table Note {
-    team:int (id: 0);
+    team:string (id: 0);
     notes:string (id: 1);
     good_driving:bool (id: 2);
     bad_driving:bool (id: 3);
diff --git a/scouting/webserver/requests/messages/request_notes_for_team.fbs b/scouting/webserver/requests/messages/request_notes_for_team.fbs
index 9bda6d3..aa93a2b 100644
--- a/scouting/webserver/requests/messages/request_notes_for_team.fbs
+++ b/scouting/webserver/requests/messages/request_notes_for_team.fbs
@@ -1,7 +1,7 @@
 namespace scouting.webserver.requests;
 
 table RequestNotesForTeam {
-    team:int (id: 0);
+    team:string (id: 0);
 }
 
 root_type RequestNotesForTeam;
diff --git a/scouting/webserver/requests/messages/submit_driver_ranking.fbs b/scouting/webserver/requests/messages/submit_driver_ranking.fbs
index ac1e218..052728c 100644
--- a/scouting/webserver/requests/messages/submit_driver_ranking.fbs
+++ b/scouting/webserver/requests/messages/submit_driver_ranking.fbs
@@ -1,10 +1,10 @@
 namespace scouting.webserver.requests;
 
 table SubmitDriverRanking {
-    matchNumber:int (id: 0);
-    rank1:int (id: 1);
-    rank2:int (id: 2);
-    rank3:int (id: 3);
+    match_number:int (id: 0);
+    rank1:string (id: 1);
+    rank2:string (id: 2);
+    rank3:string (id: 3);
 }
 
 root_type SubmitDriverRanking;
diff --git a/scouting/webserver/requests/messages/submit_notes.fbs b/scouting/webserver/requests/messages/submit_notes.fbs
index 845a601..332b612 100644
--- a/scouting/webserver/requests/messages/submit_notes.fbs
+++ b/scouting/webserver/requests/messages/submit_notes.fbs
@@ -1,7 +1,7 @@
 namespace scouting.webserver.requests;
 
 table SubmitNotes {
-    team:int (id: 0);
+    team:string (id: 0);
     notes:string (id: 1);
     good_driving:bool (id: 2);
     bad_driving:bool (id: 3);
diff --git a/scouting/webserver/requests/requests.go b/scouting/webserver/requests/requests.go
index 51612ff..af67386 100644
--- a/scouting/webserver/requests/requests.go
+++ b/scouting/webserver/requests/requests.go
@@ -84,7 +84,7 @@
 	ReturnStats2023() ([]db.Stats2023, error)
 	ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string, preScouting bool) ([]db.Stats2023, error)
 	QueryAllShifts(int) ([]db.Shift, error)
-	QueryNotes(int32) ([]string, error)
+	QueryNotes(string) ([]string, error)
 	QueryPitImages(string) ([]db.RequestedPitImage, error)
 	AddNotes(db.NotesData) error
 	AddPitImage(db.PitImage) error
@@ -367,7 +367,7 @@
 	}
 
 	err = handler.db.AddNotes(db.NotesData{
-		TeamNumber:     request.Team(),
+		TeamNumber:     string(request.Team()),
 		Notes:          string(request.Notes()),
 		GoodDriving:    bool(request.GoodDriving()),
 		BadDriving:     bool(request.BadDriving()),
@@ -671,7 +671,7 @@
 		return
 	}
 
-	notes, err := handler.db.QueryNotes(request.Team())
+	notes, err := handler.db.QueryNotes(string(request.Team()))
 	if err != nil {
 		respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to query notes: %v", err))
 		return
@@ -790,9 +790,9 @@
 
 	err = handler.db.AddDriverRanking(db.DriverRankingData{
 		MatchNumber: request.MatchNumber(),
-		Rank1:       request.Rank1(),
-		Rank2:       request.Rank2(),
-		Rank3:       request.Rank3(),
+		Rank1:       string(request.Rank1()),
+		Rank2:       string(request.Rank2()),
+		Rank3:       string(request.Rank3()),
 	})
 
 	if err != nil {
diff --git a/scouting/webserver/requests/requests_test.go b/scouting/webserver/requests/requests_test.go
index e50583b..0797bc1 100644
--- a/scouting/webserver/requests/requests_test.go
+++ b/scouting/webserver/requests/requests_test.go
@@ -449,7 +449,7 @@
 
 	builder := flatbuffers.NewBuilder(1024)
 	builder.Finish((&submit_notes.SubmitNotesT{
-		Team:           971,
+		Team:           "971",
 		Notes:          "Notes",
 		GoodDriving:    true,
 		BadDriving:     false,
@@ -467,7 +467,7 @@
 
 	expected := []db.NotesData{
 		{
-			TeamNumber:     971,
+			TeamNumber:     "971",
 			Notes:          "Notes",
 			GoodDriving:    true,
 			BadDriving:     false,
@@ -487,7 +487,7 @@
 func TestRequestNotes(t *testing.T) {
 	database := MockDatabase{
 		notes: []db.NotesData{{
-			TeamNumber:     971,
+			TeamNumber:     "971A",
 			Notes:          "Notes",
 			GoodDriving:    true,
 			BadDriving:     false,
@@ -505,7 +505,7 @@
 
 	builder := flatbuffers.NewBuilder(1024)
 	builder.Finish((&request_notes_for_team.RequestNotesForTeamT{
-		Team: 971,
+		Team: "971A",
 	}).Pack(builder))
 	response, err := debug.RequestNotes("http://localhost:8080", builder.FinishedBytes())
 	if err != nil {
@@ -714,9 +714,9 @@
 	builder := flatbuffers.NewBuilder(1024)
 	builder.Finish((&submit_driver_ranking.SubmitDriverRankingT{
 		MatchNumber: 36,
-		Rank1:       1234,
-		Rank2:       1235,
-		Rank3:       1236,
+		Rank1:       "1234",
+		Rank2:       "1235",
+		Rank3:       "1236",
 	}).Pack(builder))
 
 	_, err := debug.SubmitDriverRanking("http://localhost:8080", builder.FinishedBytes())
@@ -725,7 +725,7 @@
 	}
 
 	expected := []db.DriverRankingData{
-		{MatchNumber: 36, Rank1: 1234, Rank2: 1235, Rank3: 1236},
+		{MatchNumber: 36, Rank1: "1234", Rank2: "1235", Rank3: "1236"},
 	}
 
 	if !reflect.DeepEqual(database.driver_ranking, expected) {
@@ -739,15 +739,15 @@
 		driver_ranking: []db.DriverRankingData{
 			{
 				MatchNumber: 36,
-				Rank1:       1234,
-				Rank2:       1235,
-				Rank3:       1236,
+				Rank1:       "1234",
+				Rank2:       "1235",
+				Rank3:       "1236",
 			},
 			{
 				MatchNumber: 36,
-				Rank1:       101,
-				Rank2:       202,
-				Rank3:       303,
+				Rank1:       "101",
+				Rank2:       "202",
+				Rank3:       "303",
 			},
 		},
 	}
@@ -768,15 +768,15 @@
 		DriverRankingList: []*request_all_driver_rankings_response.RankingT{
 			{
 				MatchNumber: 36,
-				Rank1:       1234,
-				Rank2:       1235,
-				Rank3:       1236,
+				Rank1:       "1234",
+				Rank2:       "1235",
+				Rank3:       "1236",
 			},
 			{
 				MatchNumber: 36,
-				Rank1:       101,
-				Rank2:       202,
-				Rank3:       303,
+				Rank1:       "101",
+				Rank2:       "202",
+				Rank3:       "303",
 			},
 		},
 	}
@@ -795,7 +795,7 @@
 	db := MockDatabase{
 		notes: []db.NotesData{
 			{
-				TeamNumber:     971,
+				TeamNumber:     "971",
 				Notes:          "Notes",
 				GoodDriving:    true,
 				BadDriving:     false,
@@ -806,7 +806,7 @@
 				EasilyDefended: false,
 			},
 			{
-				TeamNumber:     972,
+				TeamNumber:     "972",
 				Notes:          "More Notes",
 				GoodDriving:    false,
 				BadDriving:     false,
@@ -834,7 +834,7 @@
 	expected := request_all_notes_response.RequestAllNotesResponseT{
 		NoteList: []*request_all_notes_response.NoteT{
 			{
-				Team:           971,
+				Team:           "971",
 				Notes:          "Notes",
 				GoodDriving:    true,
 				BadDriving:     false,
@@ -845,7 +845,7 @@
 				EasilyDefended: false,
 			},
 			{
-				Team:           972,
+				Team:           "972",
 				Notes:          "More Notes",
 				GoodDriving:    false,
 				BadDriving:     false,
@@ -1137,7 +1137,7 @@
 	return results, nil
 }
 
-func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
+func (database *MockDatabase) QueryNotes(requestedTeam string) ([]string, error) {
 	var results []string
 	for _, data := range database.notes {
 		if data.TeamNumber == requestedTeam {