From f556d5e160d9447bc4c3f851c19ad7a85432cee1 Mon Sep 17 00:00:00 2001 From: basgomcesar Date: Mon, 6 Jan 2025 14:39:42 -0600 Subject: [PATCH 1/2] CAMBIOS --- controllers/products.js | 4 -- routes/orders-doc.js | 145 ++++++++++++++++++++++++++++++++++++++++ routes/usuarios-doc.js | 134 ++++++++++++++++++++++++++++--------- 3 files changed, 247 insertions(+), 36 deletions(-) create mode 100644 routes/orders-doc.js diff --git a/controllers/products.js b/controllers/products.js index 50dcb79..16cce97 100644 --- a/controllers/products.js +++ b/controllers/products.js @@ -220,10 +220,6 @@ const add_product = async (req, res = response) => { } }; -<<<<<<< HEAD - -======= ->>>>>>> origin/main const get_order_product = async (req, res = response) => { try { const { idPedido } = req.params; diff --git a/routes/orders-doc.js b/routes/orders-doc.js new file mode 100644 index 0000000..5d16e60 --- /dev/null +++ b/routes/orders-doc.js @@ -0,0 +1,145 @@ +/** + * @swagger + * /orders/pending/seller: + * get: + * summary: Obtener órdenes pendientes por vendedor + * description: Obtiene las órdenes pendientes para un vendedor. + * parameters: + * - name: x-token + * in: header + * required: true + * description: Token de autorización para acceder a esta ruta. + * schema: + * type: string + * example: "your_token_here" + * responses: + * 200: + * description: Órdenes pendientes obtenidas correctamente. + * content: + * application/json: + * schema: + * type: array + * items: + * type: object + * properties: + * orderId: + * type: integer + * example: 123 + * sellerId: + * type: integer + * example: 1 + * status: + * type: string + * example: "pending" + * 400: + * description: Token inválido o faltante. + * 401: + * description: No autorizado, token requerido. + * 500: + * description: Error interno del servidor. + */ + +/** + * @swagger + * /orders/pending/customer: + * get: + * summary: Obtener órdenes pendientes por cliente + * description: Obtiene las órdenes pendientes para un cliente. + * parameters: + * - name: x-token + * in: header + * required: true + * description: Token de autorización para acceder a esta ruta. + * schema: + * type: string + * example: "your_token_here" + * responses: + * 200: + * description: Órdenes pendientes obtenidas correctamente. + * content: + * application/json: + * schema: + * type: array + * items: + * type: object + * properties: + * orderId: + * type: integer + * example: 456 + * customerId: + * type: integer + * example: 2 + * status: + * type: string + * example: "pending" + * 400: + * description: Token inválido o faltante. + * 401: + * description: No autorizado, token requerido. + * 500: + * description: Error interno del servidor. + */ + +/** + * @swagger + * /orders/cancelorder/{idPedido}: + * put: + * summary: Cancelar una orden + * description: Cancela una orden específica utilizando su ID. + * parameters: + * - name: idPedido + * in: path + * required: true + * description: ID de la orden a cancelar. + * schema: + * type: integer + * example: 123 + * - name: x-token + * in: header + * required: true + * description: Token de autorización para cancelar la orden. + * schema: + * type: string + * example: "your_token_here" + * responses: + * 200: + * description: Orden cancelada correctamente. + * 400: + * description: Token inválido o faltante. + * 404: + * description: Orden no encontrada. + * 500: + * description: Error interno del servidor. + */ + +/** + * @swagger + * /orders/confirmOrder/{idPedido}: + * put: + * summary: Confirmar una orden + * description: Confirma una orden específica utilizando su ID. + * parameters: + * - name: idPedido + * in: path + * required: true + * description: ID de la orden a confirmar. + * schema: + * type: integer + * example: 123 + * - name: x-token + * in: header + * required: true + * description: Token de autorización para confirmar la orden. + * schema: + * type: string + * example: "your_token_here" + * responses: + * 200: + * description: Orden confirmada correctamente. + * 400: + * description: Token inválido o faltante. + * 404: + * description: Orden no encontrada. + * 500: + * description: Error interno del servidor. + */ diff --git a/routes/usuarios-doc.js b/routes/usuarios-doc.js index 017287d..e4897fa 100644 --- a/routes/usuarios-doc.js +++ b/routes/usuarios-doc.js @@ -1,31 +1,98 @@ - /** * @swagger - * /usuarios: + * /usuarios/{idUsuario}: * get: - * summary: Obtiene la lista de usuarios + * summary: Obtener usuario por ID + * description: Obtiene la información de un usuario específico utilizando su ID. + * parameters: + * - name: idUsuario + * in: path + * required: true + * description: ID del usuario a obtener. + * schema: + * type: integer + * example: 1 * responses: * 200: - * description: Lista de usuarios + * description: Usuario encontrado. + * content: + * application/json: + * schema: + * type: object + * properties: + * idUsuario: + * type: integer + * example: 1 + * nombre: + * type: string + * example: Juan Pérez + * correo: + * type: string + * example: usuario@ejemplo.com + * disponibilidad: + * type: boolean + * example: true + * ubicacion: + * type: string + * example: CDMX + * 400: + * description: Faltan parámetros obligatorios. + * 404: + * description: Usuario no encontrado. + * 500: + * description: Error interno del servidor. */ - /** * @swagger - * /usuarios: - * post: - * summary: usuarios + * /usuarios/{idUsuario}/disponibilidad: + * put: + * summary: Cambiar disponibilidad de un usuario + * description: Actualiza el estado de disponibilidad de un usuario utilizando su ID. + * parameters: + * - name: idUsuario + * in: path + * required: true + * description: ID del usuario a actualizar. + * schema: + * type: integer + * example: 1 + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * disponibilidad: + * type: boolean + * description: Nuevo valor de disponibilidad. + * example: true * responses: * 200: - * description: Lista de usuarios + * description: Disponibilidad actualizada correctamente. + * 400: + * description: Parámetros inválidos o faltantes. + * 404: + * description: Usuario no encontrado. + * 500: + * description: Error interno del servidor. */ /** * @swagger - * /auth/login: - * post: - * summary: Iniciar sesión - * description: Verifica las credenciales del usuario en la base de datos y retorna un token JWT si son válidas. + * /usuarios/{idUsuario}: + * put: + * summary: Actualizar disponibilidad y ubicación de un usuario + * description: Permite actualizar múltiples campos (disponibilidad y/o ubicación) de un usuario. + * parameters: + * - name: idUsuario + * in: path + * required: true + * description: ID del usuario a actualizar. + * schema: + * type: integer + * example: 1 * requestBody: * required: true * content: @@ -33,22 +100,17 @@ * schema: * type: object * properties: - * correo: - * type: string - * description: Correo electrónico del usuario. - * example: usuario@ejemplo.com - * contrasenia: + * disponibilidad: + * type: boolean + * description: Nuevo valor de disponibilidad. + * example: true + * ubicacion: * type: string - * description: Contraseña del usuario. - * example: password123 + * description: Nueva ubicación del usuario. + * example: CDMX * responses: * 200: - * description: Inicio de sesión exitoso. Retorna el usuario autenticado y el token JWT en el encabezado. - * headers: - * x-token: - * schema: - * type: string - * description: Token JWT generado para la autenticación. + * description: Usuario actualizado correctamente. * content: * application/json: * schema: @@ -56,18 +118,26 @@ * properties: * idUsuario: * type: integer - * description: ID del usuario. * example: 1 * nombre: * type: string - * description: Nombre del usuario. * example: Juan Pérez * correo: * type: string - * description: Correo electrónico del usuario. * example: usuario@ejemplo.com - * 401: - * description: Credenciales inválidas. El correo o la contraseña no son correctos. + * disponibilidad: + * type: boolean + * example: true + * ubicacion: + * type: string + * example: CDMX + * mensaje: + * type: string + * example: Usuario actualizado correctamente. + * 400: + * description: No se proporcionaron campos para actualizar. + * 404: + * description: Usuario no encontrado. * 500: - * description: Error interno en el servidor. + * description: Error interno del servidor. */ From 892d08287741787aebead921b1ff8aa067ca1c83 Mon Sep 17 00:00:00 2001 From: basgomcesar Date: Fri, 10 Jan 2025 00:25:34 -0600 Subject: [PATCH 2/2] Correction swagger and graph --- controllers/productos.js | 111 ----------------------- controllers/products.js | 40 ++------- controllers/usuarios.js | 131 ---------------------------- routes/productos.js | 22 ----- routes/products.js | 2 +- routes/users-doc.js | 0 routes/usuarios.js | 17 ---- server.js | 1 - swagger/auth-doc.js | 86 ++++++++++++++++++ {routes => swagger}/orders-doc.js | 15 ++++ swagger/swagger.js | 19 ++-- {routes => swagger}/usuarios-doc.js | 21 +++++ 12 files changed, 142 insertions(+), 323 deletions(-) delete mode 100644 controllers/productos.js delete mode 100644 controllers/usuarios.js delete mode 100644 routes/productos.js delete mode 100644 routes/users-doc.js delete mode 100644 routes/usuarios.js create mode 100644 swagger/auth-doc.js rename {routes => swagger}/orders-doc.js (94%) rename {routes => swagger}/usuarios-doc.js (96%) diff --git a/controllers/productos.js b/controllers/productos.js deleted file mode 100644 index d64fe67..0000000 --- a/controllers/productos.js +++ /dev/null @@ -1,111 +0,0 @@ -const { response } = require("express"); -const connection = require("../models/database"); - -/** - * Obtiene todos los productos asociados al usuario autenticado - * @param {*} req - * @param {*} res - */ -const get_productos_by_usuario = async (req, res = response) => { - try { - const idUsuario = req.uid; // ID del usuario autenticado extraído del token - - const [productos] = await connection.execute( - "SELECT * FROM productos WHERE idUsuario = ?", - [idUsuario] - ); - - if (productos.length === 0) { - return res.status(404).json({ - mensaje: "No se encontraron productos para este usuario", - }); - } - - res.status(200).json({ - mensaje: "Productos obtenidos correctamente", - productos, - }); - } catch (error) { - console.error("Error al obtener productos del usuario: ", error); - res.status(500).json({ mensaje: "Error interno del servidor" }); - } -}; - - - -/** - * Registra un usuario en base de datos - * @param {*} req - * @param {*} res - */ -const add_product = async (req, res = response) => { - try { - const { nombre, descripcion, precio, cantidadDisponible, disponible, categoria } = req.body; - - // Convertir disponible a un entero (1 o 0) - const disponibleInt = disponible === 'true' ? 1 : 0; - - // Validar que se haya subido un archivo de foto - if (!req.file) { - return res.status(400).json({ - success: false, - message: "Se requiere una foto del producto", - }); - } - const foto = req.file.buffer; - - // Validar el campo precio - const precioRegex = /^\d+(\.\d{1,2})?$/; // Número con hasta 2 decimales - if (!precioRegex.test(precio)) { - return res.status(422).json({ - success: false, - errorCode: "INVALID_PRICE_FORMAT", - message: "El precio debe ser un número válido con hasta dos decimales", - }); - } - - // Verificar si el producto ya está registrado para este usuario - const [existingProduct] = await connection.execute( - "SELECT * FROM productos WHERE nombre = ? AND idUsuario = ?", - [nombre, req.uid] - ); - - if (existingProduct.length > 0) { - return res.status(409).json({ - success: false, - message: "Ya tienes un producto con este nombre registrado", - }); - } - - console.log('Categoria: ' + categoria); - // Guardar el nuevo producto - const [resultado] = await connection.execute( - "INSERT INTO productos (nombre, descripcion, precio, cantidadDisponible, disponible, foto, categoria, idUsuario) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", - [nombre, descripcion, precio, cantidadDisponible, disponibleInt, foto, categoria, req.uid] - ); - - if (resultado.affectedRows > 0) { - return res.status(201).json({ - success: true, - message: "Producto creado con éxito", - }); - } else { - return res.status(500).json({ - success: false, - message: "No se pudo crear el producto", - }); - } - } catch (error) { - console.error("Error al guardar producto: ", error.message || error); - res.status(500).json({ - success: false, - message: "Error al guardar el producto, faltan datos o son incorrectos", - }); - } -}; - -module.exports = { - get_productos_by_usuario, - - add_product, -}; diff --git a/controllers/products.js b/controllers/products.js index 9562c90..28fb4fd 100644 --- a/controllers/products.js +++ b/controllers/products.js @@ -23,10 +23,10 @@ const get_statistics_products = async (req, res = response) => { return res.status(401).json({ mensaje: `Token inválido o expirado: ${error.message}` }); } - const { idSeller, year, month } = req.params; - console.log(`Parámetros recibidos - idSeller: ${idSeller}, year: ${year}, month: ${month}`); + const { year, month } = req.params; + console.log(`Parámetros recibidos - idSeller: ${uid}, year: ${year}, month: ${month}`); - if (!idSeller || !year || !month) { + if (!uid || !year || !month) { console.log("Faltan parámetros requeridos."); return res.status(400).json({ mensaje: "Faltan parámetros requeridos: idSeller, year, month" }); } @@ -41,37 +41,21 @@ const get_statistics_products = async (req, res = response) => { `SELECT p.nombre AS producto, COUNT(ped.idPedido) AS cantidad_vendida -<<<<<<< HEAD - FROM productos p - LEFT JOIN pedidos ped - ON p.idProducto = ped.idProducto - LEFT JOIN estadoPedido ep - ON ped.idEstadoPedido = ep.idEstadoPedido - WHERE - p.idVendedor = ? - AND ep.estadoPedido = 'entregado' - AND MONTH(ped.fechaPedido) = ? - AND YEAR(ped.fechaPedido) = ? - GROUP BY p.idProducto - ORDER BY cantidad_vendida DESC - LIMIT 10;`, - [idSeller, month, year] - ); -======= FROM productos p LEFT JOIN pedidos ped ON p.idProducto = ped.idProducto + LEFT JOIN estadopedido ep + ON ped.idEstadoPedido = ep.idEstadoPedido WHERE - p.idUsuario = ? - AND ped.estado = 'entregado' + p.idVendedor = ? + AND ep.estadoPedido = 'entregado' AND MONTH(ped.fechaPedido) = ? AND YEAR(ped.fechaPedido) = ? GROUP BY p.idProducto ORDER BY cantidad_vendida DESC LIMIT 10;`, - [idSeller, month, year] + [uid, month, year] ); ->>>>>>> ae337fffd9fa6b332b3651f8e66834f81a7616e2 console.log(`Consulta ejecutada. Productos encontrados: ${productos.length}`); @@ -80,16 +64,8 @@ const get_statistics_products = async (req, res = response) => { return res.status(404).json({ mensaje: "No se encontraron productos vendidos para este vendedor en el mes y año especificados." }); } -<<<<<<< HEAD - console.log('Productos encontrados:', productos); // Imprime los productos encontrados antes de enviar la respuesta - - console.log('Productos encontrados, enviando respuesta'); - return res.status(200).json({ productos }); - -======= console.log("Productos encontrados, enviando respuesta."); res.status(200).json({ productos }); ->>>>>>> ae337fffd9fa6b332b3651f8e66834f81a7616e2 } catch (error) { console.error("Error al obtener las estadísticas de productos:", error); res.status(500).json({ mensaje: "Error interno del servidor al obtener las estadísticas de productos." }); diff --git a/controllers/usuarios.js b/controllers/usuarios.js deleted file mode 100644 index 16161e3..0000000 --- a/controllers/usuarios.js +++ /dev/null @@ -1,131 +0,0 @@ -const multer = require("multer"); -const { response } = require("express"); -const connection = require("../models/database"); -const bcrypt = require("bcryptjs"); -const upload = multer({ storage: multer.memoryStorage() }); -const { SECRET_KEY } = require('../helpers/config'); -const jwt = require('jsonwebtoken'); - - - -const get_usuario_by_id_params = async (req, res = response) => { - try { - const { idUsuario } = req.params; // Cambiado a obtener idUsuario de los parámetros de la ruta - if (!idUsuario) { - return res.status(400).json({ mensaje: "Requiere de un ID" }); - } - - const [usuario] = await connection.execute( - "SELECT * FROM usuarios WHERE idUsuario = ?", - [idUsuario] - ); - - if (usuario.length === 0) { - return res - .status(404) - .json({ mensaje: "ID de Usuario no fue localizado" }); - } - res.json(usuario[0]); - } catch (error) { - console.error("Error al buscar usuario por ID: ", error); - res.status(500).json({ mensaje: "Error interno del servidor" }); - } -}; - - - - -const change_disponibility = async (req, res = response) => { - try { - const { idUsuario } = req.params; - const { disponibilidad } = req.body; - - if (disponibilidad === undefined) { - return res - .status(400) - .json({ mensaje: "Se requiere el valor de disponibilidad" }); - } - - const [resultado] = await connection.execute( - "UPDATE usuarios SET disponibilidad = ? WHERE idUsuario = ?", - [disponibilidad, idUsuario] - ); - - if (resultado.affectedRows === 0) { - return res.status(404).json({ mensaje: "Usuario no encontrado" }); - } - - res - .status(200) - .json({ mensaje: "Disponibilidad actualizada correctamente" }); - } catch (error) { - console.error("Error al cambiar disponibilidad: ", error); - res.status(500).json({ mensaje: "Error interno del servidor" }); - } -}; - -const update_availability = async (req, res = response) => { - - try { - const { idUsuario } = req.params; - const { disponibilidad, ubicacion } = req.body; - - console.log(req.body); - - if (disponibilidad === undefined && ubicacion === undefined) { - return res - .status(400) - .json({ error: "Se debe proporcionar al menos un campo para actualizar" }); - } - - const updates = []; - const values = []; - - if (disponibilidad !== undefined) { - const disponibilidadBool = disponibilidad === 'true' || disponibilidad === true; // Asegura que el valor sea booleano - updates.push("disponibilidad = ?"); - values.push(disponibilidadBool); - } - - if (ubicacion !== undefined) { - updates.push("ubicacion = ?"); - values.push(ubicacion); - } - - values.push(idUsuario); - - const [resultado] = await connection.execute( - `UPDATE usuarios SET ${updates.join(", ")} WHERE idUsuario = ?`, - values - ); - - if (resultado.affectedRows === 0) { - return res.status(404).json({ mensaje: "Usuario no encontrado" }); - } - - const [usuarioActualizado] = await connection.execute( - "SELECT idUsuario, nombre, correo, contrasenia, tipo, disponibilidad, ubicacion FROM usuarios WHERE idUsuario = ?", - [idUsuario] - ); - - res.status(200).json({ - idUsuario: usuarioActualizado[0].idUsuario, - nombre: usuarioActualizado[0].nombre, - correo: usuarioActualizado[0].correo, - contrasenia: usuarioActualizado[0].contrasenia, - tipo: usuarioActualizado[0].tipo, - disponibilidad: usuarioActualizado[0].disponibilidad, - ubicacion: usuarioActualizado[0].ubicacion, - mensaje: "Usuario actualizado correctamente", - }); - } catch (error) { - console.error("Error al actualizar usuario: ", error); - res.status(500).json({ mensaje: "Error interno del servidor" }); - } -}; - -module.exports = { - get_usuario_by_id_params, - change_disponibility, - update_availability -}; \ No newline at end of file diff --git a/routes/productos.js b/routes/productos.js deleted file mode 100644 index 04852cc..0000000 --- a/routes/productos.js +++ /dev/null @@ -1,22 +0,0 @@ -const { Router } = require("express"); -const { - update_producto, - delete_producto, - get_productos_by_usuario, - add_product -} = require("../controllers/productos"); -const { validarJWT } = require("../helpers/validar-jwt"); -const multer = require('multer'); -const upload = multer({ storage: multer.memoryStorage() }); - - -const router = Router(); - -// Ruta para obtener productos del usuario autenticado -router.get("/usuario", validarJWT, get_productos_by_usuario); - - - -router.post("/", upload.single('foto'), validarJWT, add_product); - -module.exports = router; diff --git a/routes/products.js b/routes/products.js index 30e9de1..cc6345a 100644 --- a/routes/products.js +++ b/routes/products.js @@ -13,7 +13,7 @@ const {validarJWT} = require('../helpers/validar-jwt'); const router = Router(); -router.get('/statistics/:idSeller/:year/:month', validarJWT, get_statistics_products); +router.get('/statistics/:year/:month', validarJWT, get_statistics_products); router.get('/offered/:idSeller', validarJWT, get_products_offered); router.post("/", upload.single('foto'), validarJWT, add_product); router.get("/orderproducts/:idPedido", validarJWT, get_order_product); diff --git a/routes/users-doc.js b/routes/users-doc.js deleted file mode 100644 index e69de29..0000000 diff --git a/routes/usuarios.js b/routes/usuarios.js deleted file mode 100644 index 59cc0cd..0000000 --- a/routes/usuarios.js +++ /dev/null @@ -1,17 +0,0 @@ -const { Router } = require('express'); -const multer = require('multer'); -const { get_usuario_by_id_params, update_availability} = require('../controllers/usuarios'); - -const { validarJWT } = require('../helpers/validar-jwt'); - - -const upload = multer({ storage: multer.memoryStorage() }); - -const router = Router(); - -// Rutas -router.get('/:idUsuario', validarJWT, get_usuario_by_id_params); -router.put('/availability/:idUsuario', validarJWT, update_availability); - -module.exports = router; - diff --git a/server.js b/server.js index c288010..7031333 100644 --- a/server.js +++ b/server.js @@ -32,7 +32,6 @@ app.use(cors(corsOptions)); app.use(express.json({ limit: '50mb' })); app.use(cookieParser()); -app.use('/usuarios', require('./routes/usuarios')); app.use('/auth', require('./routes/auth')); app.use('/products', require('./routes/products')); app.use('/utils', require('./routes/utils')); diff --git a/swagger/auth-doc.js b/swagger/auth-doc.js new file mode 100644 index 0000000..0d5d6ab --- /dev/null +++ b/swagger/auth-doc.js @@ -0,0 +1,86 @@ +/** + * @swagger + * tags: + * - name: Autenticación + * description: Endpoints para autenticación de usuarios + */ + +/** + * @swagger + * /auth/login: + * post: + * summary: Iniciar sesión con correo y contraseña + * description: Permite a los usuarios iniciar sesión proporcionando su correo y contraseña. + * operationId: login + * tags: + * - Autenticación + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * correo: + * type: string + * format: email + * description: Correo electrónico del usuario. + * example: usuario@ejemplo.com + * contrasenia: + * type: string + * format: password + * description: Contraseña del usuario. + * example: mySecretPassword123 + * responses: + * 200: + * description: Usuario autenticado exitosamente. + * content: + * application/json: + * schema: + * type: object + * properties: + * idTipoUsuario: + * type: integer + * description: ID del tipo de usuario. + * example: 1 + * idUsuario: + * type: integer + * description: ID del usuario. + * example: 1 + * nombre: + * type: string + * description: Nombre del usuario. + * example: Juan Pérez + * correo: + * type: string + * description: Correo electrónico del usuario. + * example: usuario@ejemplo.com + * contrasenia: + * type: string + * description: Contraseña del usuario. + * example: mySecretPassword123 + * foto: + * type: string + * description: Foto de perfil del usuario en formato base64. + * example: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQ..." + * disponibilidad: + * type: integer + * description: Estado de disponibilidad del usuario. + * example: 1 + * ubicacion: + * type: string + * description: Ubicación del usuario. + * example: En frente de la tienda + * headers: + * x-token: + * description: Token JWT generado para la sesión del usuario. + * schema: + * type: string + * example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + * 400: + * description: Petición incorrecta, faltan parámetros obligatorios. + * 401: + * description: Credenciales inválidas (correo o contraseña incorrectos). + * 500: + * description: Error interno del servidor. + */ diff --git a/routes/orders-doc.js b/swagger/orders-doc.js similarity index 94% rename from routes/orders-doc.js rename to swagger/orders-doc.js index 5d16e60..b4a1229 100644 --- a/routes/orders-doc.js +++ b/swagger/orders-doc.js @@ -1,7 +1,16 @@ +/** + * @swagger + * tags: + * - name: Órdenes + * description: Operaciones relacionadas con órdenes + */ + /** * @swagger * /orders/pending/seller: * get: + * tags: + * - Órdenes * summary: Obtener órdenes pendientes por vendedor * description: Obtiene las órdenes pendientes para un vendedor. * parameters: @@ -43,6 +52,8 @@ * @swagger * /orders/pending/customer: * get: + * tags: + * - Órdenes * summary: Obtener órdenes pendientes por cliente * description: Obtiene las órdenes pendientes para un cliente. * parameters: @@ -84,6 +95,8 @@ * @swagger * /orders/cancelorder/{idPedido}: * put: + * tags: + * - Órdenes * summary: Cancelar una orden * description: Cancela una orden específica utilizando su ID. * parameters: @@ -116,6 +129,8 @@ * @swagger * /orders/confirmOrder/{idPedido}: * put: +* tags: + * - Órdenes * summary: Confirmar una orden * description: Confirma una orden específica utilizando su ID. * parameters: diff --git a/swagger/swagger.js b/swagger/swagger.js index 9bb776a..07afc01 100644 --- a/swagger/swagger.js +++ b/swagger/swagger.js @@ -1,22 +1,25 @@ -const swaggerJsdoc = require('swagger-jsdoc'); -const swaggerUi = require('swagger-ui-express'); +const swaggerJsdoc = require("swagger-jsdoc"); +const swaggerUi = require("swagger-ui-express"); +const path = require('path'); // Configuración de Swagger const swaggerOptions = { swaggerDefinition: { - openapi: '3.0.0', + openapi: "3.0.0", info: { - title: 'Documentación de API', - version: '1.0.0', - description: 'Documentación generada automáticamente con Swagger', + title: "Documentación de API", + version: "1.0.0", + description: "Documentación generada automáticamente con Swagger", }, servers: [ { - url: 'http://localhost:3000', // Cambia a tu URL base + url: "http://localhost:3000", // Cambia a tu URL base }, ], }, - apis: ['./routes/*.js', './routes/users-doc.js'], // Aquí se definen los archivos que contienen las rutas + apis: [ + path.join(__dirname, "*.js"), + ], // Aquí se definen los archivos que contienen las rutas }; // Generar la documentación de Swagger diff --git a/routes/usuarios-doc.js b/swagger/usuarios-doc.js similarity index 96% rename from routes/usuarios-doc.js rename to swagger/usuarios-doc.js index 55cf280..c02310a 100644 --- a/routes/usuarios-doc.js +++ b/swagger/usuarios-doc.js @@ -1,7 +1,18 @@ +/** + * @swagger + * tags: + * - name: Usuarios + * description: Operaciones relacionadas con usuarios + */ + + + /** * @swagger * /usuarios/{idUsuario}: * get: + * tags: + * - Usuarios * summary: Obtener usuario por ID * description: Obtiene la información de un usuario específico utilizando su ID. * parameters: @@ -47,6 +58,8 @@ * @swagger * /usuarios/{idUsuario}/disponibilidad: * put: + * tags: + * - Usuarios * summary: Cambiar disponibilidad de un usuario * description: Actualiza el estado de disponibilidad de un usuario utilizando su ID. * parameters: @@ -83,6 +96,8 @@ * @swagger * /usuarios/{idUsuario}: * put: + * tags: + * - Usuarios * summary: Actualizar disponibilidad y ubicación de un usuario * description: Permite actualizar múltiples campos (disponibilidad y/o ubicación) de un usuario. * parameters: @@ -148,6 +163,8 @@ * @swagger * /users/save: * post: + * tags: + * - Usuarios * summary: Crear un nuevo usuario * description: Crea un nuevo usuario con los datos proporcionados en el cuerpo de la petición. Es obligatorio enviar una foto del usuario. * requestBody: @@ -207,6 +224,8 @@ * @swagger * /usuarios: * put: + * tags: + * - Usuarios * summary: Actualizar un usuario * description: Actualiza los detalles de un usuario existente. Los campos opcionales se pueden omitir, pero si se envía una foto, debe ser en formato binario. El ID del usuario se obtiene a partir del token JWT. * security: @@ -258,6 +277,8 @@ * @swagger * /usuarios: * delete: + * tags: + * - Usuarios * summary: Eliminar un usuario * description: Elimina un usuario existente. El ID del usuario se obtiene a partir del token JWT enviado en el encabezado de la solicitud. * security: