Omnia Docs
Docs
Backend
Frontend
Docs
Backend
Frontend
  • Backend
  • Arquitectura
  • Error handling

Arquitectura

Models

  • Cada model representa una tabla de la base de datos.

Crear nuevo model

Cada vez que crees un nuevo model, tenés que seguir estos pasos:

  1. Crear el archivo .model dentro de resources.
  • Nombre de la table en snak_case y plural
  • Ordenadas las keys según estos subtítulos: "required relations", "optional relations", "required relation keys", "optional relation keys", "fiels"
  • Para definir las columnas, se debe usar la { optional: true } en los casos que el campo no sea requerido en la creación.
  • Por un lado se hace el tipado de la db y por el otro el de typescript, por eso primero se pasa por ej: @col.Str (db) y luego string (ts).
  • Los casos donde { optional: true } usar **ColOptional<type>**
  • Los casos donde { nullable: true } (o es foreignKey) usar type | null
  • Estos dos son combinables { nullable: true, optional: true } usar **ColOptional<type | null>**
  1. Importarlo en:
  • database/models.ts.
  • types/global/models.global-types.d.

Services

  • Su función es agrupar todas las todas las operaciones relacionadas con un modelo.
  • Existe un service por cada modelo.
  • Puede comunicarse con otros services si es necesario.
  • Todas sus funciones deben interactuar con la base de datos, ya sea:
    • Directamente, usando this.db,
    • Indirectamente, llamando a otro método del mismo service (al menos una de estas dos formas debe estar presente), y
    • Opcionalmente, a través de métodos de otros services.
  • Puede contener funciones auxiliares privadas (con prefijo __) que:
    • Solo se usan dentro del mismo service.
    • No requieren acceder a la base de datos.

Controllers

  • Su función es validar auth y decidir qué service/s llamar.
  • Existe un controller por cada ruta (no existe controller sin ruta asociada).
  • Siempre debe comunicarse con al menos un service.
  • Puede realizar validaciones específicas de la ruta, además de la autenticación.

Seeds

  • Su función es generar datos de prueba para el desarrollo.
  • Nunca debe utilizarse algo de una seed, dentro de un archivo que no es de seed.
  • Los datos que estén asociados a otra seed deben ser generados dinámicamente para tener coherencia

Helpers

  • Opcionales y definidos por modelo (no todos los modelos necesitan uno).
  • Son clases abstractas: no deben ser instanciadas.
  • Contienen únicamente métodos de clase.
  • Su propósito es realizar cálculos u operaciones puramente lógicas.
  • Nunca deben acceder a la base de datos ni invocar a services.

Emails

Hay muchos emails que se envían desde nuestra app. Para previsualizarlos podés correr la app e ir a localhost:5173/dev/emails.

Crear nuevo email

  • Crear un archivo en templates/emails, con extensión .email.ts que defina el contenido y opcionalmente el asunto.
  • Los textos deben estar en un archivo nuevo en i18n/emails.
  • Crear un tag para el email, en el archivo email.constants.ts. Cada email puede corresponder a una o más apps.
  • Agregá las funciones correspondientes para el testing en get-one-email-template.service-method
Last Updated:: 10/15/25, 1:39 AM
Contributors: LisandroMdcDas
Prev
Backend
Next
Error handling