arimelody-web/repository/music/artist_postgres.go

155 lines
4.5 KiB
Go
Raw Normal View History

package music
import (
"arimelody-web/model"
)
func (repo *MusicRepositoryPostgres) GetAllArtists() ([]*model.Artist, error) {
var artists = []*model.Artist{}
err := repo.db.Select(&artists, "SELECT * FROM artist")
if err != nil {
return nil, err
}
return artists, nil
}
func (repo *MusicRepositoryPostgres) GetArtistCount() (int, error) {
var count int
err := repo.db.Get(&count, "SELECT count(*) FROM artist")
return count, err
}
func (repo *MusicRepositoryPostgres) GetArtistByID(id string) (*model.Artist, error) {
var artist = model.Artist{}
err := repo.db.Get(&artist, "SELECT * FROM artist WHERE id=$1", id)
if err != nil {
return nil, err
}
return &artist, nil
}
func (repo *MusicRepositoryPostgres) GetArtistsNotOnRelease(releaseID string) ([]*model.Artist, error) {
var artists = []*model.Artist{}
err := repo.db.Select(&artists,
"SELECT * FROM artist "+
"WHERE id NOT IN "+
"(SELECT artist FROM musiccredit WHERE release=$1)",
2024-09-02 00:15:23 +01:00
releaseID)
if err != nil {
return nil, err
}
return artists, nil
}
func (repo *MusicRepositoryPostgres) GetArtistCredits(artistID string, showHidden bool) ([]*model.Credit, error) {
var query string = "SELECT release.id,title,artwork,release_date,artist.id,name,website,avatar,role,is_primary "+
2024-09-03 08:07:45 +01:00
"FROM musiccredit "+
"JOIN musicrelease AS release ON release=release.id "+
"JOIN artist ON artist=artist.id "+
"WHERE artist=$1 "
if !showHidden { query += "AND visible=true " }
query += "ORDER BY release_date DESC"
rows, err := repo.db.Query(query, artistID)
if err != nil {
return nil, err
}
2024-09-03 08:07:45 +01:00
defer rows.Close()
type NamePrimary struct {
Name string `json:"name"`
Primary bool `json:"primary" db:"is_primary"`
}
2024-09-02 00:15:23 +01:00
var credits []*model.Credit
2024-09-03 08:07:45 +01:00
for rows.Next() {
credit := &model.Credit{
Release: &model.Release{},
Artist: &model.Artist{},
}
2024-09-03 08:07:45 +01:00
err = rows.Scan(
&credit.Release.ID,
&credit.Release.Title,
&credit.Release.Artwork,
&credit.Release.ReleaseDate,
2024-09-03 08:07:45 +01:00
&credit.Artist.ID,
&credit.Artist.Name,
&credit.Artist.Website,
&credit.Artist.Avatar,
&credit.Role,
&credit.Primary,
)
otherArtists := []NamePrimary{}
err = repo.db.Select(&otherArtists,
2024-09-03 08:07:45 +01:00
"SELECT name,is_primary FROM artist "+
"JOIN musiccredit ON artist=id "+
"WHERE release=$1",
credit.Release.ID)
for _, otherCredit := range otherArtists {
credit.Release.Credits = append(credit.Release.Credits, &model.Credit{
Artist: &model.Artist{
2024-09-03 08:07:45 +01:00
Name: otherCredit.Name,
},
Primary: otherCredit.Primary,
})
}
credits = append(credits, credit)
2024-09-02 00:15:23 +01:00
}
return credits, nil
}
func (repo *MusicRepositoryPostgres) CreateArtist(
id string,
name string,
website string,
avatar string,
) error {
_, err := repo.db.Exec(
"INSERT INTO artist (id, name, website, avatar) "+
"VALUES ($1, $2, $3, $4)",
id, name, website, avatar,
)
return err
}
func (repo *MusicRepositoryPostgres) UpdateArtist(artist *model.Artist) error {
_, err := repo.db.Exec(
"UPDATE artist "+
"SET name=$2, website=$3, avatar=$4 "+
"WHERE id=$1",
artist.ID,
artist.Name,
artist.Website,
artist.Avatar,
)
return err
}
func (repo *MusicRepositoryPostgres) UpdateArtistID(oldID string, newID string) error {
_, err := repo.db.Exec("UPDATE artist SET id=$2 WHERE id=$1", oldID, newID)
return err
}
func (repo *MusicRepositoryPostgres) UpdateArtistName(id string, name string) error {
_, err := repo.db.Exec("UPDATE artist SET name=$2 WHERE id=$1", id, name)
return err
}
func (repo *MusicRepositoryPostgres) UpdateArtistWebsite(id string, website string) error {
_, err := repo.db.Exec("UPDATE artist SET website=$2 WHERE id=$1", id, website)
return err
}
func (repo *MusicRepositoryPostgres) UpdateArtistAvatar(id string, avatar string) error {
_, err := repo.db.Exec("UPDATE artist SET avatar=$2 WHERE id=$1", id, avatar)
return err
}
func (repo *MusicRepositoryPostgres) DeleteArtist(id string) (string, error) {
var deletedID string
err := repo.db.Get(&deletedID, "DELETE FROM artist WHERE id=$1", id)
return deletedID, err
}