feat(api, domain, core): Глобальные модели ошибок. ConfigureValidator - валидатор контроллеров. GlobalExceptionHandler - глобальный обработчик ошибок в API.

This commit is contained in:
Mikhail Trubnikov
2026-05-19 16:19:55 +10:00
parent c0148088c1
commit d8af0253b1
10 changed files with 236 additions and 33 deletions

View File

@@ -0,0 +1,96 @@
namespace PARR.Domain.Exceptions
{
/// <summary>
/// Базовый класс для всех ошибок
/// </summary>
public abstract class BaseException : Exception
{
protected BaseException(string message) : base(message) { }
}
/// <summary>
/// Ошибка БД. 502
/// </summary>
public class DbErrorException : BaseException
{
/// <summary>
/// Ошибка БД.
/// </summary>
/// <param name="message"></param>
public DbErrorException(string message) : base(message) { }
}
/// <summary>
/// Объект не найден. 404
/// </summary>
public class NotFoundException : BaseException
{
/// <summary>
/// Объект не найден.
/// </summary>
/// <param name="message"></param>
public NotFoundException(string message) : base(message) { }
}
/// <summary>
/// Ошибка валидации. 400.
/// Использовать эту ошибку, если не подходит валидация от Fluent (ValidationException)
/// </summary>
public class AppValidationException : BaseException
{
/// <summary>
/// Ошибка валидации.
/// </summary>
/// <param name="message"></param>
public AppValidationException(string message) : base(message) { }
}
/// <summary>
/// Объект уже существует. 409
/// </summary>
public class AlreadyExistsException : BaseException
{
/// <summary>
/// Объект уже существует.
/// </summary>
/// <param name="message"></param>
public AlreadyExistsException(string message) : base(message) { }
}
/// <summary>
/// Ошибка при работе с внешним сервисом. 502
/// </summary>
public class ExternalServiceException : BaseException
{
/// <summary>
/// Ошибка при работе с внешним сервисом.
/// </summary>
/// <param name="message"></param>
public ExternalServiceException(string message) : base(message) { }
}
/// <summary>
/// Пользователь не аутентифицирован. 401
/// </summary>
public class UnauthorizedException : BaseException
{
/// <summary>
/// Пользователь не аутентифицирован.
/// </summary>
/// <param name="message"></param>
public UnauthorizedException(string message) : base(message) { }
}
/// <summary>
/// Доступ запрещен. 403.
/// Пользователь вошел в систему (мы знаем, кто он), но у него нет прав на конкретное действие или объект.
/// </summary>
public class ForbiddenException : BaseException
{
/// <summary>
/// Доступ запрещен.
/// </summary>
/// <param name="message"></param>
public ForbiddenException(string message) : base(message) { }
}
}

View File

@@ -8,7 +8,6 @@
<ItemGroup>
<Folder Include="Common\Rabbit\Events\" />
<Folder Include="Exceptions\" />
</ItemGroup>
<ItemGroup>