Files
hermes/WebApp/Endpoints/EventsEndpoints.cs

125 lines
4.1 KiB
C#

using Microsoft.EntityFrameworkCore;
using WebApp.Data;
using WebApp.DTOs;
using WebApp.Entities;
using WebApp.Mapping;
namespace WebApp.Endpoints
{
public static class EventsEndpoints
{
const string GetEventEndpointName = "GetEvent";
public static RouteGroupBuilder MapEventsEndpoints(this WebApplication app)
{
var group = app.MapGroup("api/events")
.WithParameterValidation();
// GET /events
group.MapGet("/", async (ApplicationDbContext dbContext) =>
await dbContext.Events
.Include(Eve => Eve.Organisation)
.OrderByDescending(Eve => Eve.EventId)
.Select(Eve => Eve.ToEventSummaryDto()) //EventSummaryDto
.AsNoTracking()
.ToListAsync());
// GET /events/1
group.MapGet("/{id}", async (int id, ApplicationDbContext dbContext) =>
{
Event? Eve = await dbContext.Events.FindAsync(id);
if (Eve is null) return Results.NotFound();
// Sprawdź, czy token należy do organizacji, a jeżeli tak, to do której.
// ...
// Jeśli token należy do organizacji, która utworzyła to wydarzenie,
// to zwróć także EventRegistrations. W przeciwnym razie usuń to pole
// przed jego wysłaniem!
// ...
return Results.Ok(Eve.ToEventDetailsDto()); //EventDetailsDto
})
.WithName(GetEventEndpointName);
// POST /events
group.MapPost("/", async (EventCreateDto newEvent, ApplicationDbContext dbContext) =>
{
// Uzyskaj organizację z tokenu
// ...
Event Eve = newEvent.ToEntity();
// Wyzeruj EventRegistrations, ponieważ nie są to dane,
// które powinniśmy przyjmować bez zgody wolontariuszy!
// ...
dbContext.Events.Add(Eve);
await dbContext.SaveChangesAsync();
return Results.CreatedAtRoute(
GetEventEndpointName,
new { id = Eve.EventId },
Eve.ToEventDetailsDto()); //EventDetailsDto
});
// PUT /events/1
group.MapPut("/{id}", async (int id, EventUpdateDto updatedEvent, ApplicationDbContext dbContext) =>
{
var existingEvent = await dbContext.Events.FindAsync(id);
if (existingEvent is null)
{
return Results.NotFound();
}
// Uzyskaj organizację z tokenu
// ...
// Sprawdź, czy organizacja ma prawo
// do zmodyfikowania tego (EventId = id) eventu.
// ...
// Nadpisz organisationId (obecne w updatedEvent,
// lecz nie sprawdzane poniżej) na to, co odczytaliśmy
// do existingEvent.
// ...
dbContext.Entry(existingEvent)
.CurrentValues
.SetValues(updatedEvent.ToEntity(id));
dbContext.Entry(existingEvent)
.Collection(Eve => Eve.EventRegistrations)
.IsModified = false;
await dbContext.SaveChangesAsync();
return Results.NoContent();
});
// DELETE /events/1
group.MapDelete("/{id}", async (int id, ApplicationDbContext dbContext) =>
{
// Uzyskaj organizację z tokenu
// ...
// Sprawdź, czy organizacja ma prawo
// do usunięcia tego (EventId = id) eventu.
// ...
await dbContext.Events
.Where(Eve => Eve.EventId == id)
.ExecuteDeleteAsync();
return Results.NoContent();
});
return group;
}
}
}