Implementado actualización de nombres y endpoints

This commit is contained in:
Trabajo
2026-05-07 12:27:59 +02:00
parent 06232d238c
commit 1bd87c3d69
6 changed files with 59 additions and 12 deletions

View File

@@ -99,4 +99,19 @@ export class MonitorController {
next(err);
}
}
updateProject = async (req: Request, res: Response, next: NextFunction) => {
try {
const projectId = Number(req.params['id']);
if (!Number.isInteger(projectId) || projectId <= 0) {
throw new AppError('Id de proyecto invalido', 400);
}
const { nombre, url_health } = req.body;
await this.usecases.updateProject(projectId, nombre, url_health);
res.redirect('/');
} catch (err) {
next(err);
}
}
}

View File

@@ -39,8 +39,7 @@ export class MonitorUsecases {
});
}
}
async createNewProject(nombre: string, urlHealth: string): Promise<void> {
private validateProjectInput(nombre: string, urlHealth: string): { nombre: string; urlHealth: string } {
const trimmedNombre = typeof nombre === 'string' ? nombre.trim() : '';
const trimmedUrl = typeof urlHealth === 'string' ? urlHealth.trim() : '';
@@ -62,7 +61,23 @@ export class MonitorUsecases {
throw new AppError('La URL de health check no es valida', 400);
}
await this.repository.addProject(trimmedNombre, trimmedUrl);
return { nombre: trimmedNombre, urlHealth: trimmedUrl };
}
async createNewProject(nombre: string, urlHealth: string): Promise<void> {
const validated = this.validateProjectInput(nombre, urlHealth);
await this.repository.addProject(validated.nombre, validated.urlHealth);
}
async updateProject(projectId: number, nombre: string, urlHealth: string): Promise<void> {
const project = await this.repository.getProjectById(projectId);
if (!project || project.estado_monitoreo === 'ELIMINADO') {
throw new AppError('Proyecto no encontrado', 404);
}
const validated = this.validateProjectInput(nombre, urlHealth);
await this.repository.updateProject(projectId, validated.nombre, validated.urlHealth);
}
async checkProjectHealth(projectId: number): Promise<void> {

View File

@@ -4,9 +4,9 @@ import dotenv from 'dotenv';
dotenv.config();
export const pool = new pg.Pool({
host: process.env.POSTGRES_HOST,
port: Number(process.env.POSTGRES_PORT),
user: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DB
host: process.env.POSTGRES_HOST ?? process.env.DB_HOST,
port: Number(process.env.POSTGRES_PORT ?? process.env.DB_PORT),
user: process.env.POSTGRES_USER ?? process.env.DB_USER,
password: process.env.POSTGRES_PASSWORD ?? process.env.DB_PASSWORD,
database: process.env.POSTGRES_DB ?? process.env.DB_NAME
});

View File

@@ -15,6 +15,7 @@ export function createRouter(usecases: MonitorUsecases, scheduler: MonitorSchedu
router.post('/monitor-interval', controller.updateMonitorInterval);
router.post('/proyectos/:id/toggle-status', controller.toggleProjectStatus);
router.post('/proyectos/:id/eliminar', controller.deleteProject);
router.post('/proyectos/:id/editar', controller.updateProject);
return router;

View File

@@ -96,4 +96,17 @@ export class MonitorRepository {
})
}
}
async updateProject(id: number, nombre: string, urlHealth: string): Promise<void> {
try {
await this.db.query(
'UPDATE proyectos SET nombre = $1, url_health = $2 WHERE id = $3;',
[nombre.trim(), urlHealth.trim(), id]
);
} catch (err) {
throw new RepositoryError('Error al actualizar el proyecto', {
id,
cause: err instanceof Error ? err.message : String(err)
});
}
}
}

View File

@@ -115,11 +115,13 @@
<tbody>
<% proyectos.forEach(function(p) { %>
<tr class="status-<%= p.estado_monitoreo %>">
<td><%= p.nombre %></td>
<td>
<a href="<%= p.url_health %>" target="_blank">
<%= p.url_health %>
</a>
<form id="edit-<%= p.id %>" action="/proyectos/<%= p.id %>/editar" method="POST">
<input type="text" name="nombre" value="<%= p.nombre %>" required maxlength="100">
</form>
</td>
<td>
<input form="edit-<%= p.id %>" type="url" name="url_health" value="<%= p.url_health %>" required>
</td>
<td class="<%= p.estado_monitoreo === 'PAUSADO' ? 'PAUSADO' : (p.estado_codigo || 'PENDIENTE') %>">
<%= p.estado_monitoreo === 'PAUSADO' ? 'PAUSADO' : (p.estado_codigo || 'PENDIENTE') %>
@@ -130,6 +132,7 @@
<td class="actions">
<!-- Botón refrescar -->
<button class="btn btn-refresh btn-mini" onclick="runCheck('/check/<%= p.id %>', this)" title="Refrescar">↻</button>
<button form="edit-<%= p.id %>" class="btn btn-mini" type="submit" title="Guardar">Guardar</button>
<!-- Botón pausar -->
<button class="btn btn-pause btn-mini" onclick="runAction('/proyectos/<%= p.id%>/toggle-status', this)">