using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading; using System.Threading.Tasks; using Dapper; using ErsatzTV.Infrastructure.Data; using LanguageExt; using MediatR; using Microsoft.EntityFrameworkCore; using static ErsatzTV.Application.MediaCollections.Mapper; namespace ErsatzTV.Application.MediaCollections.Queries { public class GetPagedCollectionsHandler : IRequestHandler { private readonly IDbConnection _dbConnection; private readonly IDbContextFactory _dbContextFactory; public GetPagedCollectionsHandler(IDbContextFactory dbContextFactory, IDbConnection dbConnection) { _dbContextFactory = dbContextFactory; _dbConnection = dbConnection; } public async Task Handle( GetPagedCollections request, CancellationToken cancellationToken) { int count = await _dbConnection.QuerySingleAsync(@"SELECT COUNT (*) FROM Collection"); await using TvContext dbContext = _dbContextFactory.CreateDbContext(); List page = await dbContext.Collections.FromSqlRaw( @"SELECT * FROM Collection ORDER BY Name COLLATE NOCASE LIMIT {0} OFFSET {1}", request.PageSize, request.PageNum * request.PageSize) .ToListAsync(cancellationToken) .Map(list => list.Map(ProjectToViewModel).ToList()); return new PagedMediaCollectionsViewModel(count, page); } } }