2026-08-01 00:29:31 +01:00
|
|
|
package music
|
2024-08-02 22:48:26 +01:00
|
|
|
|
|
|
|
|
import (
|
2025-04-29 23:25:32 +01:00
|
|
|
"arimelody-web/model"
|
2024-08-02 22:48:26 +01:00
|
|
|
)
|
|
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
func (repo *MusicRepositoryPostgres) GetAllArtists() ([]*model.Artist, error) {
|
|
|
|
|
var artists = []*model.Artist{}
|
2024-09-01 04:43:32 +01:00
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
err := repo.db.Select(&artists, "SELECT * FROM artist")
|
2025-04-29 23:25:32 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2024-09-01 04:43:32 +01:00
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
return artists, nil
|
|
|
|
|
}
|
|
|
|
|
func (repo *MusicRepositoryPostgres) GetArtistCount() (int, error) {
|
|
|
|
|
var count int
|
|
|
|
|
err := repo.db.Get(&count, "SELECT count(*) FROM artist")
|
|
|
|
|
return count, err
|
2024-09-01 04:43:32 +01:00
|
|
|
}
|
|
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
func (repo *MusicRepositoryPostgres) GetArtistByID(id string) (*model.Artist, error) {
|
|
|
|
|
var artist = model.Artist{}
|
2024-08-02 22:48:26 +01:00
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
err := repo.db.Get(&artist, "SELECT * FROM artist WHERE id=$1", id)
|
2025-04-29 23:25:32 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2024-08-02 22:48:26 +01:00
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
return &artist, nil
|
2025-10-21 18:39:38 +01:00
|
|
|
}
|
2024-08-02 22:48:26 +01:00
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
func (repo *MusicRepositoryPostgres) GetArtistsNotOnRelease(releaseID string) ([]*model.Artist, error) {
|
2025-04-29 23:25:32 +01:00
|
|
|
var artists = []*model.Artist{}
|
2024-09-01 04:43:32 +01:00
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
err := repo.db.Select(&artists,
|
2024-09-01 04:43:32 +01:00
|
|
|
"SELECT * FROM artist "+
|
|
|
|
|
"WHERE id NOT IN "+
|
|
|
|
|
"(SELECT artist FROM musiccredit WHERE release=$1)",
|
2024-09-02 00:15:23 +01:00
|
|
|
releaseID)
|
2025-04-29 23:25:32 +01:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2024-09-01 04:43:32 +01:00
|
|
|
|
2025-04-29 23:25:32 +01:00
|
|
|
return artists, nil
|
2024-09-01 04:43:32 +01:00
|
|
|
}
|
|
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
func (repo *MusicRepositoryPostgres) GetArtistCredits(artistID string, showHidden bool) ([]*model.Credit, error) {
|
2025-01-20 10:34:39 +00:00
|
|
|
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 "+
|
2024-09-12 09:56:22 +01:00
|
|
|
"WHERE artist=$1 "
|
2026-08-01 00:29:31 +01:00
|
|
|
if !showHidden { query += "AND visible=true " }
|
2024-09-12 09:56:22 +01:00
|
|
|
query += "ORDER BY release_date DESC"
|
2026-08-01 00:29:31 +01:00
|
|
|
rows, err := repo.db.Query(query, artistID)
|
2025-04-29 23:25:32 +01:00
|
|
|
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() {
|
2026-08-01 00:29:31 +01:00
|
|
|
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,
|
2025-01-20 10:34:39 +00:00
|
|
|
&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{}
|
2026-08-01 00:29:31 +01:00
|
|
|
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{
|
2026-08-01 00:29:31 +01:00
|
|
|
Artist: &model.Artist{
|
2024-09-03 08:07:45 +01:00
|
|
|
Name: otherCredit.Name,
|
|
|
|
|
},
|
|
|
|
|
Primary: otherCredit.Primary,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
credits = append(credits, credit)
|
2024-09-02 00:15:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return credits, nil
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
func (repo *MusicRepositoryPostgres) CreateArtist(
|
|
|
|
|
id string,
|
|
|
|
|
name string,
|
|
|
|
|
website string,
|
|
|
|
|
avatar string,
|
|
|
|
|
) error {
|
|
|
|
|
_, err := repo.db.Exec(
|
2025-04-29 23:25:32 +01:00
|
|
|
"INSERT INTO artist (id, name, website, avatar) "+
|
2024-08-02 22:48:26 +01:00
|
|
|
"VALUES ($1, $2, $3, $4)",
|
2026-08-01 00:29:31 +01:00
|
|
|
id, name, website, avatar,
|
2025-04-29 23:25:32 +01:00
|
|
|
)
|
2026-08-01 00:29:31 +01:00
|
|
|
return err
|
2024-08-02 22:48:26 +01:00
|
|
|
}
|
|
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
func (repo *MusicRepositoryPostgres) UpdateArtist(artist *model.Artist) error {
|
|
|
|
|
_, err := repo.db.Exec(
|
2024-08-02 22:48:26 +01:00
|
|
|
"UPDATE artist "+
|
|
|
|
|
"SET name=$2, website=$3, avatar=$4 "+
|
|
|
|
|
"WHERE id=$1",
|
|
|
|
|
artist.ID,
|
|
|
|
|
artist.Name,
|
|
|
|
|
artist.Website,
|
|
|
|
|
artist.Avatar,
|
|
|
|
|
)
|
2026-08-01 00:29:31 +01:00
|
|
|
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
|
2024-08-02 22:48:26 +01:00
|
|
|
}
|
|
|
|
|
|
2026-08-01 00:29:31 +01:00
|
|
|
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
|
2024-08-02 22:48:26 +01:00
|
|
|
}
|