Commit | Line | Data |
---|---|---|
2400eea4 JC |
1 | package artist |
2 | ||
3 | import ( | |
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 |
14 | func 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 | 29 | SELECT ID, NAME, POPULARITY |
9a3c373c JC |
30 | FROM ARTIST |
31 | WHERE 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 | 49 | SELECT ID, NAME, POPULARITY |
9a3c373c JC |
50 | FROM ARTIST |
51 | LIMIT 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 |
83 | func 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(` |
108 | INSERT INTO ARTIST | |
30baa977 JC |
109 | (ID, NAME, POPULARITY) |
110 | VALUES (?, ?, ?)`, | |
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(` | |
119 | SELECT ID | |
120 | FROM GENRE | |
121 | WHERE 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(` |
129 | INSERT INTO GENRE | |
130 | (NAME) | |
131 | VALUES (?)`, | |
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(` |
149 | INSERT INTO ARTIST_GENRE_XREF | |
150 | (ARTIST_ID, GENRE_ID) | |
151 | VALUES (?, ?)`, | |
152 | artist.ID, | |
153 | genreId, | |
154 | ) | |
2400eea4 JC |
155 | } |
156 | w.WriteHeader(http.StatusCreated) | |
157 | } | |
158 | } | |
eac0dfd6 JC |
159 | |
160 | func 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 | 174 | SELECT a.ID, a.NAME, a.POPULARITY |
9a3c373c JC |
175 | FROM ARTIST a |
176 | JOIN ARTIST_GENRE_XREF x ON a.ID = x.ARTIST_ID | |
177 | JOIN GENRE g ON g.ID = x.GENRE_ID | |
178 | WHERE 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 | } |