File size: 1,616 Bytes
67aa1ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""Jerarquía de excepciones de la aplicación.

Cada excepción declara el código HTTP con el que debe responderse.
Los manejadores registrados en :mod:`app.core.exception_handlers` se
encargan de traducirlas a respuestas JSON consistentes.
"""

from __future__ import annotations


class AppException(Exception):
    """Excepción base para todos los errores controlados de la app."""

    status_code: int = 500
    detail: str = "Error interno del servidor."

    def __init__(self, detail: str | None = None) -> None:
        if detail is not None:
            self.detail = detail
        super().__init__(self.detail)


class NotFoundError(AppException):
    """El recurso solicitado no existe."""

    status_code = 404
    detail = "Recurso no encontrado."


class ConflictError(AppException):
    """Conflicto con el estado actual (p. ej. valor duplicado)."""

    status_code = 409
    detail = "El recurso ya existe o genera un conflicto."


class InvalidIdError(AppException):
    """El identificador proporcionado no es un ObjectId válido."""

    status_code = 400
    detail = "Identificador inválido."


class ValidationError(AppException):
    """Error de validación de reglas de negocio."""

    status_code = 422
    detail = "Los datos proporcionados no son válidos."


class AuthenticationError(AppException):
    """Credenciales ausentes o inválidas."""

    status_code = 401
    detail = "No autenticado."


class AuthorizationError(AppException):
    """El usuario no tiene permisos suficientes."""

    status_code = 403
    detail = "No tienes permisos para realizar esta acción."