diff --git a/poblate/.gitignore b/poblate/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..25c8fdbaba62c31aacfa2307975b06fbfd017485 --- /dev/null +++ b/poblate/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json \ No newline at end of file diff --git a/poblate/delete.sh b/poblate/delete.sh new file mode 100755 index 0000000000000000000000000000000000000000..0f21df56322ed8734079fee9edfd7d0611af21d9 --- /dev/null +++ b/poblate/delete.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Configuración de la conexión a MySQL +MYSQL_USER="user" # Usuario de MySQL +MYSQL_PASSWORD="password" # Contraseña del usuario +MYSQL_HOST="localhost" # Dirección del servidor MySQL +MYSQL_PORT="3306" # Puerto de MySQL (3306 por defecto) + +# Nombres de las bases de datos a eliminar +DATABASES=("Users" "Hotels" "Bookings") + +# Confirmación antes de eliminar +echo "Las siguientes bases de datos serán eliminadas: ${DATABASES[*]}" +read -p "¿Estás seguro de que deseas continuar? (escribe 'yes' para confirmar): " CONFIRMATION + +if [ "$CONFIRMATION" != "yes" ]; then + echo "Cancelado. Las bases de datos no se eliminarán." + exit 1 +fi + +# Eliminar cada base de datos +for DB in "${DATABASES[@]}"; do + echo "Eliminando base de datos: $DB" + mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -h"$MYSQL_HOST" -P"$MYSQL_PORT" -e "DROP DATABASE IF EXISTS $DB;" + if [ $? -eq 0 ]; then + echo "Base de datos $DB eliminada correctamente." + else + echo "Error al eliminar la base de datos $DB." + fi +done + +echo "Proceso completado." diff --git a/poblate/environments/env.js b/poblate/environments/env.js new file mode 100644 index 0000000000000000000000000000000000000000..12886285084a8dee9b92a40b89d3c2c3855f1b40 --- /dev/null +++ b/poblate/environments/env.js @@ -0,0 +1,6 @@ +export const env = { + authApi: "http://localhost:8101/", + userApi: "http://localhost:8201/users", + hotelsApi: "http://localhost:8301/hotels", + bookingsApi: "http://localhost:8401/bookings", +}; diff --git a/poblate/environments/env.prod.js b/poblate/environments/env.prod.js new file mode 100644 index 0000000000000000000000000000000000000000..12886285084a8dee9b92a40b89d3c2c3855f1b40 --- /dev/null +++ b/poblate/environments/env.prod.js @@ -0,0 +1,6 @@ +export const env = { + authApi: "http://localhost:8101/", + userApi: "http://localhost:8201/users", + hotelsApi: "http://localhost:8301/hotels", + bookingsApi: "http://localhost:8401/bookings", +}; diff --git a/poblate/index.js b/poblate/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8fa2252a7eafbee3b1c0f19e3a49d6957cee6563 --- /dev/null +++ b/poblate/index.js @@ -0,0 +1,140 @@ +const mockedUsers = require("./mocks/users.json"); +const mockedHotels = require("./mocks/hotels.json"); +const mockedBookings = require("./mocks/bookings.json"); +const axios = require("axios"); +const { jwtDecode } = require("jwt-decode"); + +// Modo +const args = process.argv; +const isProduction = args.includes("--prod"); + +const authUrl = "http://localhost:8101/auth"; +const hotelsUrl = "http://localhost:8301/hotels"; +const bookingUrl = "http://localhost:8401/bookings"; + +const loj = (data) => { + console.log(JSON.stringify(data, null, 2)); +}; + +// Función para calcular fechas pareadas +function genDates(ref = new Date()) { + // before + const beforeStart = new Date(ref); + beforeStart.setDate(ref.getDate() - 14); // Restar 2 semanas + + const beforeEnd = new Date(beforeStart); + beforeEnd.setDate(beforeStart.getDate() + 3); + + // After + const afterStart = new Date(ref); + afterStart.setDate(ref.getDate() + 14); // Restar 2 semanas + + const afterEnd = new Date(afterStart); + afterEnd.setDate(afterStart.getDate() + 2); + + return [ + { + start: beforeStart, + end: beforeEnd, + }, + { + start: afterStart, + end: afterEnd, + }, + ]; +} + +function getRandomItem(a = []) { + return a[Math.floor(Math.random() * a.length)]; +} + +const savePost = async (data, first, second = "") => { + try { + try { + return await axios.post(first, data); + } catch (error) { + console.error("ERROR 1"); + return await axios.post(second, data); + } + } catch (error) { + console.error("ERROR 2"); + process.exit(-1); + } +}; + +async function register(user) { + const { data } = await savePost( + user, + `${authUrl}/register`, + `${authUrl}/login` + ); + const decoded = jwtDecode(data.token); + user.id = decoded.id; + return user; +} + +const addUsers = async () => { + const users = []; + for await (const user of mockedUsers) { + users.push(await register(user)); + } + + const admins = users.filter((u) => u.rol === "ADMIN"); + const managers = users.filter((u) => u.rol === "HOTEL_ADMIN"); + const clients = users.filter((u) => u.rol === "CLIENT"); + + return { admins, managers, clients }; +}; + +const insertHotel = async ({ manager, hotel }) => { + const { data } = await axios.post(hotelsUrl, { + ...hotel, + managerId: manager.id, + }); + return data; +}; + +async function addHotels(managers) { + const hotels = []; + for await (const hotel of mockedHotels) { + const select = getRandomItem(managers); + hotels.push(await insertHotel({ hotel, manager: select })); + } + return hotels; +} + +const insertBookings = async (booking) => { + console.log({ booking }); + const { data } = await axios.post(bookingUrl, booking); + return data; +}; + +async function addBookings(clients, hotels) { + var i = 0; + const t = hotels.length; + for await (const hotel of hotels) { + const roomId = getRandomItem(hotel.rooms.filter((r) => r.available)).id; + const userId = getRandomItem(clients).id; + const des = (i - t / 2) * 15; + const date = new Date(); + date.setDate(date.getDate() + des); + for await (const dates of genDates(date)) { + await insertBookings({ + managerId: hotel.managerId, + userId, + hotelId: hotel.id, + roomId, + ...dates, + }); + } + } +} + +async function init() { + const { managers, clients } = await addUsers(); + const hotels = await addHotels(managers, 3); + await addBookings(clients, hotels); +} + +console.log("MODE:", isProduction ? "PRODUCTION" : "DEVELOPMENT"); +init(); diff --git a/poblate/mocks/bookings.json b/poblate/mocks/bookings.json index bf93e638b17471bc9585c37e0689f6808da03285..6c4fe5f2479c64f796313c967930b81bc5b52e9f 100644 --- a/poblate/mocks/bookings.json +++ b/poblate/mocks/bookings.json @@ -3,6 +3,7 @@ "clientId": 1, "hotelId": 1, "roomId": 2, + "managerId": 3, "startDate": "2024-10-20", "endDate": "2024-10-25" }, @@ -10,6 +11,7 @@ "clientId": 3, "hotelId": 2, "roomId": 3, + "managerId": 4, "startDate": "2025-02-22", "endDate": "2025-02-27" } diff --git a/poblate/mocks/hotels.json b/poblate/mocks/hotels.json index 4331cfea0d6964414b2b702b1cfafeb90a133821..34b23c1bcedd7fb513cd605ecfa3cf64e4ea0256 100644 --- a/poblate/mocks/hotels.json +++ b/poblate/mocks/hotels.json @@ -42,6 +42,16 @@ "roomNumber": "202", "type": "SUITE", "available": true + }, + { + "roomNumber": "203", + "type": "SUITE", + "available": true + }, + { + "roomNumber": "204", + "type": "SUITE", + "available": false } ] } diff --git a/poblate/mocks/users.json b/poblate/mocks/users.json index 72cd088b876a8b8d5a4adc4e588f01bdf61c3995..a23fb88035299cf8d82707929a91c7fc6e1bfc7d 100644 --- a/poblate/mocks/users.json +++ b/poblate/mocks/users.json @@ -1,20 +1,20 @@ [ { - "name": "John Doe", - "email": "john.doe@example.com", - "password": "securePassword123", - "rol": "CLIENT" + "name": "ADMIN", + "email": "admin@dev.com", + "password": "123", + "rol": "ADMIN" }, { - "name": "Jane Smith", - "email": "jane.smith@example.com", - "password": "securePassword456", + "name": "Hotel", + "email": "hotel@dev.com", + "password": "123", "rol": "HOTEL_ADMIN" }, { - "name": "Alice Johnson", - "email": "alice.johnson@example.com", - "password": "securePassword789", + "name": "Client", + "email": "client@dev.com", + "password": "123", "rol": "CLIENT" } ] diff --git a/poblate/package.json b/poblate/package.json new file mode 100644 index 0000000000000000000000000000000000000000..21775f0b7229718bae14650299fd92f3754cc6f8 --- /dev/null +++ b/poblate/package.json @@ -0,0 +1,18 @@ +{ + "name": "poblate", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "dev": "node index.js", + "prod": "node index.js -- --prod", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "axios": "^1.7.9", + "jwt-decode": "^4.0.0" + } +}