Está en la página 1de 12

Explicación del código

database.js:
Importación de la librería: Se importa la librería mssql para interactuar con
SQL Server.

Configuración de la base de datos: Se definen los parámetros de configuración


para la conexión a la base de datos, como el usuario, la contraseña, el servidor
y la base de datos.

Creación del pool de conexión: Se crea un nuevo pool de conexión utilizando


la configuración proporcionada.

Función de conexión asíncrona: Se define una función asíncrona llamada


connectToDatabase que intenta conectar al pool. Si la conexión es exitosa,
imprime un mensaje de éxito; de lo contrario, maneja el error y lo lanza para
que sea manejado por el llamador.

Llamada a la función de conexión: Se llama a la función connectToDatabase


para establecer la conexión al cargar este módulo.

Exportación de objetos: Se exportan los objetos sql y pool para que puedan ser
utilizados en otros archivos de tu proyecto. Esto permite que otros módulos
accedan a la conexión y realicen consultas a la base de datos.

db.config.js:
HOST, PORT, USER, PASSWORD, DB: Estos son los parámetros básicos
para la conexión a la base de datos, que incluyen la dirección del servidor, el
puerto, el usuario, la contraseña y el nombre de la base de datos.
dialect: Especifica el tipo de base de datos que estás utilizando. En este caso,
es "mssql" para Microsoft SQL Server.

pool: Un objeto que define la configuración del pool de conexiones. Un pool


de conexiones es un conjunto de conexiones reutilizables que se pueden
compartir entre varias partes de tu aplicación. Aquí, se especifica el número
máximo y mínimo de conexiones en el pool, así como los tiempos de espera
máximo antes de que se genere un error.

Passport.js:
Configuración de la estrategia local: Se utiliza la estrategia local de Passport
para manejar la autenticación basada en un nombre de usuario y contraseña.

Búsqueda del usuario en la base de datos: Se busca el usuario en la base de


datos utilizando el modelo de usuario (User). Si el usuario no se encuentra, se
devuelve un mensaje de error.
Comparación de contraseñas: Se utiliza la función bcrypt.compare para
comparar la contraseña proporcionada con la almacenada en la base de datos.
Si las contraseñas coinciden, se inicia sesión exitosamente; de lo contrario, se
devuelve un mensaje de error.

Serialización y deserialización de usuarios: Se implementan las funciones


serializeUser y deserializeUser para almacenar y recuperar usuarios de la
sesión. La serialización se realiza utilizando el ID del usuario, y la
deserialización recupera el usuario completo a partir del ID.

loginController.js:
Inicio de sesión utilizando Passport: Se utiliza passport.authenticate para
manejar la autenticación utilizando la estrategia local de Passport.

Manejo de errores: Se verifica si hay algún error durante la autenticación. Si


hay un error, se pasa al siguiente middleware con next(err).

Validación de usuario: Se verifica si el usuario es válido. Si no es válido, se


responde con un estado 401 y un mensaje indicando que las credenciales son
inválidas.
Inicio de sesión exitoso: Si las credenciales son válidas, se utiliza req.login de
Passport para iniciar sesión con el usuario autenticado. Luego, se responde
con un mensaje JSON indicando que el inicio de sesión fue exitoso junto con
la información del usuario.

registroController.js:

Extracción de datos del cuerpo de la solicitud: Se extraen los datos necesarios


del cuerpo de la solicitud (username, password, role).

Hash de la contraseña: La contraseña se hashea utilizando la función


bcrypt.hash antes de ser almacenada en la base de datos.

Inserción del usuario en la tabla Usuarios: Se utiliza el objeto pool para


realizar una consulta SQL que inserta un nuevo usuario en la tabla Usuarios y
devuelve el ID del usuario insertado.

Obtención del ID del rol: Se realiza una consulta para obtener el ID del rol
correspondiente al nombre del rol proporcionado en la solicitud.
Asignación de rol al usuario: Se inserta una fila en la tabla UsuarioRol para
asignar el rol al usuario recién registrado.

Respuesta a la solicitud: Se responde con un estado 201 (Creado) y un


mensaje JSON indicando que el registro fue exitoso. En caso de error, se
responde con un estado 400 y un mensaje JSON indicando que hubo un error
en el registro.

Tutorial.controller.js:

Crear un tutorial (create): Se valida la solicitud, se crea un objeto tutorial y se


guarda en la base de datos.

Recuperar todos los tutoriales (findAll): Se construye una condición de


búsqueda según el título proporcionado y se recuperan los tutoriales de la base
de datos.

Encontrar un tutorial por ID (findOne): Se busca un tutorial específico por su


ID.

Actualizar un tutorial por ID (update): Se actualiza un tutorial específico por


su ID con los datos proporcionados en la solicitud.

Eliminar un tutorial por ID (delete): Se elimina un tutorial específico por su


ID.
Eliminar todos los tutoriales (deleteAll): Se eliminan todos los tutoriales de la
base de datos.

Recuperar todos los tutoriales publicados (findAllPublished): Se recuperan


todos los tutoriales que están marcados como publicados en la base de datos.

authMiddleware.js:

Verificación de la sesión: Se verifica si existe una sesión (req.session), si


contiene información de Passport (req.session.passport), y si el usuario está
autenticado (req.session.passport.user).

Permitir acceso a la ruta de cierre de sesión: Se permite el acceso a la ruta de


cierre de sesión (/api/logout) sin autenticación, ya que es común permitir que
los usuarios cierren sesión sin estar autenticados.

Acceso aceptado o denegado: Si se cumple la condición de autenticación, se


