home to your local SPACEGIRL 馃挮 arimelody.space
at dev 327 lines 8.2 kB view raw
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}