package music import ( "errors" "fmt" "arimelody.me/arimelody.me/global" "arimelody.me/arimelody.me/music/model" "github.com/jmoiron/sqlx" ) // DATABASE func PullAllReleases(db *sqlx.DB) ([]*model.Release, error) { var releases = []*model.Release{} err := db.Select(&releases, "SELECT * FROM musicrelease ORDER BY release_date DESC") if err != nil { return nil, err } for _, release := range releases { release.Credits, err = PullReleaseCredits(global.DB, release.ID) if err != nil { fmt.Printf("Error pulling credits for %s: %s\n", release.ID, err) release.Credits = []*model.Credit{} } release.Links, err = PullReleaseLinks(global.DB, release.ID) if err != nil { fmt.Printf("Error pulling links for %s: %s\n", release.ID, err) release.Links = []*model.Link{} } release.Tracks, err = PullReleaseTracksDB(global.DB, release) if err != nil { fmt.Printf("Error pulling tracks for %s: %s\n", release.ID, err) release.Tracks = []*model.Track{} } } return releases, nil } func PullReleaseTracksDB(db *sqlx.DB, release *model.Release) ([]*model.Track, error) { var track_rows = []string{} var tracks = []*model.Track{} err := db.Select(&track_rows, "SELECT track FROM musicreleasetrack "+ "WHERE release=$1 "+ "ORDER BY number DESC", release.ID, ) if err != nil { return nil, err } for _, trackID := range track_rows { var track = global.GetTrack(trackID) if track == nil { return nil, errors.New("Recieved a track from the DB that does not exist in memory") } track.Release = release tracks = append(tracks, track) } return tracks, nil } func CreateReleaseDB(db *sqlx.DB, release *model.Release) error { _, err := db.Exec( "INSERT INTO musicrelease "+ "(id, visible, title, description, type, release_date, artwork, buyname, buylink) "+ "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)", release.ID, release.Visible, release.Title, release.Description, release.ReleaseType, release.ReleaseDate.Format("2-Jan-2006"), release.Artwork, release.Buyname, release.Buylink, ) if err != nil { return err } return nil } func UpdateReleaseDB(db *sqlx.DB, release *model.Release) error { _, err := db.Exec( "UPDATE musicrelease SET "+ "visible=$2, title=$3, description=$4, type=$5, release_date=$6, artwork=$7, buyname=$8, buylink=$9) "+ "VALUES ($2, $3, $4, $5, $6, $7, $8, $9) "+ "WHERE id=$1", release.ID, release.Visible, release.Title, release.Description, release.ReleaseType, release.ReleaseDate.Format("2-Jan-2006"), release.Artwork, release.Buyname, release.Buylink, ) if err != nil { return err } return nil } func UpdateReleaseTracksDB(db *sqlx.DB, release *model.Release, new_tracks []*model.Track) error { _, err := db.Exec( "DELETE FROM musicreleasetrack "+ "WHERE release=$1", release.ID, ) if err != nil { return err } for i, track := range new_tracks { _, err = db.Exec( "INSERT INTO musicreleasetrack "+ "(release, track, number) "+ "VALUES ($1, $2, $3)", release.ID, track.ID, i, ) if err != nil { return err } } return nil } func UpdateReleaseCreditsDB(db *sqlx.DB, release *model.Release, new_credits []*model.Credit) error { _, err := db.Exec( "DELETE FROM musiccredit "+ "WHERE release=$1", release.ID, ) if err != nil { return err } for _, credit := range new_credits { _, err = db.Exec( "INSERT INTO musiccredit "+ "(release, artist, role, is_primary) "+ "VALUES ($1, $2, $3, $4)", release.ID, credit.Artist.ID, credit.Role, credit.Primary, ) if err != nil { return err } } return nil } func UpdateReleaseLinksDB(db *sqlx.DB, release *model.Release, new_links []*model.Link) error { _, err := db.Exec( "DELETE FROM musiclink "+ "WHERE release=$1", release.ID, ) if err != nil { return err } for _, link := range new_links { _, err = db.Exec( "INSERT INTO musiclink "+ "(release, name, url) "+ "VALUES ($1, $2, $3)", release.ID, link.Name, link.URL, ) if err != nil { return err } } return nil } func DeleteReleaseDB(db *sqlx.DB, release *model.Release) error { _, err := db.Exec( "DELETE FROM musicrelease "+ "WHERE id=$1", release.ID, ) if err != nil { return err } return nil }