refactor(application): co-locate each command/query with its handler

One file per use case under the feature folder (Tracks/PlayLists/Users),
dropping the Commands/Queries/Handlers sub-folders and their namespaces.
Each file now holds the record and its handler in namespace
Musify.Application.<Feature>; external usings updated accordingly.

Build: 0 warnings, 0 errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 04:12:59 +02:00
co-authored by Claude Opus 4.8
parent 6e469dbb4a
commit e802c8565d
46 changed files with 158 additions and 309 deletions
@@ -1,13 +0,0 @@
using ErrorOr;
using Mediator;
using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks.Commands
{
public record CreateTrackCommand(
long UserId,
string Title,
Guid PictureIntentId,
Guid AudioIntentId)
: ICommand<ErrorOr<TrackApplicationResponse>>;
}
@@ -1,10 +0,0 @@
using ErrorOr;
using Mediator;
namespace Musify.Application.Tracks.Commands
{
public record DeleteTrackCommand(
long UserId,
Guid TrackId)
: ICommand<ErrorOr<Success>>;
}
@@ -1,16 +0,0 @@
using ErrorOr;
using Mediator;
using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks.Commands
{
public record RequestTrackUploadUrlsCommand(
long UserId,
string PictureFileType,
string PictureContentType,
string AudioFileType,
string AudioContentType,
long? ExpectedPictureSizeBytes = null,
long? ExpectedAudioSizeBytes = null)
: ICommand<ErrorOr<TrackUploadUrlsResponse>>;
}
@@ -5,15 +5,21 @@ using Microsoft.Extensions.Logging;
using Musify.Application.Configuration;
using Musify.Application.Shared;
using Musify.Application.Events;
using Musify.Application.Tracks.Commands;
using Musify.Application.Tracks.Responses;
using Musify.Application.Services;
using Musify.Domain.Entities;
using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.Tracks.Handlers
namespace Musify.Application.Tracks
{
public record CreateTrackCommand(
long UserId,
string Title,
Guid PictureIntentId,
Guid AudioIntentId)
: ICommand<ErrorOr<TrackApplicationResponse>>;
public class CreateTrackCommandHandler(
IDatabase database,
IEventBus eventBus,
@@ -2,13 +2,17 @@ using ErrorOr;
using Mediator;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Musify.Application.Tracks.Commands;
using Musify.Domain.ValueObjects;
using Musify.Application.Events;
using Musify.Application.Contracts;
namespace Musify.Application.Tracks.Handlers
namespace Musify.Application.Tracks
{
public record DeleteTrackCommand(
long UserId,
Guid TrackId)
: ICommand<ErrorOr<Success>>;
public class DeleteTrackCommandHandler(
IDatabase database,
IEventBus eventBus,
@@ -67,4 +71,4 @@ namespace Musify.Application.Tracks.Handlers
return new Success();
}
}
}
}
@@ -2,11 +2,13 @@ using ErrorOr;
using Mediator;
using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts;
using Musify.Application.Tracks.Queries;
using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks.Handlers
namespace Musify.Application.Tracks
{
public record GetTrackByIdQuery(Guid TrackId)
: IQuery<ErrorOr<TrackApplicationResponse>>;
public class GetTrackByIdQueryHandler(IDatabase database)
: IQueryHandler<GetTrackByIdQuery, ErrorOr<TrackApplicationResponse> >
{
@@ -23,4 +25,4 @@ namespace Musify.Application.Tracks.Handlers
return track;
}
}
}
}
@@ -4,12 +4,14 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Musify.Application.Configuration;
using Musify.Application.Contracts;
using Musify.Application.Tracks.Queries;
using Musify.Application.Tracks.Responses;
using Musify.Domain.ValueObjects;
namespace Musify.Application.Tracks.Handlers
namespace Musify.Application.Tracks
{
public record GetTrackStreamQuery(Guid TrackId, long UserId)
: IQuery<ErrorOr<TrackStreamResponse>>;
public class GetTrackStreamQueryHandler(
IDatabase database,
IStreamTicketService ticketService,
@@ -2,13 +2,15 @@ using ErrorOr;
using Mediator;
using Microsoft.EntityFrameworkCore;
using Musify.Application.Pagination;
using Musify.Application.Tracks.Queries;
using Musify.Application.Tracks.Responses;
using X.PagedList.EF;
using Musify.Application.Contracts;
namespace Musify.Application.Tracks.Handlers
namespace Musify.Application.Tracks
{
public record GetTracksQuery(int PageNumber = 1, int PageSize = 10)
: IQuery<ErrorOr<PaginatedResponse<TrackApplicationResponse> >>;
public class GetTracksQueryHandler(IDatabase database)
: IQueryHandler<GetTracksQuery, ErrorOr<PaginatedResponse<TrackApplicationResponse>> >
{
@@ -26,4 +28,4 @@ namespace Musify.Application.Tracks.Handlers
return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks);
}
}
}
}
@@ -2,13 +2,19 @@ using ErrorOr;
using Mediator;
using Microsoft.EntityFrameworkCore;
using Musify.Application.Pagination;
using Musify.Application.Tracks.Queries;
using Musify.Application.Tracks.Responses;
using X.PagedList.EF;
using Musify.Application.Contracts;
namespace Musify.Application.Tracks.Handlers
namespace Musify.Application.Tracks
{
public record GetTracksByUserIdQuery(
long UserId,
string? Name = null,
int PageNumber = 1,
int PageSize = 10)
: IQuery<ErrorOr<PaginatedResponse<TrackApplicationResponse> > >;
public class GetTracksByUserIdQueryHandler(IDatabase database)
: IQueryHandler<GetTracksByUserIdQuery, ErrorOr<PaginatedResponse<TrackApplicationResponse>> >
{
@@ -38,4 +44,4 @@ namespace Musify.Application.Tracks.Handlers
return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks);
}
}
}
}
@@ -1,9 +0,0 @@
using ErrorOr;
using Mediator;
using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks.Queries
{
public record GetTrackByIdQuery(Guid TrackId)
: IQuery<ErrorOr<TrackApplicationResponse>>;
}
@@ -1,9 +0,0 @@
using ErrorOr;
using Mediator;
using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks.Queries
{
public record GetTrackStreamQuery(Guid TrackId, long UserId)
: IQuery<ErrorOr<TrackStreamResponse>>;
}
@@ -1,14 +0,0 @@
using ErrorOr;
using Mediator;
using Musify.Application.Pagination;
using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks.Queries
{
public record GetTracksByUserIdQuery(
long UserId,
string? Name = null,
int PageNumber = 1,
int PageSize = 10)
: IQuery<ErrorOr<PaginatedResponse<TrackApplicationResponse> > >;
}
@@ -1,10 +0,0 @@
using ErrorOr;
using Mediator;
using Musify.Application.Pagination;
using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks.Queries
{
public record GetTracksQuery(int PageNumber = 1, int PageSize = 10)
: IQuery<ErrorOr<PaginatedResponse<TrackApplicationResponse> >>;
}
@@ -4,14 +4,23 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Musify.Application.Configuration;
using Musify.Application.Services;
using Musify.Application.Tracks.Commands;
using Musify.Application.Tracks.Responses;
using Musify.Domain.Entities;
using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.Tracks.Handlers
namespace Musify.Application.Tracks
{
public record RequestTrackUploadUrlsCommand(
long UserId,
string PictureFileType,
string PictureContentType,
string AudioFileType,
string AudioContentType,
long? ExpectedPictureSizeBytes = null,
long? ExpectedAudioSizeBytes = null)
: ICommand<ErrorOr<TrackUploadUrlsResponse>>;
public class RequestTrackUploadUrlsCommandHandler(
IDatabase database,
UploadIntentValidator uploadIntentValidator,