Browse Source

Events controller with query and create actions

Lukas Angerer 3 years ago
parent
commit
701c083f64

+ 50 - 0
src/RunnersMeet.Server/Controllers/EventsController.cs

@@ -0,0 +1,50 @@
+
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Controllers;
+
+[Route("api/[controller]")]
+[ApiController]
+[Authorize("Tracks")]
+public class EventsController : ControllerBase
+{
+	private readonly IRequestRouter _requestRouter;
+	private readonly ApiSettings _settings;
+
+	public EventsController(
+		IOptions<ApiSettings> apiOptions,
+		IRequestRouter requestRouter)
+	{
+		_requestRouter = requestRouter;
+		_settings = apiOptions.Value;
+	}
+
+	[HttpGet]
+	public ActionResult<ResultPage<Event>> GetEvents([FromQuery] EventsRequest eventsRequest)
+	{
+		if (eventsRequest.Owner is "me")
+		{
+			eventsRequest = eventsRequest with { Owner = ApiUser.Current.UserId };
+		}
+
+		var events = _requestRouter
+			.For(eventsRequest)
+			.With(new QueryPagingConfig(PageSize: _settings.PageSize))
+			.Process<IList<Event>>();
+
+		return Ok(new ResultPage<Event>(events, eventsRequest.Page, _settings.PageSize));
+	}
+
+	[HttpPost]
+	public ActionResult<Event> CreateEvent([FromBody] Event newEvent)
+	{
+		var createdEvent = _requestRouter
+			.For(newEvent)
+			.Process<Event>();
+
+		return Ok(createdEvent);
+	}
+}

+ 8 - 0
src/RunnersMeet.Server/Domain/EventsRequest.cs

@@ -0,0 +1,8 @@
+namespace RunnersMeet.Server.Domain;
+
+public sealed record EventsRequest
+{
+	public int Page { get; init; }
+	public string? Owner { get; init; }
+	public string? Filter { get; init; }
+}

+ 21 - 0
src/RunnersMeet.Server/Persistence/CreateEventCommand.cs

@@ -0,0 +1,21 @@
+using RunnersMeet.Server.Domain;
+using RunnersMeet.Server.GpxFormat;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class CreateEventCommand : IRequestHandler<Event, Event>
+{
+	private readonly IDatabase _database;
+
+	public CreateEventCommand(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public Event Handle(Event newEvent)
+	{
+		_database.Events.Insert(newEvent);
+
+		return newEvent;
+	}
+}

+ 33 - 0
src/RunnersMeet.Server/Persistence/EventsQuery.cs

@@ -0,0 +1,33 @@
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class EventsQuery : IRequestHandler<EventsRequest, QueryPagingConfig, IList<Event>>
+{
+	private readonly IDatabase _database;
+	private QueryPagingConfig _config = new QueryPagingConfig();
+
+	public EventsQuery(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public IRequestHandler<EventsRequest, IList<Event>> Context(QueryPagingConfig context)
+	{
+		_config = context;
+		return this;
+	}
+
+	public IList<Event> Handle(EventsRequest request)
+	{
+		var query = _database.Events.Query();
+		query.WhereIf(request.Owner != null, e => e.Owner.UserId == request.Owner);
+		query.WhereIf(request.Filter != null, e => e.Title.Contains(request.Filter!));
+
+		return query
+			.OrderBy(track => track.StartTime)
+			.Offset(request.Page * _config.PageSize)
+			.Limit(_config.PageSize)
+			.ToList();
+	}
+}

+ 2 - 0
src/RunnersMeet.Server/Persistence/IDatabase.cs

@@ -7,4 +7,6 @@ public interface IDatabase
 {
 	ILiteCollection<Track> Tracks { get; }
 	ILiteCollection<UserProfile> Users { get; }
+	ILiteCollection<Event> Events { get; }
+	ILiteCollection<Registration> Registrations { get; }
 }