Split JSON rankings API into its own file.

This commit is contained in:
Patrick Fairbank
2014-07-11 20:29:47 -07:00
parent c8b5564884
commit f39f210b54
4 changed files with 84 additions and 32 deletions

38
api.go Normal file
View File

@@ -0,0 +1,38 @@
// Copyright 2014 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
//
// Web API for providing JSON-formatted event data.
package main
import (
"encoding/json"
"io"
"net/http"
)
// Generates a JSON dump of the qualification rankings.
func RankingsApiHandler(w http.ResponseWriter, r *http.Request) {
rankings, err := db.GetAllRankings()
if err != nil {
handleWebErr(w, err)
return
}
if rankings == nil {
// Go marshals an empty slice to null, so explicitly create it so that it appears as an empty JSON array.
rankings = make([]Ranking, 0)
}
data, err := json.MarshalIndent(rankings, "", " ")
if err != nil {
handleWebErr(w, err)
return
}
w.Header().Set("Content-Type", "application/json")
_, err = io.WriteString(w, string(data))
if err != nil {
handleWebErr(w, err)
return
}
}

38
api_test.go Normal file
View File

@@ -0,0 +1,38 @@
// Copyright 2014 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
package main
import (
"encoding/json"
"github.com/stretchr/testify/assert"
"testing"
)
func TestRankingsApi(t *testing.T) {
clearDb()
defer clearDb()
db, _ = OpenDatabase(testDbPath)
// Test that empty rankings produces an empty array.
recorder := getHttpResponse("/api/rankings")
assert.Equal(t, 200, recorder.Code)
assert.Equal(t, "application/json", recorder.HeaderMap["Content-Type"][0])
assert.Equal(t, "[]", recorder.Body.String())
ranking1 := Ranking{1114, 2, 18, 1100, 625, 90, 554, 0.254, 9, 1, 0, 0, 10}
ranking2 := Ranking{254, 1, 20, 1100, 625, 90, 554, 0.254, 10, 0, 0, 0, 10}
db.CreateRanking(&ranking1)
db.CreateRanking(&ranking2)
recorder = getHttpResponse("/api/rankings")
assert.Equal(t, 200, recorder.Code)
assert.Equal(t, "application/json", recorder.HeaderMap["Content-Type"][0])
var jsonRankings []Ranking
err := json.Unmarshal([]byte(recorder.Body.String()), &jsonRankings)
assert.Nil(t, err)
if assert.Equal(t, 2, len(jsonRankings)) {
assert.Equal(t, ranking1, jsonRankings[1])
assert.Equal(t, ranking2, jsonRankings[0])
}
}

View File

@@ -7,10 +7,8 @@ package main
import (
"code.google.com/p/gofpdf"
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"io"
"net/http"
"strconv"
"text/template"
@@ -38,28 +36,6 @@ func RankingsCsvReportHandler(w http.ResponseWriter, r *http.Request) {
}
}
// Generates a JSON-formatted report of the qualification rankings.
func RankingsJSONReportHandler(w http.ResponseWriter, r *http.Request) {
rankings, err := db.GetAllRankings()
if err != nil {
handleWebErr(w, err)
return
}
w.Header().Set("Content-Type", "text/plain")
data, err := json.MarshalIndent(rankings, "", " ")
if err != nil {
handleWebErr(w, err)
return
}
_, err = io.WriteString(w, string(data))
if err != nil {
handleWebErr(w, err)
return
}
}
// Generates a PDF-formatted report of the qualification rankings.
func RankingsPdfReportHandler(w http.ResponseWriter, r *http.Request) {
rankings, err := db.GetAllRankings()

16
web.go
View File

@@ -125,14 +125,14 @@ func newHandler() http.Handler {
router.HandleFunc("/match_review", MatchReviewHandler).Methods("GET")
router.HandleFunc("/match_review/{matchId}/edit", MatchReviewEditGetHandler).Methods("GET")
router.HandleFunc("/match_review/{matchId}/edit", MatchReviewEditPostHandler).Methods("POST")
router.HandleFunc("/reports/csv/rankings", RankingsCsvReportHandler)
router.HandleFunc("/reports/pdf/rankings", RankingsPdfReportHandler)
router.HandleFunc("/reports/json/rankings", RankingsJSONReportHandler)
router.HandleFunc("/reports/csv/schedule/{type}", ScheduleCsvReportHandler)
router.HandleFunc("/reports/pdf/schedule/{type}", SchedulePdfReportHandler)
router.HandleFunc("/reports/csv/teams", TeamsCsvReportHandler)
router.HandleFunc("/reports/pdf/teams", TeamsPdfReportHandler)
router.HandleFunc("/", IndexHandler)
router.HandleFunc("/reports/csv/rankings", RankingsCsvReportHandler).Methods("GET")
router.HandleFunc("/reports/pdf/rankings", RankingsPdfReportHandler).Methods("GET")
router.HandleFunc("/reports/csv/schedule/{type}", ScheduleCsvReportHandler).Methods("GET")
router.HandleFunc("/reports/pdf/schedule/{type}", SchedulePdfReportHandler).Methods("GET")
router.HandleFunc("/reports/csv/teams", TeamsCsvReportHandler).Methods("GET")
router.HandleFunc("/reports/pdf/teams", TeamsPdfReportHandler).Methods("GET")
router.HandleFunc("/api/rankings", RankingsApiHandler).Methods("GET")
router.HandleFunc("/", IndexHandler).Methods("GET")
return router
}