permite el acceso y se pasa al siguiente middleware. Si no se cumple la
condición y la ruta no es la de cierre de sesión, se deniega el acceso y se
responde con un estado 401 (No autorizado).
Index.js:

Configuración de Sequelize: Se crea una instancia de Sequelize utilizando la


configuración proporcionada en el archivo db.config.js.

Objeto 'db': Se crea un objeto db que almacenará las instancias de Sequelize y


los modelos.

Modelo 'tutorials': Se importa y crea el modelo tutorials utilizando la función


definida en tutorial.model.js.

Modelo 'User': Se importa el modelo User y la función syncUserModel desde


User.js. Luego, se asigna el modelo User al objeto db.

Exportación: Se exporta el objeto db para que pueda ser utilizado en otras


partes de la aplicación.
Tutorial.model.js:
module.exports = (sequelize, Sequelize) => { ... }: Esta línea exporta una
función que toma dos parámetros, sequelize y Sequelize. sequelize es la
instancia de Sequelize que se utiliza para definir el modelo, y Sequelize es la
clase Sequelize que se utiliza para definir los tipos de datos.

const Tutorial = sequelize.define("tutorial", { ... });: Aquí se define el modelo


Tutorial utilizando la instancia de Sequelize proporcionada (sequelize.define).
Este método toma dos argumentos: el nombre del modelo ("tutorial") y un
objeto que describe las propiedades de las columnas de la tabla.

Propiedades del modelo:

title: Un campo de tipo STRING para almacenar títulos.


description: Un campo de tipo STRING para almacenar descripciones.
published: Un campo de tipo BOOLEAN para almacenar el estado de
publicación (true/false).
return Tutorial;: La función devuelve el modelo Tutorial definido, lo que
permite que pueda ser utilizado en otras partes de la aplicación.

User.js:
Importar el tipo de datos (DataTypes): Se importa el objeto DataTypes de
Sequelize, que se utiliza para definir los tipos de datos de los campos en el
modelo.

Definición del modelo 'User': Se define el modelo User con las propiedades de
la tabla en la base de datos, incluyendo los campos username y password.

Opciones del modelo:

tableName: Se especifica el nombre de la tabla en la base de datos como


'Usuarios'.
timestamps: Se desactivan las columnas createdAt y updatedAt para no
mantener un registro de las fechas de creación y actualización.
Función asíncrona syncUserModel: Se define una función asíncrona para
sincronizar el modelo con la base de datos. Esta función se llama
inmediatamente después de definir el modelo y vuelve a crear la tabla en la
base de datos.

Exportación y uso de la función syncUserModel: La función syncUserModel


se llama inmediatamente después de definir el modelo para asegurarse de que
la tabla esté creada correctamente en la base de datos.

authRoutes.js:

Importaciones y configuración básica: Se importan las dependencias


necesarias, como Express y Passport. Además, se crea un objeto router de
Express para definir las rutas.
Ruta para el inicio de sesión (/login): Se define una ruta POST para el inicio
de sesión. Esta ruta utiliza Passport para autenticar al usuario con la estrategia
local (passport.authenticate('local')). Si la autenticación es exitosa, se envía
una respuesta JSON.

Ruta para el registro (/registro): Se define una ruta POST para el registro de
usuarios. Esta ruta está pendiente de implementación, y se devuelve un
mensaje indicando que la ruta está pendiente de implementación.

Ruta para cerrar sesión (/logout): Se define una ruta GET para cerrar sesión.
Puedes agregar la lógica de cierre de sesión según tus necesidades.

Tutorial.routes.js:
Importación del middleware de autenticación: Se importa el middleware
requireAuth desde el archivo authMiddleware.

Importación del controlador de tutoriales: Se importa el controlador tutorials


desde el archivo tutorial.controller.
Creación del router de Express: Se crea un objeto de enrutamiento de Express
utilizando express.Router().

Definición de rutas:

Crear un nuevo Tutorial (POST /tutorials): Se define una ruta POST para crear
un nuevo tutorial. El middleware requireAuth se utiliza para asegurar que el
usuario esté autenticado antes de crear un tutorial.

Recuperar todos los tutoriales (GET /tutorials): Se define una ruta GET para
recuperar todos los tutoriales. Se utiliza el middleware requireAuth para
asegurar que el usuario esté autenticado antes de acceder a la lista de
tutoriales.

Recuperar todos los tutoriales publicados (GET /published): Se define una ruta
GET para recuperar todos los tutoriales publicados. El middleware
requireAuth se utiliza para asegurar que el usuario esté autenticado antes de
acceder a la lista de tutoriales publicados.

Recuperar un único Tutorial con id (GET /tutorials/:id): Se define una ruta


GET para recuperar un tutorial específico por su id. El middleware
requireAuth se utiliza para asegurar que el usuario esté autenticado antes de
acceder a un tutorial específico.

Actualizar un tutorial con id (PUT /tutorials/:id): Se define una ruta PUT para
actualizar un tutorial específico por su id. El middleware requireAuth se
utiliza para asegurar que el usuario esté autenticado antes de actualizar un
tutorial.

Eliminar un tutorial con id (DELETE /tutorials/:id): Se define una ruta


DELETE para eliminar un tutorial específico por su id. El middleware
requireAuth se utiliza para asegurar que el usuario esté autenticado antes de
eliminar un tutorial.

Eliminar todos los tutoriales (DELETE /tutorials): Se define una ruta


DELETE para eliminar todos los tutoriales. El middleware requireAuth se
utiliza para asegurar que el usuario esté autenticado antes de realizar esta
acción.

Exportación del módulo de enrutamiento: Se exporta el objeto de


enrutamiento para ser utilizado en otras partes de la aplicación.

También podría gustarte