feat: implement user authentication and login modal, refactor backend
This commit is contained in:
88
web/backend/utils/fileUtils.js
Normal file
88
web/backend/utils/fileUtils.js
Normal file
@@ -0,0 +1,88 @@
|
||||
import { readFileSync, writeFileSync, existsSync, statSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
import { PATHS } from '../config/constants.js';
|
||||
|
||||
// Función para obtener la ruta del log (en Docker puede estar en /data/logs)
|
||||
export function getLogPath() {
|
||||
const logsDirPath = join(PATHS.PROJECT_ROOT, 'logs', 'monitor.log');
|
||||
const rootLogPath = join(PATHS.PROJECT_ROOT, 'monitor.log');
|
||||
|
||||
if (existsSync(logsDirPath)) {
|
||||
return logsDirPath;
|
||||
}
|
||||
return rootLogPath;
|
||||
}
|
||||
|
||||
// Leer archivo JSON de forma segura
|
||||
export function readJSON(path, defaultValue = {}) {
|
||||
try {
|
||||
if (existsSync(path)) {
|
||||
return JSON.parse(readFileSync(path, 'utf8'));
|
||||
}
|
||||
return defaultValue;
|
||||
} catch (error) {
|
||||
console.error(`Error leyendo ${path}:`, error.message);
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
// Escribir archivo JSON
|
||||
export function writeJSON(path, data) {
|
||||
try {
|
||||
writeFileSync(path, JSON.stringify(data, null, 2), 'utf8');
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(`Error escribiendo ${path}:`, error.message);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Leer logs de forma segura
|
||||
export function readLogs(logPath, options = {}) {
|
||||
const { sinceLine = 0, limit = 500 } = options;
|
||||
|
||||
try {
|
||||
if (!existsSync(logPath)) {
|
||||
return { logs: [], totalLines: 0, lastLineNumber: 0 };
|
||||
}
|
||||
|
||||
// Verificar que no sea un directorio
|
||||
try {
|
||||
const stats = statSync(logPath);
|
||||
if (stats.isDirectory()) {
|
||||
return {
|
||||
logs: ['Error: monitor.log es un directorio. Por favor, elimínalo y reinicia.'],
|
||||
totalLines: 0,
|
||||
lastLineNumber: 0
|
||||
};
|
||||
}
|
||||
} catch (e) {
|
||||
return { logs: [], totalLines: 0, lastLineNumber: 0 };
|
||||
}
|
||||
|
||||
const logsContent = readFileSync(logPath, 'utf8');
|
||||
const allLines = logsContent.split('\n').filter(l => l.trim());
|
||||
const totalLines = allLines.length;
|
||||
|
||||
if (sinceLine > 0 && sinceLine < totalLines) {
|
||||
// Devolver solo las líneas nuevas después de sinceLine
|
||||
const newLines = allLines.slice(sinceLine);
|
||||
return {
|
||||
logs: newLines,
|
||||
totalLines: totalLines,
|
||||
lastLineNumber: totalLines - 1
|
||||
};
|
||||
} else {
|
||||
// Carga inicial: devolver las últimas líneas
|
||||
const lastLines = allLines.slice(-limit);
|
||||
return {
|
||||
logs: lastLines,
|
||||
totalLines: totalLines,
|
||||
lastLineNumber: totalLines - 1
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
throw new Error(error.message);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user