From 77e8096674b1378f8785d04f3bdad2397b946dd1 Mon Sep 17 00:00:00 2001 From: Jacob Casper Date: Thu, 16 Apr 2020 16:47:44 -0500 Subject: [PATCH] Add genre endpoint --- main.go | 3 ++ routes/genre/genre.go | 68 +++++++++++++++++++++++++++++++++++++++++++ types/genre.go | 6 ++++ 3 files changed, 77 insertions(+) create mode 100644 routes/genre/genre.go create mode 100644 types/genre.go diff --git a/main.go b/main.go index 898a48d..81803f7 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "git.jacobcasper.com/brackets/env" "git.jacobcasper.com/brackets/routes/artist" + "git.jacobcasper.com/brackets/routes/genre" _ "github.com/mattn/go-sqlite3" "log" "net/http" @@ -24,5 +25,7 @@ func main() { artist.Add(env), ) + http.HandleFunc("/genre", genre.Index(env)) + log.Fatal(http.ListenAndServe(":8080", nil)) } diff --git a/routes/genre/genre.go b/routes/genre/genre.go new file mode 100644 index 0000000..ebaa709 --- /dev/null +++ b/routes/genre/genre.go @@ -0,0 +1,68 @@ +package genre + +import ( + "encoding/json" + "git.jacobcasper.com/brackets/env" + "git.jacobcasper.com/brackets/routes" + "git.jacobcasper.com/brackets/types" + "log" + "net/http" +) + +func Index(env *env.Env) routes.Handler { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + return + } + + w.Header().Set("Content-Type", "application/json") + + genreName := r.FormValue("name") + if genreName != "" { + genre := types.Genre{} + row := env.Db.Db.QueryRow("SELECT ID, NAME FROM GENRE WHERE NAME = lower(?)", genreName) + if err := row.Scan(&genre.ID, &genre.Name); err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + b, err := json.Marshal(genre) + if err != nil { + log.Print(err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + w.Write(b) + return + } + + rows, err := env.Db.Db.Query("SELECT ID, NAME FROM GENRE LIMIT 20") + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + defer rows.Close() + + genres := make([]types.Genre, 0) + for rows.Next() { + genre := types.Genre{} + if err := rows.Scan(&genre.ID, &genre.Name); err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + genres = append(genres, genre) + } + if err = rows.Err(); err != nil { + log.Print(err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + b, err := json.Marshal(genres) + if err != nil { + log.Print(err) + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + w.Write(b) + } +} diff --git a/types/genre.go b/types/genre.go new file mode 100644 index 0000000..708b48b --- /dev/null +++ b/types/genre.go @@ -0,0 +1,6 @@ +package types + +type Genre struct { + ID int `json:"id"` + Name string `json:"name"` +} -- 2.20.1