mirror of
https://github.com/GCMatters/hermes.git
synced 2026-02-04 05:30:13 +01:00
142 lines
5.8 KiB
C#
142 lines
5.8 KiB
C#
using Microsoft.AspNetCore.Http;
|
|
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, HttpContext httpContext) =>
|
|
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, HttpContext httpContext, GeneralUseHelpers guhf) =>
|
|
{
|
|
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.
|
|
Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
|
|
Organisation? org = await guhf.GetOrganisationFromToken(token);
|
|
|
|
// 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!
|
|
Eve.ToEventDetailsDto();
|
|
if (org is null || org.OrganisationId != Eve.OrganisationId) Eve.EventRegistrations = [];
|
|
|
|
return Results.Ok(Eve); //EventDetailsDto
|
|
})
|
|
.WithName(GetEventEndpointName);
|
|
|
|
// POST /events
|
|
group.MapPost("/",
|
|
async (EventCreateDto newEvent, ApplicationDbContext dbContext, HttpContext httpContext, GeneralUseHelpers guhf) =>
|
|
{
|
|
|
|
// Uzyskaj organizację z tokenu
|
|
Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
|
|
Organisation? org = await guhf.GetOrganisationFromToken(token);
|
|
if (org is null) return Results.Unauthorized();
|
|
|
|
Event Eve = newEvent.ToEntity();
|
|
|
|
// Wyzeruj EventRegistrations, ponieważ nie są to dane,
|
|
// które powinniśmy przyjmować bez zgody wolontariuszy!
|
|
Eve.EventRegistrations = [];
|
|
|
|
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, GeneralUseHelpers guhf, HttpContext httpContext) =>
|
|
{
|
|
|
|
// Uzyskaj organizację z tokenu
|
|
Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
|
|
Organisation? org = await guhf.GetOrganisationFromToken(token);
|
|
if (org is null) return Results.Unauthorized();
|
|
|
|
var existingEvent = await dbContext.Events.FindAsync(id);
|
|
if (existingEvent is null)
|
|
{
|
|
return Results.NotFound();
|
|
}
|
|
|
|
// Sprawdź, czy organizacja ma prawo
|
|
// do zmodyfikowania tego (EventId = id) eventu.
|
|
if (org.OrganisationId != existingEvent.OrganisationId) return Results.StatusCode(403);
|
|
|
|
// Nadpisz organisationId (obecne w updatedEvent,
|
|
// lecz nie sprawdzane poniżej) na to, co odczytaliśmy
|
|
// do existingEvent.
|
|
// ... trzeba by było tworzyć obiekt od nowa, zamiast tego po prostu zwróćmy błąd.
|
|
if (existingEvent.OrganisationId != updatedEvent.OrganisationId) return Results.StatusCode(403);
|
|
|
|
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, GeneralUseHelpers guhf, HttpContext httpContext) =>
|
|
{
|
|
|
|
// Uzyskaj organizację z tokenu
|
|
Token? token = await guhf.GetTokenFromHTTPContext(httpContext);
|
|
Organisation? org = await guhf.GetOrganisationFromToken(token);
|
|
if (org is null) return Results.StatusCode(403);
|
|
|
|
// Sprawdź, czy organizacja ma prawo
|
|
// do usunięcia tego (EventId = id) eventu.
|
|
Event? Eve = await dbContext.Events.FindAsync(id);
|
|
if (Eve is null) return Results.NotFound();
|
|
else if (org.OrganisationId != Eve.OrganisationId) return Results.StatusCode(403);
|
|
|
|
await dbContext.Events
|
|
.Where(Eve => Eve.EventId == id)
|
|
.ExecuteDeleteAsync();
|
|
|
|
return Results.NoContent();
|
|
});
|
|
|
|
return group;
|
|
}
|
|
}
|
|
}
|