diff --git a/src/application/monitor-controller.ts b/src/application/monitor-controller.ts index b49172e..a66959b 100644 --- a/src/application/monitor-controller.ts +++ b/src/application/monitor-controller.ts @@ -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); + } + } } diff --git a/src/application/monitor-usecases.ts b/src/application/monitor-usecases.ts index 569de2a..9831f08 100644 --- a/src/application/monitor-usecases.ts +++ b/src/application/monitor-usecases.ts @@ -39,8 +39,7 @@ export class MonitorUsecases { }); } } - - async createNewProject(nombre: string, urlHealth: string): Promise { + 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 { + const validated = this.validateProjectInput(nombre, urlHealth); + await this.repository.addProject(validated.nombre, validated.urlHealth); + } + + async updateProject(projectId: number, nombre: string, urlHealth: string): Promise { + 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 { diff --git a/src/config/postgres-config.ts b/src/config/postgres-config.ts index 1a65a36..65d0916 100644 --- a/src/config/postgres-config.ts +++ b/src/config/postgres-config.ts @@ -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 }); diff --git a/src/infrastructure/monitor-routes-http.ts b/src/infrastructure/monitor-routes-http.ts index bbddd07..861abe7 100644 --- a/src/infrastructure/monitor-routes-http.ts +++ b/src/infrastructure/monitor-routes-http.ts @@ -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; diff --git a/src/repository/monitor-repository.ts b/src/repository/monitor-repository.ts index d4cc17a..921e7c1 100644 --- a/src/repository/monitor-repository.ts +++ b/src/repository/monitor-repository.ts @@ -96,4 +96,17 @@ export class MonitorRepository { }) } } + async updateProject(id: number, nombre: string, urlHealth: string): Promise { + 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) + }); + } + } } diff --git a/src/views/index.ejs b/src/views/index.ejs index ea026cc..4f708d3 100644 --- a/src/views/index.ejs +++ b/src/views/index.ejs @@ -115,11 +115,13 @@ <% proyectos.forEach(function(p) { %> - <%= p.nombre %> - - <%= p.url_health %> - +
+ +
+ + + <%= p.estado_monitoreo === 'PAUSADO' ? 'PAUSADO' : (p.estado_codigo || 'PENDIENTE') %> @@ -130,6 +132,7 @@ +