Move backend to subdir
[brackets.git] / backend / routes / genre / genre.go
diff --git a/backend/routes/genre/genre.go b/backend/routes/genre/genre.go
new file mode 100644 (file)
index 0000000..06dfa8e
--- /dev/null
@@ -0,0 +1,77 @@
+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)
+       }
+}