feat: soporte de contraseña REMOVERVOTOE3 para remover votos individuales y vaciar pruebas

This commit is contained in:
urieljareth
2026-08-13 17:05:59 -06:00
parent 3faae49fa6
commit bd3ead6e74
9 changed files with 323 additions and 75 deletions
+42 -5
View File
@@ -3,13 +3,19 @@ import cors from 'cors';
import path from 'path';
import fs from 'fs';
import dotenv from 'dotenv';
import { initDatabase, getAllVotes, castVote, deleteVote, getDatabaseHealth } from './db';
import { initDatabase, getAllVotes, castVote, deleteVote, deleteAllVotes, getDatabaseHealth } from './db';
dotenv.config();
const app = express();
const PORT = parseInt(process.env.PORT || '3000', 10);
const ADMIN_SECRET = process.env.ADMIN_SECRET || 'RESETEOE3';
const ADMIN_SECRET = process.env.ADMIN_SECRET || 'REMOVERVOTOE3';
const VALID_ADMIN_KEYS = new Set([ADMIN_SECRET, 'REMOVERVOTOE3', 'RESETEOE3']);
function isValidAdminKey(key: unknown): boolean {
if (!key || typeof key !== 'string') return false;
return VALID_ADMIN_KEYS.has(key.trim());
}
app.use(cors());
app.use(express.json());
@@ -177,15 +183,15 @@ app.post('/api/vote', async (req: Request, res: Response): Promise<void> => {
});
/**
* Restablecer / eliminar un voto (Administrador)
* Restablecer / eliminar un voto individual (Administrador)
*/
app.delete('/api/vote/:voter', async (req: Request, res: Response): Promise<void> => {
try {
const voter = req.params.voter;
const providedKey = req.headers['x-admin-key'] || req.body?.password || req.query?.key;
if (providedKey !== ADMIN_SECRET) {
res.status(401).json({ success: false, error: 'Clave de administración incorrecta.' });
if (!isValidAdminKey(providedKey)) {
res.status(401).json({ success: false, error: 'Contraseña de administración incorrecta. Use REMOVERVOTOE3.' });
return;
}
@@ -213,6 +219,37 @@ app.delete('/api/vote/:voter', async (req: Request, res: Response): Promise<void
}
});
/**
* Restablecer TODOS los votos (Vaciado completo para pruebas)
*/
app.delete('/api/votes', async (req: Request, res: Response): Promise<void> => {
try {
const providedKey = req.headers['x-admin-key'] || req.body?.password || req.query?.key;
if (!isValidAdminKey(providedKey)) {
res.status(401).json({ success: false, error: 'Contraseña de administración incorrecta. Use REMOVERVOTOE3.' });
return;
}
const count = await deleteAllVotes();
// Disparar actualización en vivo
broadcastUpdate().catch(console.error);
res.json({
success: true,
message: `Se han eliminado todos los votos (${count} votos restablecidos).`,
count,
});
} catch (error) {
res.status(500).json({
success: false,
error: 'Error al vaciar los votos.',
detail: (error as Error).message,
});
}
});
// ==========================================
// SERVIR FRONTEND ESTÁTICO EN PRODUCCIÓN
// ==========================================