skailan-conversations
Version:
Servicio de conversaciones y mensajería para Skailan
94 lines • 3.36 kB
JavaScript
import express from "express";
import { tenantResolver } from "@skailan/core/dist/shared/middlewares/tenantResolver";
import channelRoutes from "./api/routes/channels.routes";
import conversationRoutes from "./api/routes/conversationRoutes";
import tagRoutes from "./api/routes/tagRoutes";
import aiRoutes from "./api/routes/aiRoutes";
import unifiedWebhookRoutes from "./api/routes/unifiedWebhookRoutes";
import messageRoutes from "./api/routes/messageRoutes";
import http from "http";
import { Server } from "socket.io";
import Redis from "ioredis";
const app = express();
const PORT = process.env.PORT || 3007; // Using 3007
const httpServer = http.createServer(app);
const io = new Server(httpServer, {
cors: {
origin: "*", // TODO: Restringir esto en producción
methods: ["GET", "POST"],
},
});
// Configuración de Redis para Pub/Sub
const redis = new Redis({
port: Number(process.env.REDIS_PORT) || 6379,
host: process.env.REDIS_HOST || "localhost",
password: process.env.REDIS_PASSWORD || undefined,
});
redis.on("connect", () => {
console.log("Conectado a Redis para Pub/Sub");
});
redis.on("error", (err) => {
console.error("Error de conexión a Redis:", err);
});
// Suscribirse a un canal de Redis para eventos entre servicios
redis.subscribe("inter-service-events", (err, count) => {
if (err) {
console.error("Error al suscribirse a Redis:", err.message);
}
else {
console.log(`Suscrito a ${count} canal(es) de Redis`);
}
});
redis.on("message", (channel, message) => {
console.log(`Mensaje recibido de Redis en el canal ${channel}: ${message}`);
try {
const event = JSON.parse(message);
// Emitir el evento a todos los clientes conectados a Socket.IO
io.emit(event.type, event.payload);
}
catch (e) {
console.error("Error al parsear el mensaje de Redis:", e);
}
});
io.on("connection", (socket) => {
console.log("a user connected");
socket.on("disconnect", () => {
console.log("user disconnected");
});
// Ejemplo de emisión de evento
socket.emit("message", "Welcome to the chat!");
});
app.use(express.json());
app.use(tenantResolver);
app.get("/", (req, res) => {
res.send("Conversations Service API is running!");
});
app.use("/channels", channelRoutes);
app.use("/conversations", conversationRoutes);
app.use("/tags", tagRoutes);
app.use("/ai", aiRoutes);
app.use("/messages", messageRoutes);
app.use("/", unifiedWebhookRoutes);
app.get("/test-tenant", async (req, res) => {
try {
const organizationId = req.organization?.id; // organizationId is now attached by the tenantResolver from @skailan/core
if (!organizationId) {
return res.status(400).json({ error: "Organization ID not found." });
}
if (req.tenantPrisma) {
res.status(200).json({
message: `Tenant Prisma client initialized for organization: ${organizationId}`,
});
}
else {
res.status(500).json({ error: "Prisma client not initialized." });
}
}
catch (error) {
res.status(500).json({ error: error.message || "Error testing tenant." });
}
});
httpServer.listen(PORT, () => {
console.log(`Conversations Service running on port ${PORT}`);
});
//# sourceMappingURL=index.js.map