Added endpoints for specific verspakketten, added sorting for All Verspakketten endpoint

This commit is contained in:
moarten
2026-04-14 21:47:46 +02:00
parent 7bce78aa0c
commit 0acc9a1f8e
15 changed files with 351 additions and 10 deletions

View File

@@ -0,0 +1,42 @@
using Cortex.Mediator.Queries;
using Lutra.Application.Interfaces;
using Lutra.Application.Models.Supermarkten;
using Lutra.Application.Models.Verspakketten;
using Microsoft.EntityFrameworkCore;
namespace Lutra.Application.Verspakketten
{
public sealed partial class GetVerspakket
{
public sealed class Handler(ILutraDbContext context) : IQueryHandler<Query, Response?>
{
public async Task<Response?> Handle(Query request, CancellationToken cancellationToken)
{
var verspakket = await context.Verspaketten
.AsNoTracking()
.Where(v => v.Id == request.Id)
.Select(v => new Verspakket
{
Naam = v.Naam,
PrijsInCenten = v.PrijsInCenten,
Beoordelingen = v.Beoordelingen
.Select(b => new Beoordeling
{
CijferSmaak = b.CijferSmaak,
CijferBereiden = b.CijferBereiden,
Aanbevolen = b.Aanbevolen,
Tekst = b.Tekst
})
.ToArray(),
Supermarkt = new Supermarkt
{
Naam = v.Supermarkt.Naam
}
})
.SingleOrDefaultAsync(cancellationToken);
return verspakket is null ? null : new Response { Verspakket = verspakket };
}
}
}
}

View File

@@ -0,0 +1,9 @@
using Cortex.Mediator.Queries;
namespace Lutra.Application.Verspakketten
{
public sealed partial class GetVerspakket
{
public record Query(Guid Id) : IQuery<Response?>;
}
}

View File

@@ -0,0 +1,12 @@
using Lutra.Application.Models.Verspakketten;
namespace Lutra.Application.Verspakketten
{
public sealed partial class GetVerspakket
{
public sealed class Response
{
public required Verspakket Verspakket { get; set; }
}
}
}

View File

@@ -0,0 +1,4 @@
namespace Lutra.Application.Verspakketten
{
public sealed partial class GetVerspakket { }
}

View File

@@ -12,15 +12,36 @@ namespace Lutra.Application.Verspakketten
{
public async Task<Response> Handle(Query request, CancellationToken cancellationToken)
{
var verspakketten = await context.Verspaketten
.AsNoTracking()
.OrderBy(v => v.Naam)
var query = context.Verspaketten.AsNoTracking();
// Apply sort before pagination so the database handles ordering efficiently.
IOrderedQueryable<Domain.Entities.Verspakket> sorted = request.SortField switch
{
VerspakketSortField.AverageCijferSmaak =>
request.SortDirection == SortDirection.Ascending
? query.OrderBy(v => v.Beoordelingen.Average(b => (double)b.CijferSmaak))
: query.OrderByDescending(v => v.Beoordelingen.Average(b => (double)b.CijferSmaak)),
VerspakketSortField.AverageCijferBereiden =>
request.SortDirection == SortDirection.Ascending
? query.OrderBy(v => v.Beoordelingen.Average(b => (double)b.CijferBereiden))
: query.OrderByDescending(v => v.Beoordelingen.Average(b => (double)b.CijferBereiden)),
VerspakketSortField.PrijsInCenten =>
request.SortDirection == SortDirection.Ascending
? query.OrderBy(v => v.PrijsInCenten)
: query.OrderByDescending(v => v.PrijsInCenten),
VerspakketSortField.Naam or _ =>
request.SortDirection == SortDirection.Ascending
? query.OrderBy(v => v.Naam)
: query.OrderByDescending(v => v.Naam),
};
var verspakketten = await sorted
.Skip(request.Skip)
.Take(request.Take)
.Select(v => new Verspakket
{
Naam = v.Naam,
PrijsInCenten = null,
PrijsInCenten = v.PrijsInCenten,
Beoordelingen = v.Beoordelingen
.Select(b => new Beoordeling
{

View File

@@ -4,6 +4,10 @@ namespace Lutra.Application.Verspakketten
{
public sealed partial class GetVerspakketten
{
public record Query(int Skip, int Take) : IQuery<Response>;
public record Query(
int Skip,
int Take,
VerspakketSortField SortField = VerspakketSortField.Naam,
SortDirection SortDirection = SortDirection.Ascending) : IQuery<Response>;
}
}

View File

@@ -0,0 +1,7 @@
namespace Lutra.Application.Verspakketten;
public enum SortDirection
{
Ascending,
Descending
}

View File

@@ -0,0 +1,9 @@
namespace Lutra.Application.Verspakketten;
public enum VerspakketSortField
{
Naam,
PrijsInCenten,
AverageCijferSmaak,
AverageCijferBereiden
}