mirror of
https://github.com/gabehf/Koito.git
synced 2026-04-22 20:11:50 -07:00
Feat: Edit Artists
This commit is contained in:
parent
e36eb48036
commit
c641707be9
15 changed files with 678 additions and 283 deletions
|
|
@ -87,6 +87,8 @@ type UpdateTrackOpts struct {
|
|||
ID int32
|
||||
MusicBrainzID uuid.UUID
|
||||
Duration int32
|
||||
AddArtists []int32
|
||||
RemoveArtists []int32
|
||||
}
|
||||
|
||||
type UpdateArtistOpts struct {
|
||||
|
|
|
|||
|
|
@ -199,6 +199,44 @@ func (d *Psql) UpdateTrack(ctx context.Context, opts db.UpdateTrackOpts) error {
|
|||
return fmt.Errorf("UpdateTrack: UpdateTrackDuration: %w", err)
|
||||
}
|
||||
}
|
||||
if len(opts.AddArtists) > 0 {
|
||||
var releaseID int32
|
||||
if t, err := d.q.GetTrack(ctx, opts.ID); err != nil {
|
||||
return fmt.Errorf("UpdateTrack: GetTrack By ID: %w", err)
|
||||
} else {
|
||||
releaseID = t.ReleaseID
|
||||
}
|
||||
|
||||
for _, aid := range opts.AddArtists {
|
||||
if err = qtx.AssociateArtistToTrack(ctx, repository.AssociateArtistToTrackParams{
|
||||
ArtistID: aid,
|
||||
TrackID: opts.ID,
|
||||
IsPrimary: false,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("UpdateTrack: AssociateArtistToTrack: %w", err)
|
||||
}
|
||||
if err = qtx.AssociateArtistToRelease(ctx, repository.AssociateArtistToReleaseParams{
|
||||
ArtistID: aid,
|
||||
ReleaseID: releaseID,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("UpdateTrack: AssociateArtistToRelease: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if len(opts.RemoveArtists) > 0 {
|
||||
for _, aid := range opts.RemoveArtists {
|
||||
if err = qtx.UnssociateArtistFromTrack(ctx, repository.UnssociateArtistFromTrackParams{
|
||||
ArtistID: aid,
|
||||
TrackID: opts.ID,
|
||||
}); err != nil {
|
||||
return fmt.Errorf("UpdateTrack: UnssociateArtistFromTrack: %w", err)
|
||||
}
|
||||
}
|
||||
if err = qtx.CleanOrphanedEntries(ctx); err != nil {
|
||||
return fmt.Errorf("UpdateTrack: CleanOrphanedEntries: %w", err)
|
||||
}
|
||||
}
|
||||
return tx.Commit(ctx)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,13 @@ func testDataForTracks(t *testing.T) {
|
|||
('00000000-0000-0000-0000-000000000022')`)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Associate releases with artists
|
||||
err = store.Exec(context.Background(),
|
||||
`INSERT INTO artist_releases (artist_id, release_id, is_primary)
|
||||
VALUES (1, 1, true),
|
||||
(2, 2, true)`)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Insert release aliases
|
||||
err = store.Exec(context.Background(),
|
||||
`INSERT INTO release_aliases (release_id, alias, source, is_primary)
|
||||
|
|
@ -58,8 +65,8 @@ func testDataForTracks(t *testing.T) {
|
|||
|
||||
// Associate tracks with artists
|
||||
err = store.Exec(context.Background(),
|
||||
`INSERT INTO artist_tracks (artist_id, track_id)
|
||||
VALUES (1, 1), (2, 2)`)
|
||||
`INSERT INTO artist_tracks (artist_id, track_id, is_primary)
|
||||
VALUES (1, 1, true), (2, 2, true)`)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Insert listens
|
||||
|
|
@ -187,6 +194,50 @@ func TestUpdateTrack(t *testing.T) {
|
|||
Duration: int32(newDuration),
|
||||
})
|
||||
assert.NoError(t, err) // No update should occur
|
||||
|
||||
// Test adding artist to track
|
||||
err = store.UpdateTrack(ctx, db.UpdateTrackOpts{
|
||||
ID: 1,
|
||||
AddArtists: []int32{2},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
|
||||
exists, err := store.RowExists(ctx, `
|
||||
SELECT EXISTS (
|
||||
SELECT 1 FROM artist_tracks
|
||||
WHERE artist_id = $1 AND track_id = $2
|
||||
)`, 2, 1)
|
||||
require.NoError(t, err)
|
||||
assert.True(t, exists, "expected artist to be associated with track")
|
||||
|
||||
// Test removing artist from track
|
||||
err = store.UpdateTrack(ctx, db.UpdateTrackOpts{
|
||||
ID: 1,
|
||||
RemoveArtists: []int32{2},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
|
||||
exists, err = store.RowExists(ctx, `
|
||||
SELECT EXISTS (
|
||||
SELECT 1 FROM artist_tracks
|
||||
WHERE artist_id = $1 AND track_id = $2
|
||||
)`, 2, 1)
|
||||
require.NoError(t, err)
|
||||
assert.False(t, exists, "expected artist to be unassociated with track")
|
||||
|
||||
// Test that the primary artist cannot be removed
|
||||
err = store.UpdateTrack(ctx, db.UpdateTrackOpts{
|
||||
ID: 1,
|
||||
RemoveArtists: []int32{int32(1)},
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
exists, err = store.RowExists(ctx, `
|
||||
SELECT EXISTS (
|
||||
SELECT 1 FROM artist_tracks
|
||||
WHERE artist_id = $1 AND track_id = $2
|
||||
)`, 1, 1)
|
||||
require.NoError(t, err)
|
||||
assert.True(t, exists, "expected primary artist to not be removed from track")
|
||||
}
|
||||
|
||||
func TestTrackAliases(t *testing.T) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue