228 lines
7.9 KiB
Go
228 lines
7.9 KiB
Go
package music
|
|
|
|
import (
|
|
"arimelody-web/errors"
|
|
"arimelody-web/model"
|
|
"fmt"
|
|
"slices"
|
|
"time"
|
|
)
|
|
|
|
func (repo *MusicRepositoryMemory) GetAllReleases(onlyVisible bool, limit int) ([]*model.Release, error) {
|
|
releases := []*model.Release{}
|
|
for _, release := range repo.releases {
|
|
if !onlyVisible || release.Visible {
|
|
releases = append(releases, release)
|
|
}
|
|
}
|
|
return releases, nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) GetReleaseCount(onlyVisible bool) (int, error) {
|
|
releaseCount := 0
|
|
for _, release := range repo.releases {
|
|
if !onlyVisible || release.Visible {
|
|
releaseCount++
|
|
}
|
|
}
|
|
return releaseCount, nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) GetReleaseByID(id string) (*model.Release, error) {
|
|
index := slices.IndexFunc(repo.releases, func(release *model.Release) bool {
|
|
return release.ID == id
|
|
})
|
|
if index == -1 { return nil, nil }
|
|
return repo.releases[index], nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) GetReleaseTracks(id string) ([]*model.Track, error) {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return nil, err }
|
|
return release.Tracks, nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) GetReleaseCredits(id string) ([]*model.Credit, error) {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return nil, err }
|
|
return release.Credits, nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) GetReleaseLinks(id string) ([]*model.Link, error) {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return nil, err }
|
|
return release.Links, nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) CreateRelease(
|
|
id string,
|
|
title string,
|
|
releaseType model.ReleaseType,
|
|
releaseDate time.Time,
|
|
artworkURL string,
|
|
) error {
|
|
if release, err := repo.GetReleaseByID(id); err != nil {
|
|
if !errors.IsNotExistError(err) { return err }
|
|
} else {
|
|
if release != nil { return errors.NewValidationError("Release with this ID already exists") }
|
|
}
|
|
|
|
repo.releases = append(repo.releases, &model.Release{
|
|
ID: id,
|
|
Title: title,
|
|
ReleaseType: releaseType,
|
|
ReleaseDate: releaseDate,
|
|
Artwork: artworkURL,
|
|
})
|
|
return nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) UpdateRelease(release *model.Release) error {
|
|
repoRelease, err := repo.GetReleaseByID(release.ID)
|
|
if err != nil { return err }
|
|
if repoRelease == nil { return errors.NewNotExistError("Release does not exist") }
|
|
|
|
repoRelease.Visible = release.Visible
|
|
repoRelease.Title = release.Title
|
|
repoRelease.Description = release.Description
|
|
repoRelease.ReleaseType = release.ReleaseType
|
|
repoRelease.ReleaseDate = release.ReleaseDate
|
|
repoRelease.Artwork = release.Artwork
|
|
repoRelease.Buyname = release.Buyname
|
|
repoRelease.Buylink = release.Buylink
|
|
repoRelease.Copyright = release.Copyright
|
|
repoRelease.CopyrightURL = release.CopyrightURL
|
|
|
|
return nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseID(oldID string, newID string) error {
|
|
release, err := repo.GetReleaseByID(oldID)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.ID = newID
|
|
return nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseVisibility(id string, visible bool) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.Visible = visible
|
|
return nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseTitle(id string, title string) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.Title = title
|
|
return nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseDescription(id string, description string) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.Description = description
|
|
return nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseType(id string, releaseType model.ReleaseType) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.ReleaseType = releaseType
|
|
return nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseDate(id string, releaseDate time.Time) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.ReleaseDate = releaseDate
|
|
return nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseArtwork(id string, artwork string) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.Artwork = artwork
|
|
return nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseBuyInfo(id string, buyName string, buyLink string) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.Buyname = buyName
|
|
release.Buylink = buyLink
|
|
return nil
|
|
}
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseCopyright(id string, copyright string, url string) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.Copyright = copyright
|
|
release.CopyrightURL = url
|
|
return nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseTracks(id string, newTrackIDs []string) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
|
|
tracks := []*model.Track{}
|
|
for _, trackID := range newTrackIDs {
|
|
track, err := repo.GetTrackByID(trackID)
|
|
if err != nil {
|
|
if errors.IsNotExistError(err) {
|
|
return errors.NewNotExistError(fmt.Sprintf("Track %s does not exist", trackID))
|
|
}
|
|
return err
|
|
}
|
|
tracks = append(tracks, track)
|
|
}
|
|
release.Tracks = tracks
|
|
|
|
return nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseCredits(id string, newCredits []*model.Credit) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
|
|
for _, credit := range newCredits {
|
|
if credit.Artist == nil { return errors.NewValidationError("Credit artist cannot be empty") }
|
|
if len(credit.Artist.ID) == 0 { return errors.NewValidationError("Credit artist ID cannot be empty") }
|
|
if artist, err := repo.GetArtistByID(credit.Artist.ID); err != nil {
|
|
return err
|
|
} else if artist == nil {
|
|
return errors.NewNotExistError(fmt.Sprintf("Artist '%s' does not exist", credit.Artist.ID))
|
|
} else {
|
|
credit.Release = release
|
|
credit.Artist = artist
|
|
}
|
|
}
|
|
|
|
release.Credits = newCredits
|
|
|
|
return nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) UpdateReleaseLinks(id string, newLinks []*model.Link) error {
|
|
release, err := repo.GetReleaseByID(id)
|
|
if err != nil { return err }
|
|
if release == nil { return errors.NewNotExistError("Release does not exist") }
|
|
release.Links = newLinks
|
|
return nil
|
|
}
|
|
|
|
func (repo *MusicRepositoryMemory) DeleteRelease(id string) (string, error) {
|
|
var deletedID string
|
|
newReleases := []*model.Release{}
|
|
for _, release := range repo.releases {
|
|
if release.ID == id {
|
|
deletedID = id
|
|
continue
|
|
}
|
|
newReleases = append(newReleases, release)
|
|
}
|
|
repo.releases = newReleases
|
|
return deletedID, nil
|
|
}
|