fix: refresh stale browse cache on track edits and allow deleting empty releases
- Add CmsTrackBrowserViewModel.Invalidate(); called from TrackEdit/BatchEdit on save or delete so album/genre cache is invalidated and re-fetches on next mode switch
- CmsAlbumBrowser now handles 0-track releases: confirm dialog + DeleteReleaseAsync instead of early return; partial-failure path also fires OnReleasesChanged to trigger cache invalidation
- TrackList.OnAlbumsChanged now calls VM.Invalidate() so genres stay fresh after any album delete
- UnifiedTrackService.DeleteAsync cascades release soft-delete when last live track is removed (non-fatal; logs on failure)
- New DELETE api/track/release/{id} endpoint (ApiKeyAuthorize) for direct release soft-delete
- EF migration SoftDeleteOrphanedReleases backfills existing orphaned release rows via raw SQL (data-only, no schema change)
This commit is contained in:
@@ -182,6 +182,23 @@ public class TrackRepository : Repository<DeepDrftContext, TrackEntity>
|
||||
await _context.SaveChangesAsync(ct);
|
||||
}
|
||||
|
||||
// Soft-delete a release row in a single set-based UPDATE (no load round-trip). The !IsDeleted
|
||||
// guard makes a repeat call a no-op rather than re-stamping updated_at on an already-deleted row.
|
||||
public async Task SoftDeleteReleaseAsync(long id, CancellationToken ct = default)
|
||||
{
|
||||
await _context.Set<ReleaseEntity>()
|
||||
.Where(r => r.Id == id && !r.IsDeleted)
|
||||
.ExecuteUpdateAsync(s => s
|
||||
.SetProperty(r => r.IsDeleted, true)
|
||||
.SetProperty(r => r.UpdatedAt, DateTime.UtcNow), ct);
|
||||
}
|
||||
|
||||
// Count of non-deleted tracks on a single release. Backs the delete-cascade decision in
|
||||
// UnifiedTrackService: a release with zero live tracks after a delete is soft-deleted too.
|
||||
// Uses Query (soft-delete filtered) so just-deleted tracks are excluded from the count.
|
||||
public async Task<int> CountLiveTracksByReleaseAsync(long releaseId, CancellationToken ct = default)
|
||||
=> await Query.CountAsync(t => t.ReleaseId == releaseId, ct);
|
||||
|
||||
protected override void UpdateEntity(TrackEntity target, TrackEntity source)
|
||||
{
|
||||
base.UpdateEntity(target, source); // copies CreatedAt, UpdatedAt, IsDeleted
|
||||
|
||||
Reference in New Issue
Block a user