package music import ( "arimelody.me/arimelody.me/music/model" "github.com/jmoiron/sqlx" ) func GetRelease(db *sqlx.DB, id string) (*model.Release, error) { var releases = model.Release{} err := db.Get(&releases, "SELECT * FROM musicrelease WHERE id=$1", id) if err != nil { return nil, err } return &releases, nil } func GetAllReleases(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 } return releases, nil } func GetReleaseTracks(db *sqlx.DB, release *model.Release) ([]*model.Track, error) { var tracks = []*model.Track{} err := db.Select(&tracks, "SELECT musictrack.* FROM musictrack "+ "JOIN musicreleasetrack ON track=id "+ "WHERE release=$1 "+ "ORDER BY number ASC", release.ID, ) if err != nil { return nil, err } return tracks, nil } func CreateRelease(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("2006-01-02 15:04:05"), release.Artwork, release.Buyname, release.Buylink, ) if err != nil { return err } return nil } func UpdateRelease(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 "+ "WHERE id=$1", release.ID, release.Visible, release.Title, release.Description, release.ReleaseType, release.ReleaseDate.Format("2006-01-02 15:04:05"), release.Artwork, release.Buyname, release.Buylink, ) if err != nil { return err } return nil } func UpdateReleaseTracks(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 UpdateReleaseCredits(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 UpdateReleaseLinks(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 DeleteRelease(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 } func GetFullRelease(db *sqlx.DB, release *model.Release) (*model.FullRelease, error) { // get credits credits, err := GetReleaseCredits(db, release) if err != nil { return nil, err } // get tracks dbTracks, err := GetReleaseTracks(db, release) if err != nil { return nil, err } tracks := []model.DisplayTrack{} for i, track := range dbTracks { tracks = append(tracks, track.MakeDisplay(i + 1)) } // get links links, err := GetReleaseLinks(db, release) if err != nil { return nil, err } return &model.FullRelease{ Release: release, Tracks: tracks, Credits: credits, Links: links, }, nil }