Răsfoiți Sursa

Server side registrations implementation

Lukas Angerer 2 ani în urmă
părinte
comite
28efb93978

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

@@ -81,4 +81,25 @@ public class EventsController : ControllerBase
 
 		return Ok();
 	}
+
+	[HttpPut("{id}/register")]
+	public ActionResult Register(string id, [FromBody] RegistrationState state)
+	{
+		var user = _requestRouter.For(ApiUser.Current.UserId).Process<UserProfile>();
+		var registration = _requestRouter
+			.For(new RegisterEvent(user, new ObjectId(id), state))
+			.Process<Registration>();
+
+		return Ok(registration);
+	}
+
+	[HttpGet("{id}/registrations")]
+	public ActionResult GetRegistrations(string id)
+	{
+		var registrations = _requestRouter
+			.For(new ObjectId(id))
+			.Process<IList<Registration>>();
+
+		return Ok(registrations);
+	}
 }

+ 3 - 2
src/RunnersMeet.Server/Persistence/Registration.cs → src/RunnersMeet.Server/Domain/Registration.cs

@@ -1,10 +1,11 @@
 using LiteDB;
-using RunnersMeet.Server.Domain;
 
-namespace RunnersMeet.Server.Persistence;
+namespace RunnersMeet.Server.Domain;
 
 public class Registration : IUserData
 {
+	public ObjectId RegistrationId { get; set; } = ObjectId.Empty;
+
 	[BsonRef("users")]
 	public UserProfile Owner { get; set; } = new UserProfile();
 

+ 3 - 1
src/RunnersMeet.Server/Persistence/Database.cs

@@ -32,7 +32,9 @@ public class Database : IDatabase
 		Events.EnsureIndex(e => e.Owner);
 		Events.EnsureIndex(e => e.Title);
 
-		Registrations = _db.GetCollection<Registration>("registrations");
+		Registrations = _db.GetCollection<Registration>("registrations")
+			.Include(r => r.Owner)
+			.Include(r => r.Event);
 		Registrations.EnsureIndex(r => r.Owner);
 		Registrations.EnsureIndex(r => r.Event);
 	}

+ 2 - 2
src/RunnersMeet.Server/Persistence/EventQuery.cs

@@ -12,8 +12,8 @@ public class EventQuery : IRequestHandler<ObjectId, Event>
 		_database = database;
 	}
 
-	public Event Handle(ObjectId trackId)
+	public Event Handle(ObjectId eventId)
 	{
-		return _database.Events.Include(e => e.Track).FindById(trackId);
+		return _database.Events.Include(e => e.Track).FindById(eventId);
 	}
 }

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

@@ -0,0 +1,21 @@
+using LiteDB;
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public class EventRegistrationsQuery : IRequestHandler<ObjectId, IList<Registration>>
+{
+	private readonly IDatabase _database;
+
+	public EventRegistrationsQuery(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public IList<Registration> Handle(ObjectId eventId)
+	{
+		return _database.Registrations
+			.Find(r => r.Event.EventId == eventId)
+			.ToList();
+	}
+}

+ 37 - 0
src/RunnersMeet.Server/Persistence/RegisterEventCommand.cs

@@ -0,0 +1,37 @@
+using LiteDB;
+using RunnersMeet.Server.Domain;
+
+namespace RunnersMeet.Server.Persistence;
+
+public sealed record RegisterEvent(UserProfile Owner, ObjectId EventId, RegistrationState Status);
+
+public class RegisterEventCommand : IRequestHandler<RegisterEvent, Registration>
+{
+	private readonly IDatabase _database;
+
+	public RegisterEventCommand(IDatabase database)
+	{
+		_database = database;
+	}
+
+	public Registration Handle(RegisterEvent request)
+	{
+		var dbEvent = _database.Events
+			.FindById(request.EventId) ?? throw new InvalidOperationException("Trying to register for event that does not exist");
+
+		var registration = _database
+				.Registrations
+				.FindOne(r => r.Owner.UserId == request.Owner.UserId && r.Event.EventId == request.EventId)
+			?? new Registration()
+			{
+				Owner = request.Owner,
+				Event = dbEvent
+			};
+
+		registration.Status = request.Status;
+
+		_database.Registrations.Upsert(registration);
+
+		return registration;
+	}
+}