Skip to content

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 usuarios y estudiantes utilizando 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 modelo User.
    • sequelizeStudent: Instancia de Sequelize dedicada a la base de datos de estudiantes, cargando el modelo Student.
    • Gestión de variables de entorno: Asegura que las credenciales de conexión se obtengan de process.env, lo cual es fundamental para la seguridad en producción.
  • 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 de process.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 });
};