home to your local SPACEGIRL 馃挮
arimelody.space
1package controller
2
3import (
4 "fmt"
5
6 "arimelody-web/model"
7
8 "github.com/jmoiron/sqlx"
9)
10
11func GetRelease(db *sqlx.DB, id string, full bool) (*model.Release, error) {
12 var release = model.Release{}
13
14 err := db.Get(&release, "SELECT * FROM musicrelease WHERE id=$1", id)
15 if err != nil {
16 return nil, err
17 }
18
19 if full {
20 // get credits
21 credits, err := GetReleaseCredits(db, id)
22 if err != nil {
23 return nil, fmt.Errorf("Credits: %s", err)
24 }
25 for _, credit := range credits {
26 release.Credits = append(release.Credits, credit)
27 }
28
29 // get tracks
30 tracks, err := GetReleaseTracks(db, id)
31 if err != nil {
32 return nil, fmt.Errorf("Tracks: %s", err)
33 }
34 for _, track := range tracks {
35 release.Tracks = append(release.Tracks, track)
36 }
37
38 // get links
39 links, err := GetReleaseLinks(db, id)
40 if err != nil {
41 return nil, fmt.Errorf("Links: %s", err)
42 }
43 for _, link := range links {
44 release.Links = append(release.Links, link)
45 }
46 }
47
48 return &release, nil
49}
50
51func GetAllReleases(db *sqlx.DB, onlyVisible bool, limit int, full bool) ([]*model.Release, error) {
52 var releases = []*model.Release{}
53
54 query := "SELECT * FROM musicrelease"
55 if onlyVisible {
56 query += " WHERE visible=true"
57 }
58 query += " ORDER BY release_date DESC"
59 var err error
60 if limit > 0 {
61 err = db.Select(&releases, query + " LIMIT $1", limit)
62 } else {
63 err = db.Select(&releases, query)
64 }
65 if err != nil {
66 return nil, err
67 }
68
69 for _, release := range releases {
70 // get credits
71 credits, err := GetReleaseCredits(db, release.ID)
72 if err != nil {
73 return nil, fmt.Errorf("Credits: %s", err)
74 }
75 for _, credit := range credits {
76 release.Credits = append(release.Credits, credit)
77 }
78
79 if full {
80 // get tracks
81 tracks, err := GetReleaseTracks(db, release.ID)
82 if err != nil {
83 return nil, fmt.Errorf("Tracks: %s", err)
84 }
85 for _, track := range tracks {
86 release.Tracks = append(release.Tracks, track)
87 }
88
89 // get links
90 links, err := GetReleaseLinks(db, release.ID)
91 if err != nil {
92 return nil, fmt.Errorf("Links: %s", err)
93 }
94 for _, link := range links {
95 release.Links = append(release.Links, link)
96 }
97 }
98 }
99
100 return releases, nil
101}
102func GetReleaseCount(db *sqlx.DB, onlyVisible bool) (int, error) {
103 query := "SELECT count(*) FROM musicrelease"
104 if onlyVisible {
105 query += " WHERE visible=true"
106 }
107
108 var count int
109 err := db.Get(&count, query)
110
111 return count, err
112}
113
114func CreateRelease(db *sqlx.DB, release *model.Release) error {
115 _, err := db.Exec(
116 "INSERT INTO musicrelease "+
117 "(id, visible, title, description, type, release_date, artwork, buyname, buylink, copyright, copyrighturl) "+
118 "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)",
119 release.ID,
120 release.Visible,
121 release.Title,
122 release.Description,
123 release.ReleaseType,
124 release.ReleaseDate.Format("2006-01-02 15:04:05"),
125 release.Artwork,
126 release.Buyname,
127 release.Buylink,
128 release.Copyright,
129 release.CopyrightURL,
130 )
131 if err != nil {
132 return err
133 }
134
135 return nil
136}
137
138func UpdateRelease(db *sqlx.DB, release *model.Release) error {
139 _, err := db.Exec(
140 "UPDATE musicrelease SET "+
141 "visible=$2, title=$3, description=$4, type=$5, release_date=$6, artwork=$7, buyname=$8, buylink=$9, copyright=$10, copyrighturl=$11 "+
142 "WHERE id=$1",
143 release.ID,
144 release.Visible,
145 release.Title,
146 release.Description,
147 release.ReleaseType,
148 release.ReleaseDate.Format("2006-01-02 15:04:05"),
149 release.Artwork,
150 release.Buyname,
151 release.Buylink,
152 release.Copyright,
153 release.CopyrightURL,
154 )
155 if err != nil {
156 return err
157 }
158
159 return nil
160}
161
162func UpdateReleaseTracks(db *sqlx.DB, releaseID string, new_tracks []string) error {
163 tx, err := db.Begin()
164 if err != nil {
165 return err
166 }
167
168 _, err = tx.Exec("DELETE FROM musicreleasetrack WHERE release=$1", releaseID)
169 if err != nil {
170 return err
171 }
172 for i, trackID := range new_tracks {
173 _, err = tx.Exec(
174 "INSERT INTO musicreleasetrack "+
175 "(release, track, number) "+
176 "VALUES ($1, $2, $3)",
177 releaseID,
178 trackID,
179 i)
180 if err != nil {
181 return err
182 }
183 }
184
185 err = tx.Commit()
186 if err != nil {
187 return err
188 }
189
190 return nil
191}
192
193func UpdateReleaseCredits(db *sqlx.DB, releaseID string, new_credits []*model.Credit) error {
194 tx, err := db.Begin()
195 if err != nil {
196 return err
197 }
198
199 _, err = tx.Exec("DELETE FROM musiccredit WHERE release=$1", releaseID)
200 if err != nil {
201 return err
202 }
203 for _, credit := range new_credits {
204 _, err = tx.Exec(
205 "INSERT INTO musiccredit "+
206 "(release, artist, role, is_primary) "+
207 "VALUES ($1, $2, $3, $4)",
208 releaseID,
209 credit.Artist.ID,
210 credit.Role,
211 credit.Primary,
212 )
213 if err != nil {
214 return err
215 }
216 }
217
218 err = tx.Commit()
219 if err != nil {
220 return err
221 }
222
223 return nil
224}
225
226func UpdateReleaseLinks(db *sqlx.DB, releaseID string, new_links []*model.Link) error {
227 tx, err := db.Begin()
228 if err != nil {
229 return err
230 }
231
232 _, err = tx.Exec("DELETE FROM musiclink WHERE release=$1", releaseID)
233 if err != nil {
234 return err
235 }
236 for _, link := range new_links {
237 _, err := tx.Exec(
238 "INSERT INTO musiclink "+
239 "(release, name, url) "+
240 "VALUES ($1, $2, $3)",
241 releaseID,
242 link.Name,
243 link.URL,
244 )
245 if err != nil {
246 return err
247 }
248 }
249
250 err = tx.Commit()
251 if err != nil {
252 return err
253 }
254
255 return nil
256}
257
258func DeleteRelease(db *sqlx.DB, releaseID string) error {
259 _, err := db.Exec(
260 "DELETE FROM musicrelease "+
261 "WHERE id=$1",
262 releaseID,
263 )
264 if err != nil {
265 return err
266 }
267
268 return nil
269}
270
271func GetReleaseTracks(db *sqlx.DB, releaseID string) ([]*model.Track, error) {
272 var tracks = []*model.Track{}
273
274 err := db.Select(&tracks,
275 "SELECT musictrack.* FROM musictrack "+
276 "JOIN musicreleasetrack ON track=id "+
277 "WHERE release=$1 "+
278 "ORDER BY number ASC",
279 releaseID,
280 )
281 if err != nil {
282 return nil, err
283 }
284
285 return tracks, nil
286}
287
288func GetReleaseCredits(db *sqlx.DB, releaseID string) ([]*model.Credit, error) {
289 rows, err := db.Query(
290 "SELECT artist.id,artist.name,artist.website,artist.avatar,role,is_primary "+
291 "FROM musiccredit "+
292 "JOIN artist ON artist=artist.id "+
293 "JOIN musicrelease ON release=musicrelease.id "+
294 "WHERE musicrelease.id=$1 "+
295 "ORDER BY is_primary DESC",
296 releaseID,
297 )
298 if err != nil {
299 return nil, err
300 }
301
302 var credits []*model.Credit
303 for rows.Next() {
304 credit := model.Credit{}
305 rows.Scan(
306 &credit.Artist.ID,
307 &credit.Artist.Name,
308 &credit.Artist.Website,
309 &credit.Artist.Avatar,
310 &credit.Role,
311 &credit.Primary)
312 credits = append(credits, &credit)
313 }
314
315 return credits, nil
316}
317
318func GetReleaseLinks(db *sqlx.DB, releaseID string) ([]*model.Link, error) {
319 var links = []*model.Link{}
320
321 err := db.Select(&links, "SELECT name,url FROM musiclink WHERE release=$1", releaseID)
322 if err != nil {
323 return nil, err
324 }
325
326 return links, nil
327}