Added endpoints for specific verspakketten, added sorting for All Verspakketten endpoint
This commit is contained in:
@@ -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 };
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
using Cortex.Mediator.Queries;
|
||||
|
||||
namespace Lutra.Application.Verspakketten
|
||||
{
|
||||
public sealed partial class GetVerspakket
|
||||
{
|
||||
public record Query(Guid Id) : IQuery<Response?>;
|
||||
}
|
||||
}
|
||||
@@ -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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
4
Lutra/Lutra.Application/Verspakketten/GetVerspakket.cs
Normal file
4
Lutra/Lutra.Application/Verspakketten/GetVerspakket.cs
Normal file
@@ -0,0 +1,4 @@
|
||||
namespace Lutra.Application.Verspakketten
|
||||
{
|
||||
public sealed partial class GetVerspakket { }
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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>;
|
||||
}
|
||||
}
|
||||
|
||||
7
Lutra/Lutra.Application/Verspakketten/SortDirection.cs
Normal file
7
Lutra/Lutra.Application/Verspakketten/SortDirection.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace Lutra.Application.Verspakketten;
|
||||
|
||||
public enum SortDirection
|
||||
{
|
||||
Ascending,
|
||||
Descending
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Lutra.Application.Verspakketten;
|
||||
|
||||
public enum VerspakketSortField
|
||||
{
|
||||
Naam,
|
||||
PrijsInCenten,
|
||||
AverageCijferSmaak,
|
||||
AverageCijferBereiden
|
||||
}
|
||||
Reference in New Issue
Block a user