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; } } }