Exceptions handling
This commit is contained in:
@@ -18,7 +18,7 @@ namespace ApplicationLayer.DataAccessingServices.Locations.RequestHandlers.Admin
|
||||
|
||||
if (request.Cities.Distinct().Count() < request.Cities.Length)
|
||||
{
|
||||
throw new MultipleIdenticalCitiesInCountry();
|
||||
throw new MultipleIdenticalCitiesInCountryException();
|
||||
}
|
||||
|
||||
var country = new Country
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
|
||||
namespace ApplicationLayer.DataAccessingServices.Locations.RequestHandlers.AdminRequests.Exceptions
|
||||
{
|
||||
public class MultipleIdenticalCitiesInCountry() : ApiException("There are multiple cities with one name in the country.");
|
||||
public class MultipleIdenticalCitiesInCountryException() : ApiException("There are multiple cities with one name in the country.");
|
||||
}
|
||||
@@ -5,5 +5,5 @@ namespace Infrastructure.Database.GeneralExceptions;
|
||||
/// Exception to throw when entity not found
|
||||
/// <param name="id">Identifier of entity</param>
|
||||
/// <typeparam name="T">Type of entity</typeparam>
|
||||
public class EntityNotFoundByIdException<T>(Guid id) : EntityNotFoundException<T>($"Entity {typeof(T).Name} with id {id} not found.")
|
||||
where T : class, IEntity;
|
||||
public class EntityNotFoundByIdException<T>(Guid id) : EntityNotFoundException<T>($"{typeof(T).Name} with id {id} not found.")
|
||||
where T : class, IEntity;
|
||||
|
||||
@@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using SchengenVisaApi.Common;
|
||||
using SchengenVisaApi.ExceptionFilters;
|
||||
using Swashbuckle.AspNetCore.SwaggerGen;
|
||||
|
||||
namespace SchengenVisaApi;
|
||||
@@ -39,7 +40,9 @@ public static class DependencyInjection
|
||||
services.AddSwagger();
|
||||
}
|
||||
|
||||
services.AddControllers();
|
||||
services.AddProblemDetails();
|
||||
|
||||
services.AddControllers(opts => opts.Filters.Add<GlobalExceptionsFilter>());
|
||||
}
|
||||
|
||||
/// Adds authentication, authorization and token generator
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
using ApplicationLayer.DataAccessingServices.AuthServices.LoginService.Exceptions;
|
||||
using ApplicationLayer.DataAccessingServices.Locations.RequestHandlers.AdminRequests.Exceptions;
|
||||
using ApplicationLayer.GeneralExceptions;
|
||||
using Domains;
|
||||
using Infrastructure.Database.GeneralExceptions;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
|
||||
namespace SchengenVisaApi.ExceptionFilters
|
||||
{
|
||||
/// Handles <see cref="ApiException"/>
|
||||
public class GlobalExceptionsFilter : IAsyncExceptionFilter
|
||||
{
|
||||
/// <inheritdoc cref="IExceptionFilter.OnException"/>
|
||||
public async Task OnExceptionAsync(ExceptionContext context)
|
||||
{
|
||||
var exception = context.Exception;
|
||||
var problemDetails = new ProblemDetails();
|
||||
|
||||
if (exception is ApiException)
|
||||
{
|
||||
problemDetails.Detail = exception.Message;
|
||||
switch (exception)
|
||||
{
|
||||
case EntityNotFoundException<IEntity>:
|
||||
problemDetails.Status = StatusCodes.Status404NotFound;
|
||||
problemDetails.Title = "Requested entity not found";
|
||||
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.4";
|
||||
break;
|
||||
case IncorrectLoginDataException:
|
||||
problemDetails.Status = StatusCodes.Status403Forbidden;
|
||||
problemDetails.Title = "Auth failed";
|
||||
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.3";
|
||||
break;
|
||||
case AlreadyExistsException:
|
||||
problemDetails.Status = StatusCodes.Status409Conflict;
|
||||
problemDetails.Title = "Already exists";
|
||||
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.8";
|
||||
break;
|
||||
case MultipleIdenticalCitiesInCountryException:
|
||||
problemDetails.Status = StatusCodes.Status400BadRequest;
|
||||
problemDetails.Title = "Can not add cities with one name to one country";
|
||||
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.1";
|
||||
break;
|
||||
default:
|
||||
problemDetails.Status = StatusCodes.Status400BadRequest;
|
||||
problemDetails.Title = "Bad request";
|
||||
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.5.1";
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
problemDetails.Status = StatusCodes.Status500InternalServerError;
|
||||
problemDetails.Title = "An unhandled error occured";
|
||||
problemDetails.Type = "https://datatracker.ietf.org/doc/html/rfc7231#section-6.6.1";
|
||||
}
|
||||
|
||||
await Results.Problem(problemDetails).ExecuteAsync(context.HttpContext);
|
||||
context.ExceptionHandled = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,8 @@ public static class PipelineRequest
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseStatusCodePages();
|
||||
|
||||
app.UseAuthentication()
|
||||
.UseAuthorization();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user