From 5a0f82b77bb21d09c7da6ebc3ce7f7f38ddb64a0 Mon Sep 17 00:00:00 2001 From: XShine555 Date: Thu, 24 Sep 2026 11:43:50 +0200 Subject: [PATCH] Clean up domain entities: shared picture value object, lifecycle and ownership interfaces, explicit tables --- .../Musify.Application/Albums/CreateAlbum.cs | 2 +- .../Musify.Application/Albums/UpdateAlbum.cs | 2 +- .../PlayLists/AddTrackToPlayList.cs | 2 +- .../PlayLists/CreatePlayList.cs | 8 +++---- .../PlayLists/DeletePlayList.cs | 2 +- .../PlayLists/GetPlayListById.cs | 4 ++-- .../PlayLists/GetPlayListCover.cs | 2 +- .../PlayLists/GetPlayListTracks.cs | 2 +- .../PlayLists/GetPlayListsByUserId.cs | 4 ++-- .../PlayLists/RemoveTrackFromPlayList.cs | 2 +- .../Responses/PlayListApplicationResponse.cs | 2 +- .../PlayLists/UpdatePlayList.cs | 6 +++--- .../Services/UploadIntentValidator.cs | 2 +- .../Abstractions/IHasLifeCycle.cs | 10 +++++++++ .../Abstractions/IOwnedEntity.cs | 8 +++++++ backend/Core/Musify.Domain/Entities/Album.cs | 14 ++++--------- .../Musify.Domain/Entities/AlbumHasTrack.cs | 10 ++------- .../Entities/ListeningHistory.cs | 8 ++----- backend/Core/Musify.Domain/Entities/Mix.cs | 10 ++------- .../Core/Musify.Domain/Entities/MixItem.cs | 10 +++------ .../Core/Musify.Domain/Entities/PlayList.cs | 21 +++++++------------ .../Entities/PlayListHasTrack.cs | 12 +++-------- backend/Core/Musify.Domain/Entities/Track.cs | 14 +++---------- .../Core/Musify.Domain/Entities/TrackLike.cs | 8 ++----- .../Core/Musify.Domain/Entities/TrackTag.cs | 6 ++---- .../Musify.Domain/Entities/UploadIntent.cs | 16 +++++--------- backend/Core/Musify.Domain/Entities/User.cs | 4 ---- .../Core/Musify.Domain/Entities/UserFollow.cs | 8 ++----- .../Musify.Domain/Entities/UserHasTrack.cs | 8 ++----- .../{AlbumPictures.cs => EntityPictures.cs} | 5 +++-- .../ValueObjects/PlayListPictures.cs | 17 --------------- .../ValueObjects/PlaylistVisibility.cs | 2 +- .../Pictures/UpdateAlbumPictureActivity.cs | 2 +- .../Pictures/UpdatePlayListPictureActivity.cs | 2 +- .../Persistence/Database.cs | 2 +- .../Migrations/DatabaseModelSnapshot.cs | 21 ++++++++++--------- .../PlayLists/CreatePlayListRequest.cs | 2 +- .../PlayLists/UpdatePlayListRequest.cs | 2 +- .../Albums/GetAlbumCoverQueryHandlerTests.cs | 2 +- .../CreatePlayListCommandHandlerTests.cs | 6 +++--- .../GetPlayListByIdQueryHandlerTests.cs | 10 ++++----- .../GetPlayListTracksQueryHandlerTests.cs | 4 ++-- .../GetPlayListsByUserIdQueryHandlerTests.cs | 8 +++---- .../UpdatePlayListCommandHandlerTests.cs | 8 +++---- .../TestSupport/TestEntities.cs | 12 +++++------ 45 files changed, 122 insertions(+), 190 deletions(-) create mode 100644 backend/Core/Musify.Domain/Abstractions/IHasLifeCycle.cs create mode 100644 backend/Core/Musify.Domain/Abstractions/IOwnedEntity.cs rename backend/Core/Musify.Domain/ValueObjects/{AlbumPictures.cs => EntityPictures.cs} (53%) delete mode 100644 backend/Core/Musify.Domain/ValueObjects/PlayListPictures.cs diff --git a/backend/Core/Musify.Application/Albums/CreateAlbum.cs b/backend/Core/Musify.Application/Albums/CreateAlbum.cs index eac52f3..f2b9b9d 100644 --- a/backend/Core/Musify.Application/Albums/CreateAlbum.cs +++ b/backend/Core/Musify.Application/Albums/CreateAlbum.cs @@ -56,7 +56,7 @@ public class CreateAlbumCommandHandler( NormalizedTitle = title.ToUpperInvariant(), Description = request.Description, ReleaseYear = request.ReleaseYear, - Pictures = AlbumPictures.Pending(intent.ObjectName) + Pictures = EntityPictures.Pending(intent.ObjectName) }; await database.Albums.AddAsync(album, cancellationToken); diff --git a/backend/Core/Musify.Application/Albums/UpdateAlbum.cs b/backend/Core/Musify.Application/Albums/UpdateAlbum.cs index a6c9d7b..e874017 100644 --- a/backend/Core/Musify.Application/Albums/UpdateAlbum.cs +++ b/backend/Core/Musify.Application/Albums/UpdateAlbum.cs @@ -64,7 +64,7 @@ public class UpdateAlbumCommandHandler( return validation.Errors; var pictureIntent = validation.Value; - album.Pictures = AlbumPictures.Pending(pictureIntent.ObjectName); + album.Pictures = EntityPictures.Pending(pictureIntent.ObjectName); var finalPictureKey = albumConfiguration.Routes.BuildOriginalPicturePath(request.UserId, pictureIntent.ObjectName); var publishResult = await PublishUpdateAlbumPictureSourceEventAsync( diff --git a/backend/Core/Musify.Application/PlayLists/AddTrackToPlayList.cs b/backend/Core/Musify.Application/PlayLists/AddTrackToPlayList.cs index 2c3f28f..3626d30 100644 --- a/backend/Core/Musify.Application/PlayLists/AddTrackToPlayList.cs +++ b/backend/Core/Musify.Application/PlayLists/AddTrackToPlayList.cs @@ -24,7 +24,7 @@ public class AddTrackToPlayListCommandHandler( if (playList == null) return AppErrors.NotFound("PlayList", request.PlayListId); - if (playList.UserId != request.UserId) + if (playList.OwnerUserId != request.UserId) return AppErrors.Forbidden("PlayList", request.PlayListId); var trackExists = await database.Tracks diff --git a/backend/Core/Musify.Application/PlayLists/CreatePlayList.cs b/backend/Core/Musify.Application/PlayLists/CreatePlayList.cs index d78024b..6b1d66b 100644 --- a/backend/Core/Musify.Application/PlayLists/CreatePlayList.cs +++ b/backend/Core/Musify.Application/PlayLists/CreatePlayList.cs @@ -17,7 +17,7 @@ public record CreatePlayListCommand( string Name, string? Description, Guid? PictureIntentId, - PlaylistVisibility Visibility = PlaylistVisibility.Private) + PlayListVisibility Visibility = PlayListVisibility.Private) : ICommand>; public class CreatePlayListCommandHandler( @@ -30,7 +30,7 @@ public class CreatePlayListCommandHandler( UploadIntentConfiguration uploadIntentConfiguration) : ICommandHandler> { - private sealed record ResolvedPlayListPictures(PlayListPictures? Pictures, UploadIntent? Intent); + private sealed record ResolvedPlayListPictures(EntityPictures? Pictures, UploadIntent? Intent); public async ValueTask> Handle(CreatePlayListCommand request, CancellationToken cancellationToken) { @@ -51,7 +51,7 @@ public class CreatePlayListCommandHandler( var playList = new PlayList { - UserId = request.UserId, + OwnerUserId = request.UserId, Name = request.Name.Trim(), NormalizedName = request.Name.Trim().ToUpperInvariant(), Description = string.IsNullOrWhiteSpace(request.Description) ? null : request.Description.Trim(), @@ -96,7 +96,7 @@ public class CreatePlayListCommandHandler( if (validation.IsError) return validation.Errors; - return new ResolvedPlayListPictures(PlayListPictures.Pending(validation.Value.ObjectName), validation.Value); + return new ResolvedPlayListPictures(EntityPictures.Pending(validation.Value.ObjectName), validation.Value); } private async Task> PublishCreatePlayListEventAsync( diff --git a/backend/Core/Musify.Application/PlayLists/DeletePlayList.cs b/backend/Core/Musify.Application/PlayLists/DeletePlayList.cs index 710a5f4..e49b65c 100644 --- a/backend/Core/Musify.Application/PlayLists/DeletePlayList.cs +++ b/backend/Core/Musify.Application/PlayLists/DeletePlayList.cs @@ -27,7 +27,7 @@ public class DeletePlayListCommandHandler( return Error.NotFound(); } - if (playList.UserId != request.UserId) + if (playList.OwnerUserId != request.UserId) { logger.LogWarning("Playlist {PlayListId} does not belong to user {UserId}", request.PlayListId, request.UserId); return AppErrors.Forbidden("PlayList", request.PlayListId); diff --git a/backend/Core/Musify.Application/PlayLists/GetPlayListById.cs b/backend/Core/Musify.Application/PlayLists/GetPlayListById.cs index 869f0e1..825861d 100644 --- a/backend/Core/Musify.Application/PlayLists/GetPlayListById.cs +++ b/backend/Core/Musify.Application/PlayLists/GetPlayListById.cs @@ -32,8 +32,8 @@ public class GetPlayListByIdQueryHandler(IDatabase database) if (entry == null) return Error.NotFound(); - if (entry.PlayList.Visibility == PlaylistVisibility.Private - && entry.PlayList.UserId != request.RequestingUserId) + if (entry.PlayList.Visibility == PlayListVisibility.Private + && entry.PlayList.OwnerUserId != request.RequestingUserId) { return Error.NotFound(); } diff --git a/backend/Core/Musify.Application/PlayLists/GetPlayListCover.cs b/backend/Core/Musify.Application/PlayLists/GetPlayListCover.cs index e456e7d..fab4d48 100644 --- a/backend/Core/Musify.Application/PlayLists/GetPlayListCover.cs +++ b/backend/Core/Musify.Application/PlayLists/GetPlayListCover.cs @@ -24,7 +24,7 @@ public class GetPlayListCoverQueryHandler( { var owned = await database.PlayLists.AsNoTracking() .Where(e => e.Id == request.PlayListId && e.LifeCycleStatus == LifeCycleStatus.Active) - .Select(e => new { OwnerUserId = e.UserId, e.Pictures }) + .Select(e => new { OwnerUserId = e.OwnerUserId, e.Pictures }) .SingleOrDefaultAsync(cancellationToken); if (owned?.Pictures == null) diff --git a/backend/Core/Musify.Application/PlayLists/GetPlayListTracks.cs b/backend/Core/Musify.Application/PlayLists/GetPlayListTracks.cs index f25cabc..d99ffee 100644 --- a/backend/Core/Musify.Application/PlayLists/GetPlayListTracks.cs +++ b/backend/Core/Musify.Application/PlayLists/GetPlayListTracks.cs @@ -27,7 +27,7 @@ public class GetPlayListTracksQueryHandler(IDatabase database) .AnyAsync( p => p.Id == request.PlayListId && p.LifeCycleStatus == LifeCycleStatus.Active - && (p.Visibility == PlaylistVisibility.Public || p.UserId == request.ViewerId), + && (p.Visibility == PlayListVisibility.Public || p.OwnerUserId == request.ViewerId), cancellationToken); if (!playListExists) return Error.NotFound(); diff --git a/backend/Core/Musify.Application/PlayLists/GetPlayListsByUserId.cs b/backend/Core/Musify.Application/PlayLists/GetPlayListsByUserId.cs index e292836..c9d2e05 100644 --- a/backend/Core/Musify.Application/PlayLists/GetPlayListsByUserId.cs +++ b/backend/Core/Musify.Application/PlayLists/GetPlayListsByUserId.cs @@ -25,9 +25,9 @@ public class GetPlayListsByUserIdQueryHandler(IDatabase database) { var playListsQuery = database.PlayLists .AsNoTracking() - .Where(p => p.UserId == request.UserId + .Where(p => p.OwnerUserId == request.UserId && p.LifeCycleStatus == LifeCycleStatus.Active - && (p.Visibility == PlaylistVisibility.Public || p.UserId == request.ViewerId)); + && (p.Visibility == PlayListVisibility.Public || p.OwnerUserId == request.ViewerId)); if (!string.IsNullOrEmpty(request.Name)) { diff --git a/backend/Core/Musify.Application/PlayLists/RemoveTrackFromPlayList.cs b/backend/Core/Musify.Application/PlayLists/RemoveTrackFromPlayList.cs index da372fe..6f4c9ca 100644 --- a/backend/Core/Musify.Application/PlayLists/RemoveTrackFromPlayList.cs +++ b/backend/Core/Musify.Application/PlayLists/RemoveTrackFromPlayList.cs @@ -23,7 +23,7 @@ public class RemoveTrackFromPlayListCommandHandler( if (playList == null) return AppErrors.NotFound("PlayList", request.PlayListId); - if (playList.UserId != request.UserId) + if (playList.OwnerUserId != request.UserId) return AppErrors.Forbidden("PlayList", request.PlayListId); var playListTracks = await database.PlayListHasTracks diff --git a/backend/Core/Musify.Application/PlayLists/Responses/PlayListApplicationResponse.cs b/backend/Core/Musify.Application/PlayLists/Responses/PlayListApplicationResponse.cs index dedb055..527a324 100644 --- a/backend/Core/Musify.Application/PlayLists/Responses/PlayListApplicationResponse.cs +++ b/backend/Core/Musify.Application/PlayLists/Responses/PlayListApplicationResponse.cs @@ -10,7 +10,7 @@ public record PlayListApplicationResponse( string? SmallImageKeyName, string? MediumImageKeyName, string? LargeImageKeyName, - PlaylistVisibility Visibility, + PlayListVisibility Visibility, DateTime CreatedAt, DateTime UpdatedAt, IReadOnlyList CoverTrackIds) diff --git a/backend/Core/Musify.Application/PlayLists/UpdatePlayList.cs b/backend/Core/Musify.Application/PlayLists/UpdatePlayList.cs index e4c395a..6b329df 100644 --- a/backend/Core/Musify.Application/PlayLists/UpdatePlayList.cs +++ b/backend/Core/Musify.Application/PlayLists/UpdatePlayList.cs @@ -19,7 +19,7 @@ public record UpdatePlayListCommand( string? NewName, string? NewDescription, Guid? NewPictureIntentId, - PlaylistVisibility? NewVisibility = null) + PlayListVisibility? NewVisibility = null) : ICommand>; public class UpdatePlayListCommandHandler( @@ -41,7 +41,7 @@ public class UpdatePlayListCommandHandler( return Error.NotFound(); } - if (playListEntity.UserId != request.UserId) + if (playListEntity.OwnerUserId != request.UserId) { logger.LogWarning("User {UserId} is not the owner of playlist {PlayListId}", request.UserId, request.PlayListId); return AppErrors.Forbidden("PlayList", request.PlayListId); @@ -72,7 +72,7 @@ public class UpdatePlayListCommandHandler( return validation.Errors; var pictureIntent = validation.Value; - playListEntity.Pictures = PlayListPictures.Pending(pictureIntent.ObjectName); + playListEntity.Pictures = EntityPictures.Pending(pictureIntent.ObjectName); var finalPictureKey = playListConfiguration.Routes.BuildOriginalPicturePath(request.UserId, pictureIntent.ObjectName); var publishResult = await PublishUpdatePlayListPictureSourceEventAsync( diff --git a/backend/Core/Musify.Application/Services/UploadIntentValidator.cs b/backend/Core/Musify.Application/Services/UploadIntentValidator.cs index 954d769..a14bd68 100644 --- a/backend/Core/Musify.Application/Services/UploadIntentValidator.cs +++ b/backend/Core/Musify.Application/Services/UploadIntentValidator.cs @@ -52,7 +52,7 @@ public sealed class UploadIntentValidator( if (intent.IsConsumed) return Error.Conflict(description: "Upload intent has already been consumed."); - if (intent.IsExpired) + if (intent.IsExpiredAt(DateTime.UtcNow)) return Error.Validation(description: "Upload intent has expired."); var metadata = await storageService.HeadObjectAsync(intent.Bucket, intent.Key, cancellationToken); diff --git a/backend/Core/Musify.Domain/Abstractions/IHasLifeCycle.cs b/backend/Core/Musify.Domain/Abstractions/IHasLifeCycle.cs new file mode 100644 index 0000000..6020728 --- /dev/null +++ b/backend/Core/Musify.Domain/Abstractions/IHasLifeCycle.cs @@ -0,0 +1,10 @@ +using Musify.Domain.ValueObjects; + +namespace Musify.Domain.Abstractions; + +public interface IHasLifeCycle +{ + public Guid Id { get; } + + public LifeCycleStatus LifeCycleStatus { get; set; } +} diff --git a/backend/Core/Musify.Domain/Abstractions/IOwnedEntity.cs b/backend/Core/Musify.Domain/Abstractions/IOwnedEntity.cs new file mode 100644 index 0000000..bb56244 --- /dev/null +++ b/backend/Core/Musify.Domain/Abstractions/IOwnedEntity.cs @@ -0,0 +1,8 @@ +namespace Musify.Domain.Abstractions; + +public interface IOwnedEntity +{ + public Guid Id { get; } + + public long OwnerUserId { get; } +} diff --git a/backend/Core/Musify.Domain/Entities/Album.cs b/backend/Core/Musify.Domain/Entities/Album.cs index 31c5d46..0cfeca1 100644 --- a/backend/Core/Musify.Domain/Entities/Album.cs +++ b/backend/Core/Musify.Domain/Entities/Album.cs @@ -5,17 +5,15 @@ using Musify.Domain.ValueObjects; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 -public class Album : IAuditable +[Table("Albums")] +public class Album : IAuditable, IHasLifeCycle, IOwnedEntity { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] [MaxLength(200)] public required string Title { get; set; } - [Required] [MaxLength(200)] public required string NormalizedTitle { get; set; } @@ -24,21 +22,17 @@ public class Album : IAuditable public int? ReleaseYear { get; set; } - public AlbumPictures? Pictures { get; set; } + public EntityPictures? Pictures { get; set; } - [Required] public required long OwnerUserId { get; set; } [ForeignKey(nameof(OwnerUserId))] - public User Owner { get; set; } + public User Owner { get; set; } = null!; - [Required] public LifeCycleStatus LifeCycleStatus { get; set; } = LifeCycleStatus.Active; - [Required] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Required] public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; public ICollection AlbumTracks { get; set; } = new List(); diff --git a/backend/Core/Musify.Domain/Entities/AlbumHasTrack.cs b/backend/Core/Musify.Domain/Entities/AlbumHasTrack.cs index 8ab9ad4..3648390 100644 --- a/backend/Core/Musify.Domain/Entities/AlbumHasTrack.cs +++ b/backend/Core/Musify.Domain/Entities/AlbumHasTrack.cs @@ -1,29 +1,23 @@ -using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("AlbumHasTrack")] public class AlbumHasTrack { public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required Guid AlbumId { get; set; } - [Required] public required Guid TrackId { get; set; } - [Required] public int TrackNumber { get; set; } = 1; - [Required] public DateTime AddedAt { get; set; } = DateTime.UtcNow; [ForeignKey(nameof(AlbumId))] - public Album Album { get; set; } + public Album Album { get; set; } = null!; [ForeignKey(nameof(TrackId))] - public Track Track { get; set; } + public Track Track { get; set; } = null!; } diff --git a/backend/Core/Musify.Domain/Entities/ListeningHistory.cs b/backend/Core/Musify.Domain/Entities/ListeningHistory.cs index f1e0e5c..4a1afd1 100644 --- a/backend/Core/Musify.Domain/Entities/ListeningHistory.cs +++ b/backend/Core/Musify.Domain/Entities/ListeningHistory.cs @@ -3,20 +3,16 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("ListeningHistory")] public class ListeningHistory { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required long UserId { get; set; } - [Required] public required Guid TrackId { get; set; } - [Required] public DateTime ListenedAt { get; set; } = DateTime.UtcNow; public double? PlayedSeconds { get; set; } @@ -26,8 +22,8 @@ public class ListeningHistory public bool IsCounted { get; set; } [ForeignKey(nameof(UserId))] - public User User { get; set; } + public User User { get; set; } = null!; [ForeignKey(nameof(TrackId))] - public Track Track { get; set; } + public Track Track { get; set; } = null!; } diff --git a/backend/Core/Musify.Domain/Entities/Mix.cs b/backend/Core/Musify.Domain/Entities/Mix.cs index f2b44de..9487931 100644 --- a/backend/Core/Musify.Domain/Entities/Mix.cs +++ b/backend/Core/Musify.Domain/Entities/Mix.cs @@ -5,34 +5,28 @@ using Musify.Domain.Abstractions; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("Mixes")] public class Mix : IAuditable { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required long UserId { get; set; } - [Required] [MaxLength(100)] public required string Title { get; set; } [MaxLength(256)] public string? Subtitle { get; set; } - [Required] - public int Position { get; set; } = 0; + public int Position { get; set; } - [Required] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Required] public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; [ForeignKey(nameof(UserId))] - public User User { get; set; } + public User User { get; set; } = null!; public ICollection Items { get; set; } = new List(); } diff --git a/backend/Core/Musify.Domain/Entities/MixItem.cs b/backend/Core/Musify.Domain/Entities/MixItem.cs index 35bac13..278e2b8 100644 --- a/backend/Core/Musify.Domain/Entities/MixItem.cs +++ b/backend/Core/Musify.Domain/Entities/MixItem.cs @@ -3,25 +3,21 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("MixItems")] public class MixItem { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required Guid MixId { get; set; } - [Required] - public int Position { get; set; } = 0; + public int Position { get; set; } - [Required] public required Guid TrackId { get; set; } [ForeignKey(nameof(MixId))] - public Mix Mix { get; set; } + public Mix Mix { get; set; } = null!; [ForeignKey(nameof(TrackId))] - public Track Track { get; set; } + public Track Track { get; set; } = null!; } diff --git a/backend/Core/Musify.Domain/Entities/PlayList.cs b/backend/Core/Musify.Domain/Entities/PlayList.cs index 0812771..7774958 100644 --- a/backend/Core/Musify.Domain/Entities/PlayList.cs +++ b/backend/Core/Musify.Domain/Entities/PlayList.cs @@ -6,43 +6,36 @@ using Musify.Domain.ValueObjects; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("PlayLists")] -public class PlayList : IAuditable +public class PlayList : IAuditable, IHasLifeCycle, IOwnedEntity { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] - public required long UserId { get; set; } + [Column("UserId")] + public required long OwnerUserId { get; set; } - [Required] [MaxLength(50)] public required string Name { get; set; } - [Required] [MaxLength(50)] public required string NormalizedName { get; set; } [MaxLength(256)] public string? Description { get; set; } - public PlayListPictures? Pictures { get; set; } + public EntityPictures? Pictures { get; set; } - [Required] public LifeCycleStatus LifeCycleStatus { get; set; } = LifeCycleStatus.Active; - [Required] - public PlaylistVisibility Visibility { get; set; } = PlaylistVisibility.Private; + public PlayListVisibility Visibility { get; set; } = PlayListVisibility.Private; - [Required] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Required] public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; - [ForeignKey(nameof(UserId))] - public User User { get; set; } + [ForeignKey(nameof(OwnerUserId))] + public User Owner { get; set; } = null!; public ICollection PlayListTracks { get; set; } = new List(); } diff --git a/backend/Core/Musify.Domain/Entities/PlayListHasTrack.cs b/backend/Core/Musify.Domain/Entities/PlayListHasTrack.cs index 836fd6b..173bf5b 100644 --- a/backend/Core/Musify.Domain/Entities/PlayListHasTrack.cs +++ b/backend/Core/Musify.Domain/Entities/PlayListHasTrack.cs @@ -1,29 +1,23 @@ -using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("PlayListHasTrack")] public class PlayListHasTrack { public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required Guid PlayListId { get; set; } - [Required] public required Guid TrackId { get; set; } - [Required] - public int Position { get; set; } = 0; + public int Position { get; set; } - [Required] public DateTime AddedAt { get; set; } = DateTime.UtcNow; [ForeignKey(nameof(PlayListId))] - public PlayList PlayList { get; set; } + public PlayList PlayList { get; set; } = null!; [ForeignKey(nameof(TrackId))] - public Track Track { get; set; } + public Track Track { get; set; } = null!; } diff --git a/backend/Core/Musify.Domain/Entities/Track.cs b/backend/Core/Musify.Domain/Entities/Track.cs index b1c352f..8474fed 100644 --- a/backend/Core/Musify.Domain/Entities/Track.cs +++ b/backend/Core/Musify.Domain/Entities/Track.cs @@ -5,39 +5,31 @@ using Musify.Domain.ValueObjects; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 -public class Track : IAuditable +[Table("Tracks")] +public class Track : IAuditable, IHasLifeCycle, IOwnedEntity { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] [MaxLength(200)] public required string Title { get; set; } - [Required] [MaxLength(200)] public required string NormalizedTitle { get; set; } - [Required] public double DurationSeconds { get; set; } - [Required] public required long OwnerUserId { get; set; } [ForeignKey(nameof(OwnerUserId))] - public required User Owner { get; set; } + public User Owner { get; set; } = null!; - [Required] public LifeCycleStatus LifeCycleStatus { get; set; } = LifeCycleStatus.Active; - [Required] public bool IsExplicit { get; set; } - [Required] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Required] public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; public TrackPictures Pictures { get; set; } = new(); diff --git a/backend/Core/Musify.Domain/Entities/TrackLike.cs b/backend/Core/Musify.Domain/Entities/TrackLike.cs index b605187..9cf41d3 100644 --- a/backend/Core/Musify.Domain/Entities/TrackLike.cs +++ b/backend/Core/Musify.Domain/Entities/TrackLike.cs @@ -3,25 +3,21 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("TrackLikes")] public class TrackLike { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required long UserId { get; set; } - [Required] public required Guid TrackId { get; set; } - [Required] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; [ForeignKey(nameof(UserId))] - public User User { get; set; } + public User User { get; set; } = null!; [ForeignKey(nameof(TrackId))] - public Track Track { get; set; } + public Track Track { get; set; } = null!; } diff --git a/backend/Core/Musify.Domain/Entities/TrackTag.cs b/backend/Core/Musify.Domain/Entities/TrackTag.cs index 771c4cc..0f599a4 100644 --- a/backend/Core/Musify.Domain/Entities/TrackTag.cs +++ b/backend/Core/Musify.Domain/Entities/TrackTag.cs @@ -4,18 +4,16 @@ using Musify.Domain.ValueObjects; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 +[Table("TrackTags")] public class TrackTag { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required Guid TrackId { get; set; } - [Required] public required Genre Tag { get; set; } [ForeignKey(nameof(TrackId))] - public Track Track { get; set; } + public Track Track { get; set; } = null!; } diff --git a/backend/Core/Musify.Domain/Entities/UploadIntent.cs b/backend/Core/Musify.Domain/Entities/UploadIntent.cs index 0b48567..f3fc802 100644 --- a/backend/Core/Musify.Domain/Entities/UploadIntent.cs +++ b/backend/Core/Musify.Domain/Entities/UploadIntent.cs @@ -11,40 +11,34 @@ public class UploadIntent [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required long UserId { get; set; } - [Required, MaxLength(128)] + [MaxLength(128)] public required string Bucket { get; set; } - [Required, MaxLength(512)] + [MaxLength(512)] public required string Key { get; set; } - [Required, MaxLength(128)] + [MaxLength(128)] public required string ObjectName { get; set; } - [Required, MaxLength(128)] + [MaxLength(128)] public required string ContentType { get; set; } public long? ExpectedSizeBytes { get; set; } - [Required] public UploadIntentPurpose Purpose { get; set; } - [Required] public UploadIntentStatus Status { get; set; } = UploadIntentStatus.Issued; - [Required] public DateTime ExpiresAt { get; set; } - [Required] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; [NotMapped] public bool IsConsumed => Status == UploadIntentStatus.Consumed; - [NotMapped] - public bool IsExpired => Status == UploadIntentStatus.Expired || ExpiresAt < DateTime.UtcNow; + public bool IsExpiredAt(DateTime now) => Status == UploadIntentStatus.Expired || ExpiresAt < now; [ForeignKey(nameof(UserId))] public User User { get; set; } = null!; diff --git a/backend/Core/Musify.Domain/Entities/User.cs b/backend/Core/Musify.Domain/Entities/User.cs index 2a8c5f6..e12912c 100644 --- a/backend/Core/Musify.Domain/Entities/User.cs +++ b/backend/Core/Musify.Domain/Entities/User.cs @@ -11,11 +11,9 @@ public class User : IAuditable [DatabaseGenerated(DatabaseGeneratedOption.None)] public required long Id { get; set; } - [Required] [MaxLength(48)] public required string Name { get; set; } - [Required] [MaxLength(48)] public required string NormalizedName { get; set; } @@ -28,10 +26,8 @@ public class User : IAuditable [MaxLength(2048)] public string? ProfilePictureUrl { get; set; } - [Required] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; - [Required] public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; public ICollection UserTracks { get; set; } = new List(); diff --git a/backend/Core/Musify.Domain/Entities/UserFollow.cs b/backend/Core/Musify.Domain/Entities/UserFollow.cs index 202c6a0..93b324c 100644 --- a/backend/Core/Musify.Domain/Entities/UserFollow.cs +++ b/backend/Core/Musify.Domain/Entities/UserFollow.cs @@ -3,25 +3,21 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("UserFollows")] public class UserFollow { [Key] public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required long FollowerId { get; set; } - [Required] public required long FollowedId { get; set; } - [Required] public DateTime CreatedAt { get; set; } = DateTime.UtcNow; [ForeignKey(nameof(FollowerId))] - public User Follower { get; set; } + public User Follower { get; set; } = null!; [ForeignKey(nameof(FollowedId))] - public User Followed { get; set; } + public User Followed { get; set; } = null!; } diff --git a/backend/Core/Musify.Domain/Entities/UserHasTrack.cs b/backend/Core/Musify.Domain/Entities/UserHasTrack.cs index a1ad0be..d2998b9 100644 --- a/backend/Core/Musify.Domain/Entities/UserHasTrack.cs +++ b/backend/Core/Musify.Domain/Entities/UserHasTrack.cs @@ -1,23 +1,19 @@ -using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Musify.Domain.Entities; -#pragma warning disable CS8618 [Table("UserHasTrack")] public class UserHasTrack { public Guid Id { get; set; } = Guid.NewGuid(); - [Required] public required long UserId { get; set; } - [Required] public required Guid TrackId { get; set; } [ForeignKey(nameof(UserId))] - public User User { get; set; } + public User User { get; set; } = null!; [ForeignKey(nameof(TrackId))] - public Track Track { get; set; } + public Track Track { get; set; } = null!; } diff --git a/backend/Core/Musify.Domain/ValueObjects/AlbumPictures.cs b/backend/Core/Musify.Domain/ValueObjects/EntityPictures.cs similarity index 53% rename from backend/Core/Musify.Domain/ValueObjects/AlbumPictures.cs rename to backend/Core/Musify.Domain/ValueObjects/EntityPictures.cs index c505f0a..9cc8db5 100644 --- a/backend/Core/Musify.Domain/ValueObjects/AlbumPictures.cs +++ b/backend/Core/Musify.Domain/ValueObjects/EntityPictures.cs @@ -2,7 +2,8 @@ using System.ComponentModel.DataAnnotations; namespace Musify.Domain.ValueObjects; -public class AlbumPictures +/// The picture file names of an album or playlist. Resized names stay null until processing finishes. +public class EntityPictures { [Required] public required string OriginalName { get; set; } @@ -13,5 +14,5 @@ public class AlbumPictures public string? LargeName { get; set; } - public static AlbumPictures Pending(string originalName) => new() { OriginalName = originalName }; + public static EntityPictures Pending(string objectName) => new() { OriginalName = objectName }; } diff --git a/backend/Core/Musify.Domain/ValueObjects/PlayListPictures.cs b/backend/Core/Musify.Domain/ValueObjects/PlayListPictures.cs deleted file mode 100644 index 3617896..0000000 --- a/backend/Core/Musify.Domain/ValueObjects/PlayListPictures.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Musify.Domain.ValueObjects; - -public class PlayListPictures -{ - [Required] - public required string OriginalName { get; set; } - - public string? SmallName { get; set; } - - public string? MediumName { get; set; } - - public string? LargeName { get; set; } - - public static PlayListPictures Pending(string originalName) => new() { OriginalName = originalName }; -} diff --git a/backend/Core/Musify.Domain/ValueObjects/PlaylistVisibility.cs b/backend/Core/Musify.Domain/ValueObjects/PlaylistVisibility.cs index e2769f0..b6574d8 100644 --- a/backend/Core/Musify.Domain/ValueObjects/PlaylistVisibility.cs +++ b/backend/Core/Musify.Domain/ValueObjects/PlaylistVisibility.cs @@ -1,6 +1,6 @@ namespace Musify.Domain.ValueObjects; -public enum PlaylistVisibility +public enum PlayListVisibility { Private = 0, Public = 1 diff --git a/backend/Core/Musify.Infrastructure/MassTransit/Activities/Pictures/UpdateAlbumPictureActivity.cs b/backend/Core/Musify.Infrastructure/MassTransit/Activities/Pictures/UpdateAlbumPictureActivity.cs index 6f9b0a2..9b5d1c1 100644 --- a/backend/Core/Musify.Infrastructure/MassTransit/Activities/Pictures/UpdateAlbumPictureActivity.cs +++ b/backend/Core/Musify.Infrastructure/MassTransit/Activities/Pictures/UpdateAlbumPictureActivity.cs @@ -89,7 +89,7 @@ internal class UpdateAlbumPictureActivity( return compensateContext.Compensated(); } - album.Pictures = new AlbumPictures + album.Pictures = new EntityPictures { OriginalName = compensateContext.Log.PreviousOriginalPictureKey, SmallName = compensateContext.Log.PreviousSmallPictureKey, diff --git a/backend/Core/Musify.Infrastructure/MassTransit/Activities/Pictures/UpdatePlayListPictureActivity.cs b/backend/Core/Musify.Infrastructure/MassTransit/Activities/Pictures/UpdatePlayListPictureActivity.cs index f5ab673..d62995b 100644 --- a/backend/Core/Musify.Infrastructure/MassTransit/Activities/Pictures/UpdatePlayListPictureActivity.cs +++ b/backend/Core/Musify.Infrastructure/MassTransit/Activities/Pictures/UpdatePlayListPictureActivity.cs @@ -89,7 +89,7 @@ internal class UpdatePlayListPictureActivity( return compensateContext.Compensated(); } - playList.Pictures = new PlayListPictures + playList.Pictures = new EntityPictures { OriginalName = compensateContext.Log.PreviousOriginalPictureKey, SmallName = compensateContext.Log.PreviousSmallPictureKey, diff --git a/backend/Core/Musify.Infrastructure/Persistence/Database.cs b/backend/Core/Musify.Infrastructure/Persistence/Database.cs index e2b04b2..70e5e9f 100644 --- a/backend/Core/Musify.Infrastructure/Persistence/Database.cs +++ b/backend/Core/Musify.Infrastructure/Persistence/Database.cs @@ -64,7 +64,7 @@ public class Database(DatabaseConfiguration configuration) modelBuilder.Entity() .Property(playList => playList.Visibility) - .HasDefaultValue(PlaylistVisibility.Private); + .HasDefaultValue(PlayListVisibility.Private); modelBuilder.Entity() .OwnsOne(playList => playList.Pictures, pictures => diff --git a/backend/Core/Musify.Infrastructure/Persistence/Migrations/DatabaseModelSnapshot.cs b/backend/Core/Musify.Infrastructure/Persistence/Migrations/DatabaseModelSnapshot.cs index f543d34..1ad303c 100644 --- a/backend/Core/Musify.Infrastructure/Persistence/Migrations/DatabaseModelSnapshot.cs +++ b/backend/Core/Musify.Infrastructure/Persistence/Migrations/DatabaseModelSnapshot.cs @@ -379,12 +379,13 @@ namespace Musify.Infrastructure.Persistence.Migrations .HasMaxLength(50) .HasColumnType("character varying(50)"); + b.Property("OwnerUserId") + .HasColumnType("bigint") + .HasColumnName("UserId"); + b.Property("UpdatedAt") .HasColumnType("timestamp with time zone"); - b.Property("UserId") - .HasColumnType("bigint"); - b.Property("Visibility") .ValueGeneratedOnAdd() .HasColumnType("integer") @@ -392,7 +393,7 @@ namespace Musify.Infrastructure.Persistence.Migrations b.HasKey("Id"); - b.HasIndex("UserId"); + b.HasIndex("OwnerUserId"); b.ToTable("PlayLists"); }); @@ -756,7 +757,7 @@ namespace Musify.Infrastructure.Persistence.Migrations .OnDelete(DeleteBehavior.Restrict) .IsRequired(); - b.OwnsOne("Musify.Domain.ValueObjects.AlbumPictures", "Pictures", b1 => + b.OwnsOne("Musify.Domain.ValueObjects.EntityPictures", "Pictures", b1 => { b1.Property("AlbumId") .HasColumnType("uuid"); @@ -865,13 +866,13 @@ namespace Musify.Infrastructure.Persistence.Migrations modelBuilder.Entity("Musify.Domain.Entities.PlayList", b => { - b.HasOne("Musify.Domain.Entities.User", "User") + b.HasOne("Musify.Domain.Entities.User", "Owner") .WithMany("PlayLists") - .HasForeignKey("UserId") + .HasForeignKey("OwnerUserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.OwnsOne("Musify.Domain.ValueObjects.PlayListPictures", "Pictures", b1 => + b.OwnsOne("Musify.Domain.ValueObjects.EntityPictures", "Pictures", b1 => { b1.Property("PlayListId") .HasColumnType("uuid"); @@ -904,9 +905,9 @@ namespace Musify.Infrastructure.Persistence.Migrations .HasForeignKey("PlayListId"); }); - b.Navigation("Pictures"); + b.Navigation("Owner"); - b.Navigation("User"); + b.Navigation("Pictures"); }); modelBuilder.Entity("Musify.Domain.Entities.PlayListHasTrack", b => diff --git a/backend/Hosts/Musify.Api/DataTransferObjects/PlayLists/CreatePlayListRequest.cs b/backend/Hosts/Musify.Api/DataTransferObjects/PlayLists/CreatePlayListRequest.cs index bc5910e..5da333d 100644 --- a/backend/Hosts/Musify.Api/DataTransferObjects/PlayLists/CreatePlayListRequest.cs +++ b/backend/Hosts/Musify.Api/DataTransferObjects/PlayLists/CreatePlayListRequest.cs @@ -6,4 +6,4 @@ public record CreatePlayListRequest( string Name, string? Description, Guid? PictureIntentId, - PlaylistVisibility Visibility = PlaylistVisibility.Private); + PlayListVisibility Visibility = PlayListVisibility.Private); diff --git a/backend/Hosts/Musify.Api/DataTransferObjects/PlayLists/UpdatePlayListRequest.cs b/backend/Hosts/Musify.Api/DataTransferObjects/PlayLists/UpdatePlayListRequest.cs index 0ccf8fc..ddf8b87 100644 --- a/backend/Hosts/Musify.Api/DataTransferObjects/PlayLists/UpdatePlayListRequest.cs +++ b/backend/Hosts/Musify.Api/DataTransferObjects/PlayLists/UpdatePlayListRequest.cs @@ -6,4 +6,4 @@ public record UpdatePlayListRequest( string? NewName, string? NewDescription, Guid? NewPictureIntentId, - PlaylistVisibility? NewVisibility = null); + PlayListVisibility? NewVisibility = null); diff --git a/backend/Tests/Musify.Application.Tests/Albums/GetAlbumCoverQueryHandlerTests.cs b/backend/Tests/Musify.Application.Tests/Albums/GetAlbumCoverQueryHandlerTests.cs index 4b84e3d..00c82be 100644 --- a/backend/Tests/Musify.Application.Tests/Albums/GetAlbumCoverQueryHandlerTests.cs +++ b/backend/Tests/Musify.Application.Tests/Albums/GetAlbumCoverQueryHandlerTests.cs @@ -39,7 +39,7 @@ public sealed class GetAlbumCoverQueryHandlerTests : HandlerTestBase public async Task Handle_PicturesStillProcessing_FallsBackToTheOriginal() { var owner = TestEntities.User(); - var album = TestEntities.Album(owner.Id, pictures: Musify.Domain.ValueObjects.AlbumPictures.Pending("original.png")); + var album = TestEntities.Album(owner.Id, pictures: Musify.Domain.ValueObjects.EntityPictures.Pending("original.png")); await SeedAsync(owner, album); var result = await CreateHandler().Handle(new GetAlbumCoverQuery(album.Id, "small"), TestContext.Current.CancellationToken); diff --git a/backend/Tests/Musify.Application.Tests/PlayLists/CreatePlayListCommandHandlerTests.cs b/backend/Tests/Musify.Application.Tests/PlayLists/CreatePlayListCommandHandlerTests.cs index 4a9ea17..a724a5a 100644 --- a/backend/Tests/Musify.Application.Tests/PlayLists/CreatePlayListCommandHandlerTests.cs +++ b/backend/Tests/Musify.Application.Tests/PlayLists/CreatePlayListCommandHandlerTests.cs @@ -71,7 +71,7 @@ public sealed class CreatePlayListCommandHandlerTests : HandlerTestBase var result = await CreateHandler().Handle(command, TestContext.Current.CancellationToken); Assert.False(result.IsError); - Assert.Equal(Musify.Domain.ValueObjects.PlaylistVisibility.Private, result.Value.Visibility); + Assert.Equal(Musify.Domain.ValueObjects.PlayListVisibility.Private, result.Value.Visibility); } [Fact] @@ -80,12 +80,12 @@ public sealed class CreatePlayListCommandHandlerTests : HandlerTestBase var user = TestEntities.User(); await SeedAsync(user); - var command = new CreatePlayListCommand(user.Id, "My Playlist", null, PictureIntentId: null, Visibility: Musify.Domain.ValueObjects.PlaylistVisibility.Public); + var command = new CreatePlayListCommand(user.Id, "My Playlist", null, PictureIntentId: null, Visibility: Musify.Domain.ValueObjects.PlayListVisibility.Public); var result = await CreateHandler().Handle(command, TestContext.Current.CancellationToken); Assert.False(result.IsError); - Assert.Equal(Musify.Domain.ValueObjects.PlaylistVisibility.Public, result.Value.Visibility); + Assert.Equal(Musify.Domain.ValueObjects.PlayListVisibility.Public, result.Value.Visibility); } [Fact] diff --git a/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListByIdQueryHandlerTests.cs b/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListByIdQueryHandlerTests.cs index e393c0d..1d7a5b7 100644 --- a/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListByIdQueryHandlerTests.cs +++ b/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListByIdQueryHandlerTests.cs @@ -14,7 +14,7 @@ public sealed class GetPlayListByIdQueryHandlerTests : HandlerTestBase public async Task Handle_ExistingPlayList_ReturnsItWithCoverTrackIds() { var owner = TestEntities.User(); - var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlaylistVisibility.Public); + var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlayListVisibility.Public); var track = TestEntities.Track(owner); await SeedAsync(owner, playList, track, new PlayListHasTrack { PlayListId = playList.Id, TrackId = track.Id, Position = 0 }); @@ -37,7 +37,7 @@ public sealed class GetPlayListByIdQueryHandlerTests : HandlerTestBase public async Task Handle_PrivatePlayList_RequestedByOwner_ReturnsIt() { var owner = TestEntities.User(); - var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlaylistVisibility.Private); + var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlayListVisibility.Private); await SeedAsync(owner, playList); var result = await CreateHandler().Handle(new GetPlayListByIdQuery(playList.Id, owner.Id), TestContext.Current.CancellationToken); @@ -50,7 +50,7 @@ public sealed class GetPlayListByIdQueryHandlerTests : HandlerTestBase { var owner = TestEntities.User(1, "owner"); var stranger = TestEntities.User(2, "stranger"); - var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlaylistVisibility.Private); + var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlayListVisibility.Private); await SeedAsync(owner, stranger, playList); var result = await CreateHandler().Handle(new GetPlayListByIdQuery(playList.Id, stranger.Id), TestContext.Current.CancellationToken); @@ -62,7 +62,7 @@ public sealed class GetPlayListByIdQueryHandlerTests : HandlerTestBase public async Task Handle_PrivatePlayList_RequestedAnonymously_ReturnsNotFound() { var owner = TestEntities.User(); - var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlaylistVisibility.Private); + var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlayListVisibility.Private); await SeedAsync(owner, playList); var result = await CreateHandler().Handle(new GetPlayListByIdQuery(playList.Id, RequestingUserId: null), TestContext.Current.CancellationToken); @@ -74,7 +74,7 @@ public sealed class GetPlayListByIdQueryHandlerTests : HandlerTestBase public async Task Handle_PublicPlayList_RequestedAnonymously_ReturnsIt() { var owner = TestEntities.User(); - var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlaylistVisibility.Public); + var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlayListVisibility.Public); await SeedAsync(owner, playList); var result = await CreateHandler().Handle(new GetPlayListByIdQuery(playList.Id, RequestingUserId: null), TestContext.Current.CancellationToken); diff --git a/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListTracksQueryHandlerTests.cs b/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListTracksQueryHandlerTests.cs index 013402f..f97d132 100644 --- a/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListTracksQueryHandlerTests.cs +++ b/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListTracksQueryHandlerTests.cs @@ -41,7 +41,7 @@ public sealed class GetPlayListTracksQueryHandlerTests : HandlerTestBase public async Task Handle_PrivatePlayListOfAnotherUser_ReturnsNotFound() { var owner = TestEntities.User(); - var playList = TestEntities.PlayList(owner.Id, visibility: PlaylistVisibility.Private); + var playList = TestEntities.PlayList(owner.Id, visibility: PlayListVisibility.Private); await SeedAsync(owner, playList); var result = await CreateHandler().Handle(new GetPlayListTracksQuery(playList.Id, PageNumber: 1, PageSize: 10, ViewerId: 999), TestContext.Current.CancellationToken); @@ -53,7 +53,7 @@ public sealed class GetPlayListTracksQueryHandlerTests : HandlerTestBase public async Task Handle_PrivatePlayListOfViewer_ReturnsTracks() { var owner = TestEntities.User(); - var playList = TestEntities.PlayList(owner.Id, visibility: PlaylistVisibility.Private); + var playList = TestEntities.PlayList(owner.Id, visibility: PlayListVisibility.Private); await SeedAsync(owner, playList); var result = await CreateHandler().Handle(new GetPlayListTracksQuery(playList.Id, PageNumber: 1, PageSize: 10, ViewerId: owner.Id), TestContext.Current.CancellationToken); diff --git a/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListsByUserIdQueryHandlerTests.cs b/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListsByUserIdQueryHandlerTests.cs index 51eba29..5ffe334 100644 --- a/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListsByUserIdQueryHandlerTests.cs +++ b/backend/Tests/Musify.Application.Tests/PlayLists/GetPlayListsByUserIdQueryHandlerTests.cs @@ -33,8 +33,8 @@ public sealed class GetPlayListsByUserIdQueryHandlerTests : HandlerTestBase var owner = TestEntities.User(); await SeedAsync( owner, - TestEntities.PlayList(owner.Id, "Public one", visibility: PlaylistVisibility.Public), - TestEntities.PlayList(owner.Id, "Private one", visibility: PlaylistVisibility.Private)); + TestEntities.PlayList(owner.Id, "Public one", visibility: PlayListVisibility.Public), + TestEntities.PlayList(owner.Id, "Private one", visibility: PlayListVisibility.Private)); var result = await CreateHandler().Handle(new GetPlayListsByUserIdQuery(owner.Id, Name: null, PageNumber: 1, PageSize: 10, ViewerId: 999), TestContext.Current.CancellationToken); @@ -49,8 +49,8 @@ public sealed class GetPlayListsByUserIdQueryHandlerTests : HandlerTestBase var owner = TestEntities.User(); await SeedAsync( owner, - TestEntities.PlayList(owner.Id, "Public one", visibility: PlaylistVisibility.Public), - TestEntities.PlayList(owner.Id, "Private one", visibility: PlaylistVisibility.Private)); + TestEntities.PlayList(owner.Id, "Public one", visibility: PlayListVisibility.Public), + TestEntities.PlayList(owner.Id, "Private one", visibility: PlayListVisibility.Private)); var result = await CreateHandler().Handle(new GetPlayListsByUserIdQuery(owner.Id, Name: null, PageNumber: 1, PageSize: 10, ViewerId: owner.Id), TestContext.Current.CancellationToken); diff --git a/backend/Tests/Musify.Application.Tests/PlayLists/UpdatePlayListCommandHandlerTests.cs b/backend/Tests/Musify.Application.Tests/PlayLists/UpdatePlayListCommandHandlerTests.cs index fc3c8e7..848f58c 100644 --- a/backend/Tests/Musify.Application.Tests/PlayLists/UpdatePlayListCommandHandlerTests.cs +++ b/backend/Tests/Musify.Application.Tests/PlayLists/UpdatePlayListCommandHandlerTests.cs @@ -69,19 +69,19 @@ public sealed class UpdatePlayListCommandHandlerTests : HandlerTestBase var playList = TestEntities.PlayList(owner.Id); await SeedAsync(owner, playList); - var command = new UpdatePlayListCommand(owner.Id, playList.Id, null, null, null, Musify.Domain.ValueObjects.PlaylistVisibility.Public); + var command = new UpdatePlayListCommand(owner.Id, playList.Id, null, null, null, Musify.Domain.ValueObjects.PlayListVisibility.Public); var result = await CreateHandler().Handle(command, TestContext.Current.CancellationToken); Assert.False(result.IsError); - Assert.Equal(Musify.Domain.ValueObjects.PlaylistVisibility.Public, result.Value.Visibility); + Assert.Equal(Musify.Domain.ValueObjects.PlayListVisibility.Public, result.Value.Visibility); } [Fact] public async Task Handle_NoVisibilitySpecified_LeavesItUnchanged() { var owner = TestEntities.User(); - var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlaylistVisibility.Public); + var playList = TestEntities.PlayList(owner.Id, visibility: Musify.Domain.ValueObjects.PlayListVisibility.Public); await SeedAsync(owner, playList); var command = new UpdatePlayListCommand(owner.Id, playList.Id, "New Name", null, null); @@ -89,7 +89,7 @@ public sealed class UpdatePlayListCommandHandlerTests : HandlerTestBase var result = await CreateHandler().Handle(command, TestContext.Current.CancellationToken); Assert.False(result.IsError); - Assert.Equal(Musify.Domain.ValueObjects.PlaylistVisibility.Public, result.Value.Visibility); + Assert.Equal(Musify.Domain.ValueObjects.PlayListVisibility.Public, result.Value.Visibility); } [Fact] diff --git a/backend/Tests/Musify.Application.Tests/TestSupport/TestEntities.cs b/backend/Tests/Musify.Application.Tests/TestSupport/TestEntities.cs index bf5b8f8..b058d4d 100644 --- a/backend/Tests/Musify.Application.Tests/TestSupport/TestEntities.cs +++ b/backend/Tests/Musify.Application.Tests/TestSupport/TestEntities.cs @@ -79,7 +79,7 @@ public static class TestEntities return track; } - public static PlayListPictures PlayListPictures() => new() + public static EntityPictures PlayListPictures() => new() { OriginalName = "original.webp", SmallName = "small.webp", @@ -91,12 +91,12 @@ public static class TestEntities long userId, string name = "Test Playlist", string? description = null, - PlayListPictures? pictures = null, + EntityPictures? pictures = null, LifeCycleStatus lifeCycleStatus = LifeCycleStatus.Active, - PlaylistVisibility visibility = PlaylistVisibility.Private) => + PlayListVisibility visibility = PlayListVisibility.Private) => new() { - UserId = userId, + OwnerUserId = userId, Name = name, NormalizedName = name.ToUpperInvariant(), Description = description, @@ -105,7 +105,7 @@ public static class TestEntities Visibility = visibility }; - public static AlbumPictures AlbumPictures() => new() + public static EntityPictures AlbumPictures() => new() { OriginalName = "original.webp", SmallName = "small.webp", @@ -118,7 +118,7 @@ public static class TestEntities string title = "Test Album", string? description = null, int? releaseYear = 2024, - AlbumPictures? pictures = null) => + EntityPictures? pictures = null) => new() { Title = title,