Send CORS Header for app
[brackets.git] / backend / routes / artist / artist.go
CommitLineData
2400eea4
JC
1package artist
2
3import (
d7efcbb7 4 "database/sql"
2353fc58 5 "encoding/json"
2400eea4
JC
6 "git.jacobcasper.com/brackets/env"
7 "git.jacobcasper.com/brackets/routes"
2353fc58 8 "git.jacobcasper.com/brackets/types"
2400eea4
JC
9 "github.com/zmb3/spotify"
10 "log"
11 "net/http"
12)
13
2353fc58
JC
14func Index(env *env.Env) routes.Handler {
15 return func(w http.ResponseWriter, r *http.Request) {
16 if r.Method != "GET" {
17 http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
18 return
19 }
20
fc4e3648
JC
21 w.Header().Set("Access-Control-Allow-Origin", env.CorsOrigin)
22 w.Header().Set("Vary", "Origin")
2353fc58
JC
23 w.Header().Set("Content-Type", "application/json")
24
25 artistId := r.FormValue("id")
26 if artistId != "" {
27 artist := types.Artist{}
9a3c373c 28 row := env.Db.Db.QueryRow(`
30baa977 29SELECT ID, NAME, POPULARITY
9a3c373c
JC
30FROM ARTIST
31WHERE ID = ?`,
32 artistId,
33 )
30baa977 34 if err := row.Scan(&artist.ID, &artist.Name, &artist.Popularity); err != nil {
2353fc58
JC
35 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
36 return
37 }
38 b, err := json.Marshal(artist)
39 if err != nil {
40 log.Print(err)
41 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
42 return
43 }
44 w.Write(b)
45 return
46 }
47
9a3c373c 48 rows, err := env.Db.Db.Query(`
30baa977 49SELECT ID, NAME, POPULARITY
9a3c373c
JC
50FROM ARTIST
51LIMIT 20`,
52 )
2353fc58
JC
53 if err != nil {
54 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
55 return
56 }
57 defer rows.Close()
58
59 artists := make([]types.Artist, 0)
60 for rows.Next() {
61 artist := types.Artist{}
30baa977 62 if err := rows.Scan(&artist.ID, &artist.Name, &artist.Popularity); err != nil {
2353fc58
JC
63 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
64 return
65 }
66 artists = append(artists, artist)
67 }
68 if err = rows.Err(); err != nil {
69 log.Print(err)
70 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
71 return
72 }
73 b, err := json.Marshal(artists)
74 if err != nil {
75 log.Print(err)
76 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
77 return
78 }
79 w.Write(b)
80 }
81}
82
2400eea4
JC
83func Add(env *env.Env) routes.Handler {
84 return func(w http.ResponseWriter, r *http.Request) {
85 if r.Method != "POST" {
86 http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
87 return
88 }
89
90 r.ParseForm()
91 artistId := r.PostForm.Get("id")
92
93 if artistId == "" {
94 http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
95 return
96 }
97
98 artist, err := env.C.GetArtist(spotify.ID(artistId))
99 if err != nil {
100 log.Printf("Failed to retrieve artist %s: %s", artistId, err.Error())
101 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
102 return
103 }
104
105 env.Db.Mu.Lock()
106 defer env.Db.Mu.Unlock()
9a3c373c
JC
107 env.Db.Db.Exec(`
108INSERT INTO ARTIST
30baa977
JC
109(ID, NAME, POPULARITY)
110VALUES (?, ?, ?)`,
9a3c373c
JC
111 artist.ID,
112 artist.Name,
30baa977 113 artist.Popularity,
9a3c373c 114 )
2400eea4
JC
115
116 for _, genre := range artist.Genres {
d7efcbb7
JC
117 var genreId int64
118 row := env.Db.Db.QueryRow(`
119SELECT ID
120FROM GENRE
121WHERE NAME = lower(?)
122`,
9a3c373c
JC
123 genre,
124 )
d7efcbb7
JC
125
126 err := row.Scan(&genreId)
127 if err == sql.ErrNoRows {
9a3c373c
JC
128 result, err := env.Db.Db.Exec(`
129INSERT INTO GENRE
130(NAME)
131VALUES (?)`,
132 genre,
133 )
d7efcbb7
JC
134 if err != nil {
135 log.Printf("Failed to insert genre %s: %s", genre, err.Error())
136 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
137 return
138 }
139
140 genreId, err = result.LastInsertId()
141 if err != nil {
142 log.Print("Failed to retrieve last insert id: ", err.Error())
143 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
144 return
145 }
2400eea4
JC
146 }
147
9a3c373c
JC
148 env.Db.Db.Exec(`
149INSERT INTO ARTIST_GENRE_XREF
150(ARTIST_ID, GENRE_ID)
151VALUES (?, ?)`,
152 artist.ID,
153 genreId,
154 )
2400eea4
JC
155 }
156 w.WriteHeader(http.StatusCreated)
157 }
158}
eac0dfd6
JC
159
160func ByGenre(env *env.Env) routes.Handler {
161 return func(w http.ResponseWriter, r *http.Request) {
162 if r.Method != "GET" {
163 http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
164 return
165 }
166
fc4e3648
JC
167 w.Header().Set("Access-Control-Allow-Origin", env.CorsOrigin)
168 w.Header().Set("Vary", "Origin")
eac0dfd6 169 w.Header().Set("Content-Type", "application/json")
fc4e3648 170
eac0dfd6
JC
171 genreName := r.FormValue("genre_name")
172 if genreName != "" {
9a3c373c 173 rows, err := env.Db.Db.Query(`
24af1ddf 174SELECT a.ID, a.NAME, a.POPULARITY
9a3c373c
JC
175FROM ARTIST a
176JOIN ARTIST_GENRE_XREF x ON a.ID = x.ARTIST_ID
177JOIN GENRE g ON g.ID = x.GENRE_ID
178WHERE g.NAME = lower(?)
179`,
180 genreName,
181 )
eac0dfd6
JC
182 if err != nil {
183 log.Print(err)
184 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
185 return
186 }
187 defer rows.Close()
188
189 artists := make([]types.Artist, 0)
190 for rows.Next() {
191 artist := types.Artist{}
30baa977 192 if err := rows.Scan(&artist.ID, &artist.Name, &artist.Popularity); err != nil {
24af1ddf 193 log.Print(err)
eac0dfd6
JC
194 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
195 return
196 }
197 artists = append(artists, artist)
198 }
199 if err = rows.Err(); err != nil {
200 log.Print(err)
201 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
202 return
203 }
204 b, err := json.Marshal(artists)
205 if err != nil {
206 log.Print(err)
207 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
208 return
209 }
210 w.Write(b)
211 }
212 }
213}