Add genre endpoint
authorJacob Casper <dev@jacobcasper.com>
Thu, 16 Apr 2020 21:47:44 +0000 (16:47 -0500)
committerJacob Casper <dev@jacobcasper.com>
Fri, 17 Apr 2020 00:20:10 +0000 (19:20 -0500)
main.go
routes/genre/genre.go [new file with mode: 0644]
types/genre.go [new file with mode: 0644]

diff --git a/main.go b/main.go
index 898a48d..81803f7 100644 (file)
--- 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 (file)
index 0000000..ebaa709
--- /dev/null
@@ -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 (file)
index 0000000..708b48b
--- /dev/null
@@ -0,0 +1,6 @@
+package types
+
+type Genre struct {
+       ID   int    `json:"id"`
+       Name string `json:"name"`
+}