"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SERVER_STATE = exports.BOT_STATE = void 0; const express_1 = require("express"); const dockerService_1 = require("../services/dockerService"); const axios_1 = __importDefault(require("axios")); var BOT_STATE; (function (BOT_STATE) { BOT_STATE["EXISTS"] = "exists"; BOT_STATE["NOT_EXISTS"] = "not_exists"; })(BOT_STATE = exports.BOT_STATE || (exports.BOT_STATE = {})); var SERVER_STATE; (function (SERVER_STATE) { SERVER_STATE["RUNNING"] = "running"; SERVER_STATE["NOT_WORKING"] = "not_working"; })(SERVER_STATE = exports.SERVER_STATE || (exports.SERVER_STATE = {})); const router = (0, express_1.Router)(); const getContainerApiUrl = (port) => { const baseUrl = process.env.CONTAINER_API_URL ? process.env.CONTAINER_API_URL : "http://localhost"; const url = `${baseUrl}:${port}/`; return url; }; // Obtener todos los contenedores router.get("/", async (req, res) => { try { const containers = await (0, dockerService_1.listContainers)(); res.json(containers); } catch (error) { res.status(500).json({ error: error.message }); } }); // Iniciar un contenedor por ID router.post("/:id/start", async (req, res) => { try { const organizationId = req.params.id; const containerInfo = await (0, dockerService_1.getContainerByOrganization)(organizationId); await (0, dockerService_1.startContainer)(containerInfo.Id); res.json({ message: `El bot ${containerInfo.Id} ha sido iniciado` }); } catch (error) { if (error.message.indexOf("already started") >= 0) { res.json({ message: `El bot se encontraba iniciado anteriormente.` }); return; } res.status(500).json({ error: error.message }); } }); // Obtener el QR de conexion para el bot de una organization. router.get("/:id/qr", async (req, res) => { try { const organizationId = req.params.id; const containerInfo = await (0, dockerService_1.getContainerByOrganization)(organizationId); const url = getContainerApiUrl(containerInfo.Ports[0].PublicPort.toString()); // "http://localhost:" + containerInfo.Ports[0].PublicPort + "/"; const response = await axios_1.default.get(url, { responseType: "arraybuffer" }); res.setHeader("Content-type", "image/png"); res.send(response.data); } catch (error) { res.status(500).json({ error: error.message }); } }); // Detener un contenedor por ID router.post("/:id/stop", async (req, res) => { try { const organizationId = req.params.id; const containerInfo = await (0, dockerService_1.getContainerByOrganization)(organizationId); await (0, dockerService_1.stopContainer)(containerInfo.Id); res.json({ message: `El bot de la organizacion ${organizationId} ha sido detenido` }); } catch (error) { console.log(error.message); res.status(500).json({ error: error.message }); } }); // Eliminar un contenedor por ID router.delete("/:id", async (req, res) => { try { const organizationId = req.params.id; const containerInfo = await (0, dockerService_1.getContainerByOrganization)(organizationId); await (0, dockerService_1.removeContainer)(containerInfo.Id); res.json({ message: `El bot de la organizacion ${organizationId} removed` }); } catch (error) { res.status(500).json({ error: error.message }); } }); // Crear un nuevo contenedor router.post("/create", async (req, res) => { try { const { organizationId } = req.body; const port = await (0, dockerService_1.getAvailablePort)(); if (!port) { res.status(400).json({ error: "Port is required" }); return; } if (await (0, dockerService_1.existsContainer)(organizationId)) { res.json({ message: `Ya existe un bot de whatsapp creado para esta organizacion` }); return; } const containerName = `${organizationId}_bot_${port}`; const imageName = "txbot"; const containerId = await (0, dockerService_1.createContainer)(port, containerName, imageName); console.log(`Se ha creado un nuevo bot en el contenedor ${containerId} para la organizacion ${organizationId}`); res.json({ message: `El bot ha sido creado con exito`, port, organizationId }); } catch (error) { res.status(500).json({ error: error.message }); } }); // Consultar el estado de un contenedor par auna organizationId router.post("/:id/status", async (req, res) => { try { const organizationId = req.params.id; const info = await (0, dockerService_1.getContainerByOrganization)(organizationId); res.json({ state: BOT_STATE.EXISTS, status: info.Status, serverState: SERVER_STATE.RUNNING }); } catch (error) { res.status(500).json({ error: error.message, code: 404 }); } }); router.post("/:id/send", async (req, res) => { try { const organizationId = req.params.id; const data = req.body; const info = await (0, dockerService_1.getContainerByOrganization)(organizationId); const url = getContainerApiUrl(info.Ports[0].PublicPort.toString()); const result = await axios_1.default.post(url + "v1/messages", data); if (result.status !== 200) { throw new Error("Ha ocurrido un error al enviar el mensaje" + result); } res.json({ message: `Mensaje enviado` }); } catch (error) { res.status(500).json({ error: error.message }); } }); router.post("/:id/session", async (req, res) => { try { const organizationId = req.params.id; const data = req.body; const info = await (0, dockerService_1.getContainerByOrganization)(organizationId); const url = getContainerApiUrl(info.Ports[0].PublicPort.toString()); const result = await axios_1.default.post(url + "v1/session", data); if (result.status !== 200) { throw new Error("Ha ocurrido un error al enviar el mensaje" + result); } const resultData = result.data; res.json({ message: `${resultData}` }); } catch (error) { res.status(500).json({ error: error.message }); } }); exports.default = router;