Create, update, delete and list albums, plus adding and removing their tracks, mirroring the playlist handlers. Only tracks the user uploaded can go into an album, and removing one renumbers the rest so the tracklist stays 1..n.
45 lines
1.9 KiB
C#
45 lines
1.9 KiB
C#
using ErrorOr;
|
|
using Mediator;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Musify.Application.Albums.Responses;
|
|
using Musify.Application.Contracts;
|
|
using Musify.Application.Shared;
|
|
using X.PagedList;
|
|
using X.PagedList.EF;
|
|
|
|
namespace Musify.Application.Albums
|
|
{
|
|
public record GetAlbumsByUserIdQuery(long UserId, int PageNumber, int PageSize)
|
|
: IQuery<ErrorOr<PaginatedResponse<AlbumApplicationResponse>>>;
|
|
|
|
public class GetAlbumsByUserIdQueryHandler(IDatabase database)
|
|
: IQueryHandler<GetAlbumsByUserIdQuery, ErrorOr<PaginatedResponse<AlbumApplicationResponse>>>
|
|
{
|
|
public async ValueTask<ErrorOr<PaginatedResponse<AlbumApplicationResponse>>> Handle(GetAlbumsByUserIdQuery request, CancellationToken cancellationToken)
|
|
{
|
|
var userExists = await database.Users
|
|
.AsNoTracking()
|
|
.AnyAsync(user => user.Id == request.UserId, cancellationToken);
|
|
if (!userExists)
|
|
return Error.NotFound(description: $"User {request.UserId} not found");
|
|
|
|
var albumsQuery = database.UserAlbums
|
|
.AsNoTracking()
|
|
.Where(album => album.OwnerUserId == request.UserId);
|
|
|
|
var totalCount = await albumsQuery.CountAsync(cancellationToken);
|
|
|
|
var pagedEntities = await albumsQuery
|
|
.OrderByDescending(album => album.CreatedAt)
|
|
.Select(album => new { Album = album, TrackCount = album.AlbumTracks.Count })
|
|
.ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken);
|
|
|
|
var pagedAlbums = new StaticPagedList<AlbumApplicationResponse>(
|
|
pagedEntities.Select(entry => AlbumApplicationResponse.FromEntity(entry.Album, entry.TrackCount)),
|
|
pagedEntities.PageNumber, pagedEntities.PageSize, pagedEntities.TotalItemCount);
|
|
|
|
return PaginatedResponse<AlbumApplicationResponse>.FromPagedList(pagedAlbums);
|
|
}
|
|
}
|
|
}
|