chore: estructura inicial del MVP

Backend (Express + MariaDB) y frontend (React + Vite, identidad Fluent/Windows) con el
nucleo funcional: seguridad, organizacion, proyectos, actividades, subtareas, dependencias,
dashboard, calendario, gantt, comentarios, adjuntos, notificaciones in-app y catalogos.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-09-03 08:37:58 -05:00
commit 1d22adc42e
135 changed files with 10913 additions and 0 deletions
+13
View File
@@ -0,0 +1,13 @@
import mysql from 'mysql2/promise';
import { env } from './env.js';
export const pool = mysql.createPool({
host: env.db.host,
port: env.db.port,
database: env.db.name,
user: env.db.user,
password: env.db.password,
waitForConnections: true,
connectionLimit: 10,
dateStrings: true,
});
+32
View File
@@ -0,0 +1,32 @@
import 'dotenv/config';
const required = ['DB_HOST', 'DB_NAME', 'DB_USER', 'DB_PASSWORD', 'JWT_SECRET'];
for (const key of required) {
if (!process.env[key]) {
if (process.env.NODE_ENV === 'production') {
throw new Error(`Falta la variable de entorno obligatoria: ${key}`);
}
console.warn(`[env] Falta ${key} — completa backend/.env`);
}
}
if (process.env.NODE_ENV === 'production' && (process.env.JWT_SECRET || '').length < 32) {
throw new Error('JWT_SECRET debe tener al menos 32 caracteres en producción');
}
export const env = {
port: Number(process.env.PORT || 4019),
nodeEnv: process.env.NODE_ENV || 'development',
db: {
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT || 3306),
name: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
},
jwtSecret: process.env.JWT_SECRET || 'dev-only-insecure-secret',
jwtExpires: process.env.JWT_EXPIRES || '8h',
corsOrigin: process.env.CORS_ORIGIN || 'http://localhost:5196',
storageRoot: process.env.STORAGE_ROOT || './storage',
};