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:
- 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>**
- 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.
- Directamente, usando
- 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