From a56c168fd6f2a21a9320eab2f1a41b800020b9ef Mon Sep 17 00:00:00 2001 From: Sander van Vliet Date: Fri, 29 Dec 2023 14:09:13 +0100 Subject: [PATCH] Return HTTP Conflict when a route for this user already exists which is exactly the same --- .../Adapters/SqliteRouteStore.cs | 5 +++++ .../Controllers/RoutesController.cs | 14 +++++++++++++- src/RoadCaptain.App.Web/DuplicateRouteException.cs | 10 ++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/RoadCaptain.App.Web/DuplicateRouteException.cs diff --git a/src/RoadCaptain.App.Web/Adapters/SqliteRouteStore.cs b/src/RoadCaptain.App.Web/Adapters/SqliteRouteStore.cs index 2b5b639c..35f2447f 100644 --- a/src/RoadCaptain.App.Web/Adapters/SqliteRouteStore.cs +++ b/src/RoadCaptain.App.Web/Adapters/SqliteRouteStore.cs @@ -148,6 +148,11 @@ public Models.RouteModel Store(CreateRouteModel createModel, User user) { var route = RouteStorageModelFrom(createModel, user); + if (_roadCaptainDataContext.Routes.Any(r => r.Hash == route.Hash && r.UserId == route.UserId)) + { + throw new DuplicateRouteException(); + } + _roadCaptainDataContext.Routes.Add(route); _roadCaptainDataContext.SaveChanges(); diff --git a/src/RoadCaptain.App.Web/Controllers/RoutesController.cs b/src/RoadCaptain.App.Web/Controllers/RoutesController.cs index 79410e14..5c39761c 100644 --- a/src/RoadCaptain.App.Web/Controllers/RoutesController.cs +++ b/src/RoadCaptain.App.Web/Controllers/RoutesController.cs @@ -84,7 +84,19 @@ public IActionResult CreateRoute([FromBody] CreateRouteModel createRoute) (int)HttpStatusCode.BadRequest, "Invalid user")); } - return Ok(_routeStore.Store(createRoute, user)); + try + { + return Ok(_routeStore.Store(createRoute, user)); + } + catch (DuplicateRouteException e) + { + _monitoringEvents.Error(e, "Duplicate route exists"); + + return Conflict(ProblemDetailsFactory.CreateProblemDetails( + HttpContext, + (int)HttpStatusCode.Conflict, + "Duplicate route exists")); + } } [HttpPut("{id:long}", Name = "UpdateRouteById")] diff --git a/src/RoadCaptain.App.Web/DuplicateRouteException.cs b/src/RoadCaptain.App.Web/DuplicateRouteException.cs new file mode 100644 index 00000000..eab942d0 --- /dev/null +++ b/src/RoadCaptain.App.Web/DuplicateRouteException.cs @@ -0,0 +1,10 @@ +namespace RoadCaptain.App.Web +{ + public class DuplicateRouteException : Exception + { + public DuplicateRouteException() + : base("Another route exists that is exactly the same") + { + } + } +} \ No newline at end of file