Appearance
Archivos de la Carpeta config
La carpeta src/config centraliza todas las configuraciones fundamentales de la aplicación, permitiendo una gestión organizada de los ajustes específicos para diferentes entornos (desarrollo, producción, etc.). Estos archivos son cruciales para la inicialización y el comportamiento de la aplicación, asegurando que componentes como la base de datos, la documentación de la API y las integraciones con servicios externos se configuren correctamente y de forma segura.
sequelize.ts
Este archivo contiene la configuración y las instancias de conexión para Sequelize, el ORM (Object-Relational Mapper) utilizado para interactuar con las bases de datos relacionales.
- Descripción: Define cómo la aplicación se conecta a las bases de datos de
usuariosyestudiantesutilizando PostgreSQL. Configura el dialecto, los modelos asociados a cada instancia y la gestión de logs. - Propósito: Establecer las conexiones a las bases de datos de forma segura y modular, permitiendo a la aplicación interactuar con ellas para realizar operaciones de persistencia de datos.
- Funcionalidad:
createSequelizeInstance: Función auxiliar que crea una instancia de Sequelize, validando la presencia de la cadena de conexión en las variables de entorno.sequelizeUser: Instancia de Sequelize dedicada a la base de datos de usuarios, cargando el modeloUser.sequelizeStudent: Instancia de Sequelize dedicada a la base de datos de estudiantes, cargando el modeloStudent.- Gestión de variables de entorno: Asegura que las credenciales de conexión se obtengan de
p, lo cual es fundamental para la seguridad en producción.rocess.env
- Rol en la aplicación: Es el pilar de la persistencia de datos, ya que sin una conexión adecuada a la base de datos, la aplicación no podría almacenar ni recuperar información crucial de usuarios y estudiantes. Su diseño permite escalar fácilmente a múltiples bases de datos si es necesario.
ts
import { Sequelize } from "sequelize-typescript";
import { User } from "../models/user.model";
import { Student } from "../models/student.model";
// Función auxiliar para crear instancias de Sequelize
const createSequelizeInstance = (
connectionString: string,
models: any[],
name: string
): Sequelize => {
if (!connectionString) {
throw new Error(`❌ Environment variable for ${name} database not found.`);
}
return new Sequelize(connectionString, {
dialect: "postgres",
models,
logging: false, // Cambia a true si quieres ver logs SQL
});
};
// Instancia para base de datos de usuarios
export const sequelizeUser = createSequelizeInstance(
process.env.CONNECT_DG_USERS!,
[User],
"User"
);
// Instancia para base de datos de estudiantes
export const sequelizeStudent = createSequelizeInstance(
process.env.CONNECT_DG_STUDENTS!,
[Student],
"Student"
);
swagger.ts
Este archivo configura Swagger/OpenAPI para la documentación y prueba de las APIs REST de la aplicación.
- Descripción: Define los metadatos de la API (título, versión, descripción) y las rutas donde se encuentran las definiciones de los endpoints (
swagger.yml). - Propósito: Generar una especificación OpenAPI que permita documentar de forma interactiva la API, facilitando su comprensión y uso tanto para desarrolladores internos como para posibles consumidores externos.
- Funcionalidad:
swaggerJsDoc: Utiliza esta librería para parsear las definiciones de la API y generar el objeto de especificación OpenAPI.- Opciones de configuración: Incluye la versión de OpenAPI y la información básica de la API.
Rutas de APIs: Indica dónde buscar los archivos de definición de la API (en este caso,swagger.yml).
- Rol en la aplicación: Es una herramienta esencial para el ciclo de desarrollo y colaboración, ya que proporciona una interfaz visual para explorar y probar los endpoints de la API. Sin embargo, su exposición en producción debe ser cuidadosamente gestionada por razones de seguridad.
ts
import swaggerJsDoc from "swagger-jsdoc";
// Opciones de configuración de Swagger
const options: swaggerJsDoc.Options = {
definition: {
openapi: "3.0.0", // Especificación de OpenAPI
info: {
title: "API REST Alumnos EDC",
version: "1.0.0",
description: "Documentación API",
},
},
apis: ["swagger.yml"], // Rutas de los archivos con la documentación de Swagger
};
// Generar la documentación de Swagger
const openapiSpecification = swaggerJsDoc(options);
export default openapiSpecification;
google.drive.ts
Este archivo es el módulo principal de configuración y autenticación para interactuar con los servicios de Google Drive en la aplicación.
- Descripción: Contiene la lógica para cargar de forma segura las credenciales de la cuenta de servicio de Google desde variables de entorno, construir el objeto de autenticación y proporcionar una instancia lista para usar del servicio de Google Drive API (v3).
- Propósito: Centralizar y gestionar de manera segura la conexión y autenticación con Google Drive, permitiendo que otros servicios de la aplicación puedan interactuar con la API de Drive sin preocuparse por los detalles de las credenciales.
- Funcionalidad:
REQUIRED_ENV_KEYS: Lista las variables de entorno esenciales para las credenciales, asegurando que todas estén presentes.getCredentialsFromEnv: Extrae y valida las credenciales de la cuenta de servicio de Google directamente dep.rocess.env getGoogleDriveAuthClient: Inicializa un cliente de autenticación de Google con los scopes necesarios para interactuar con Drive.getGoogleDriveService: Retorna una instancia autenticada de la API de Google Drive (v3), lista para ser utilizada.
- Rol en la aplicación: Es el punto de entrada para cualquier operación que involucre Google Drive, como la subida, descarga o gestión de archivos. Su diseño es robusto para producción, ya que prioriza la seguridad al manejar las credenciales a través de variables de entorno, evitando que secretos sensibles se almacenen en el código fuente.
ts
import { GoogleAuth } from "google-auth-library";
import { drive_v3, google } from "googleapis";
import { GoogleServiceAccountCredentials } from "../interfaces/google.service.account.credentials";
/**
* Lista de claves necesarias para la autenticación con Google.
*/
const REQUIRED_ENV_KEYS: Array<keyof GoogleServiceAccountCredentials> = [
"type",
"project_id",
"private_key_id",
"private_key",
"client_email",
"client_id",
"auth_uri",
"token_uri",
"auth_provider_x509_cert_url",
"client_x509_cert_url",
"universe_domain",
];
/**
* Carga y valida las credenciales desde las variables de entorno.
*/
const getCredentialsFromEnv = (): GoogleServiceAccountCredentials => {
const rawCredentials = {
type: process.env.GOOGLE_TYPE,
project_id: process.env.GOOGLE_PROJECT_ID,
private_key_id: process.env.GOOGLE_PRIVATE_KEY_ID,
private_key: process.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, "\n"),
client_email: process.env.GOOGLE_CLIENT_EMAIL,
client_id: process.env.GOOGLE_CLIENT_ID,
auth_uri: process.env.GOOGLE_AUTH_URI,
token_uri: process.env.GOOGLE_TOKEN_URI,
auth_provider_x509_cert_url: process.env.GOOGLE_AUTH_PROVIDER_X509_CERT_URL,
client_x509_cert_url: process.env.GOOGLE_CLIENT_X509_CERT_URL,
universe_domain: process.env.GOOGLE_UNIVERSE_DOMAIN,
};
for (const key of REQUIRED_ENV_KEYS) {
if (!rawCredentials[key]) {
throw new Error(`Falta la variable de entorno: ${key.toUpperCase()}`);
}
}
return rawCredentials as GoogleServiceAccountCredentials;
};
/**
* Inicializa y devuelve un cliente autenticado para Google Drive.
*/
export const getGoogleDriveAuthClient = async (): Promise<GoogleAuth> => {
try {
const credentials = getCredentialsFromEnv();
return new GoogleAuth({
credentials,
scopes: ["https://www.googleapis.com/auth/drive"],
});
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
console.error("Error al crear cliente de autenticación:", message);
throw new Error(`Google Drive Auth Error: ${message}`);
}
};
/**
* Retorna una instancia de la API de Google Drive.
*/
export const getGoogleDriveService = async (): Promise<drive_v3.Drive> => {
const auth = await getGoogleDriveAuthClient();
return google.drive({ version: "v3", auth });
};