Se pudo conectar satisfactoriamente a la base de datos tenantdb_1 y suitecoffee-db.

En ./services/app/

Se sirvierons los HTML de la carpeta /pages.

Se crearon los endpoints REST para crear y listar roles, usuarios, categorias, productos.
This commit is contained in:
2025-08-14 23:37:38 +00:00
parent 656293b74c
commit f483058c2c
30 changed files with 2649 additions and 794 deletions
+22
View File
@@ -0,0 +1,22 @@
# Dockerfile.dev
FROM node:20.17
# Definir variables de entorno con valores predeterminados
ARG NODE_ENV=development
ARG PORT=3000
# Copia archivos de configuración primero para aprovechar el cache
COPY package*.json ./
# Instala dependencias
RUN npm i express pg dotenv cors
RUN npm i --save-dev nodemon
# Copia el resto de la app
COPY . .
# Expone el puerto
EXPOSE 3000
# Usa nodemon para hot reload si lo tenés
CMD ["npm", "run", "dev"]
+1462
View File
File diff suppressed because it is too large Load Diff
+26
View File
@@ -0,0 +1,26 @@
{
"name": "auth",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"start": "NODE_ENV=production node ./src/index.js",
"dev": "NODE_ENV=development node ./src/index.js",
"test": "NODE_ENV=stage node ./src/index.js"
},
"author": "Mateo Saldain",
"license": "ISC",
"type": "module",
"devDependencies": {
"cross-env": "^10.0.0",
"nodemon": "^3.1.10"
},
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^17.2.1",
"express": "^5.1.0",
"express-ejs-layouts": "^2.5.1",
"pg": "^8.16.3"
},
"keywords": [],
"description": ""
}
+79
View File
@@ -0,0 +1,79 @@
// auth/src/index.js
import express from 'express';
import expressLayouts from 'express-ejs-layouts';
import cors from 'cors';
import { Pool } from 'pg';
// Rutas
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Variables de Entorno
import dotenv, { config } from 'dotenv';
// Obtención de la ruta de la variable de entorno correspondiente a NODE_ENV
try {
if (process.env.NODE_ENV === 'development') {
dotenv.config({ path: path.resolve(__dirname, '../.env.development' )});
console.log("Activando entorno de -> development");
} else if (process.env.NODE_ENV === 'stage') {
dotenv.config({ path: path.resolve(__dirname, '../.env.test' )});
console.log("Activando entorno de -> testing");
} else if (process.env.NODE_ENV === 'production') {
dotenv.config({ path: path.resolve(__dirname, '../.env' )});
console.log("Activando entorno de -> producción");
}
} catch (error) {
console.log("A ocurrido un error al seleccionar el entorno. \nError: " + error);
}
// Renderiado
const app = express();
app.use(cors());
app.use(express.json());
// Configuración de conexión PostgreSQL
const dbConfig = {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
port: process.env.DB_LOCAL_PORT
};
const pool = new Pool(dbConfig);
async function verificarConexion() {
try {
const client = await pool.connect();
const res = await client.query('SELECT NOW() AS hora');
console.log('Conexión con la base de datos fue exitosa.');
console.log('Fecha y hora actual de la base de datos:', res.rows[0].hora);
client.release(); // liberar el cliente de nuevo al pool
} catch (error) {
console.error('Error al conectar con la base de datos al iniciar:', error.message);
}
}
// === Servir páginas estáticas ===
app.use('/pages', express.static(path.join(__dirname, 'pages')));
// Rutas de conveniencia para abrir cada página rápido:
// (Opcional: puedes usar directamente /pages/roles.html, etc.)
app.get('/', (req, res) => res.sendFile(path.join(__dirname, 'pages', 'index.html')));
app.use(expressLayouts);
// Iniciar servidor
app.listen( process.env.PORT, () => {
console.log(`Servidor corriendo en http://localhost:${process.env.PORT}`);
console.log('Estableciendo conexión con la db...');
verificarConexion();
});
+45
View File
@@ -0,0 +1,45 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Login Bootstrap</title>
<!-- Bootstrap CDN -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body class="bg-light d-flex justify-content-center align-items-center vh-100">
<div class="card shadow p-4" style="width: 100%; max-width: 350px;">
<h4 class="text-center mb-4">Iniciar Sesión</h4>
<form id="form-login">
<div class="mb-3">
<label for="usuario" class="form-label">Usuario</label>
<input type="text" class="form-control" id="usuario" placeholder="Ingrese su usuario" required>
</div>
<div class="mb-3">
<label for="clave" class="form-label">Contraseña</label>
<input type="password" class="form-control" id="clave" placeholder="Ingrese su contraseña" required>
</div>
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="recordarme">
<label class="form-check-label" for="recordarme">
Recordarme
</label>
</div>
<a href="#" class="small">¿Olvidaste tu contraseña?</a>
</div>
<button type="submit" class="btn btn-primary w-100">Entrar</button>
</form>
</div>
<!-- Bootstrap JS (opcional) -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>