scouting: Migrate database code to gorm

This patch migrates our `db.go` from raw SQL code to the gorm library.
https://gorm.io/index.html

It's not fantastic, but it's better than what we had. We might want to
investigate other ORMs later.

The functionality should be the same as before.

Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: I986f74361fef1fac50b5499118b0af1d237f85f1
diff --git a/scouting/webserver/main.go b/scouting/webserver/main.go
index 5d4ab01..d2fbdfe 100644
--- a/scouting/webserver/main.go
+++ b/scouting/webserver/main.go
@@ -117,7 +117,7 @@
 	if err != nil {
 		log.Fatal("Failed to connect to database: ", err)
 	}
-	defer database.Close()
+	defer database.Delete()
 
 	scrapeMatchList := func(year int32, eventCode string) ([]scraping.Match, error) {
 		if *blueAllianceConfigPtr == "" {
diff --git a/scouting/webserver/requests/requests.go b/scouting/webserver/requests/requests.go
index 7464875..0ffeaee 100644
--- a/scouting/webserver/requests/requests.go
+++ b/scouting/webserver/requests/requests.go
@@ -66,8 +66,8 @@
 	QueryMatches(int32) ([]db.Match, error)
 	QueryAllShifts(int) ([]db.Shift, error)
 	QueryStats(int) ([]db.Stats, error)
-	QueryNotes(int32) (db.NotesData, error)
-	AddNotes(db.NotesData) error
+	QueryNotes(int32) ([]string, error)
+	AddNotes(int, string) error
 }
 
 type ScrapeMatchList func(int32, string) ([]scraping.Match, error)
@@ -470,10 +470,7 @@
 		return
 	}
 
-	err = handler.db.AddNotes(db.NotesData{
-		TeamNumber: request.Team(),
-		Notes:      []string{string(request.Notes())},
-	})
+	err = handler.db.AddNotes(int(request.Team()), string(request.Notes()))
 	if err != nil {
 		respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to insert notes: %v", err))
 		return
@@ -501,14 +498,14 @@
 		return
 	}
 
-	notesData, err := handler.db.QueryNotes(request.Team())
+	notes, err := handler.db.QueryNotes(request.Team())
 	if err != nil {
 		respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to query notes: %v", err))
 		return
 	}
 
 	var response RequestNotesForTeamResponseT
-	for _, data := range notesData.Notes {
+	for _, data := range notes {
 		response.Notes = append(response.Notes, &request_notes_for_team_response.NoteT{data})
 	}
 
diff --git a/scouting/webserver/requests/requests_test.go b/scouting/webserver/requests/requests_test.go
index 44fd5db..24c99f6 100644
--- a/scouting/webserver/requests/requests_test.go
+++ b/scouting/webserver/requests/requests_test.go
@@ -324,7 +324,7 @@
 	}
 
 	expected := []db.NotesData{
-		{TeamNumber: 971, Notes: []string{"Notes"}},
+		{TeamNumber: 971, Notes: "Notes"},
 	}
 
 	if !reflect.DeepEqual(database.notes, expected) {
@@ -336,7 +336,7 @@
 	database := MockDatabase{
 		notes: []db.NotesData{{
 			TeamNumber: 971,
-			Notes:      []string{"Notes"},
+			Notes:      "Notes",
 		}},
 	}
 	scoutingServer := server.NewScoutingServer()
@@ -584,18 +584,21 @@
 	return []db.Stats{}, nil
 }
 
-func (database *MockDatabase) QueryNotes(requestedTeam int32) (db.NotesData, error) {
+func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
 	var results []string
 	for _, data := range database.notes {
 		if data.TeamNumber == requestedTeam {
-			results = append(results, data.Notes[0])
+			results = append(results, data.Notes)
 		}
 	}
-	return db.NotesData{TeamNumber: requestedTeam, Notes: results}, nil
+	return results, nil
 }
 
-func (database *MockDatabase) AddNotes(data db.NotesData) error {
-	database.notes = append(database.notes, data)
+func (database *MockDatabase) AddNotes(teamNumber int, notes string) error {
+	database.notes = append(database.notes, db.NotesData{
+		TeamNumber: int32(teamNumber),
+		Notes:      notes,
+	})
 	return nil
 }