UNPKG

skailan-core

Version:

Servicio de autenticación y multitenancy para Skailan.

212 lines 8.96 kB
import { OrganizationService } from "../services/OrganizationService"; /** * Crea una nueva organización y asigna al usuario autenticado como OWNER. * @param req Request de Express con los datos de la organización. * @param res Response de Express. * @returns La organización creada o error. */ export const createOrganization = async (req, res) => { const userId = req.user.id; if (!userId) return res.status(401).json({ error: "No autenticado." }); const { name, slug, domain, subdomain } = req.body; if (!name || !slug) return res.status(400).json({ error: "Nombre y slug requeridos." }); try { if (!req.tenantPrisma) { return res.status(500).json({ error: "Prisma client not initialized for tenant." }); } const org = await OrganizationService.createOrganization(req.tenantPrisma, userId, name, slug, domain, subdomain); return res.status(201).json(org); } catch (err) { console.error("Error al crear organización:", err); return res.status(500).json({ error: err.message || "Error al crear organización." }); } }; /** * Lista las organizaciones a las que pertenece el usuario autenticado, con paginación. * @param req Request de Express (query: page, limit). * @param res Response de Express. * @returns Lista paginada de organizaciones. */ export const listOrganizations = async (req, res) => { const userId = req.user.id; if (!userId) return res.status(401).json({ error: "No autenticado." }); const page = parseInt(req.query.page) || 1; const limit = parseInt(req.query.limit) || 10; try { if (!req.tenantPrisma) { return res.status(500).json({ error: "Prisma client not initialized for tenant." }); } const { data: organizations, meta } = await OrganizationService.listOrganizations(req.tenantPrisma, userId, page, limit); return res.status(200).json({ data: organizations, meta }); } catch (err) { return res.status(500).json({ error: err.message || "Error al listar organizaciones." }); } }; /** * Obtiene el detalle de una organización si el usuario es miembro. * @param req Request de Express (params: id). * @param res Response de Express. * @returns Organización o error de acceso. */ export const getOrganization = async (req, res) => { const userId = req.user.id; if (!userId) return res.status(401).json({ error: "No autenticado." }); const { id } = req.params; if (!id) return res.status(400).json({ error: "ID requerido." }); try { if (!req.tenantPrisma) { return res.status(500).json({ error: "Prisma client not initialized for tenant." }); } const org = await OrganizationService.getOrganization(req.tenantPrisma, userId, id); return res.status(200).json(org); } catch (err) { if (err.message === "No tienes acceso a esta organización." || err.message === "Organización no encontrada.") { return res.status(404).json({ error: err.message }); } return res.status(500).json({ error: err.message || "Error al obtener organización." }); } }; /** * Actualiza los datos de una organización. Solo el OWNER puede editar. * @param req Request de Express (params: id, body: name, domain, subdomain). * @param res Response de Express. * @returns Organización actualizada o error. */ export const updateOrganization = async (req, res) => { const userId = req.user.id; if (!userId) return res.status(401).json({ error: "No autenticado." }); const { id } = req.params; const { name, domain, subdomain } = req.body; if (!id) return res.status(400).json({ error: "ID requerido." }); try { if (!req.tenantPrisma) { return res.status(500).json({ error: "Prisma client not initialized for tenant." }); } const org = await OrganizationService.updateOrganization(req.tenantPrisma, userId, id, name, domain, subdomain); return res.status(200).json(org); } catch (err) { if (err.message === "Solo el propietario puede editar.") { return res.status(403).json({ error: err.message }); } return res.status(500).json({ error: err.message || "Error al actualizar organización." }); } }; /** * Elimina una organización (soft delete) si solo tiene un miembro y el usuario es OWNER. * @param req Request de Express (params: id). * @param res Response de Express. * @returns 204 si se elimina, error si no procede. */ export const deleteOrganization = async (req, res) => { const userId = req.user.id; if (!userId) return res.status(401).json({ error: "No autenticado." }); const { id } = req.params; if (!id) return res.status(400).json({ error: "ID requerido." }); try { if (!req.tenantPrisma) { return res.status(500).json({ error: "Prisma client not initialized for tenant." }); } await OrganizationService.deleteOrganization(req.tenantPrisma, userId, id); return res.status(204).send(); } catch (err) { if (err.message === "Solo el propietario puede eliminar." || err.message === "No se puede eliminar una organización con más de un miembro.") { return res.status(403).json({ error: err.message }); } return res.status(500).json({ error: err.message || "Error al eliminar organización." }); } }; /** * Obtiene los settings de una organización si el usuario es miembro. * @param req Request de Express (params: id). * @param res Response de Express. * @returns Settings de la organización. */ export const getOrganizationSettings = async (req, res) => { const userId = req.user.id; if (!userId) return res.status(401).json({ error: "No autenticado." }); const { id } = req.params; if (!id) return res.status(400).json({ error: "ID requerido." }); try { if (!req.tenantPrisma) { return res.status(500).json({ error: "Prisma client not initialized for tenant." }); } const { settings } = await OrganizationService.getOrganizationSettings(req.tenantPrisma, userId, id); return res.status(200).json({ settings }); } catch (err) { if (err.message === "No tienes acceso a esta organización." || err.message === "Organización no encontrada.") { return res.status(403).json({ error: err.message }); } return res.status(500).json({ error: err.message || "Error al obtener settings." }); } }; /** * Actualiza los settings de una organización. Solo el OWNER puede modificar. * @param req Request de Express (params: id, body: settings). * @param res Response de Express. * @returns Settings actualizados o error. */ export const updateOrganizationSettings = async (req, res) => { const userId = req.user.id; if (!userId) return res.status(401).json({ error: "No autenticado." }); const { id } = req.params; const { settings } = req.body; if (!id) return res.status(400).json({ error: "ID requerido." }); try { if (!req.tenantPrisma) { return res.status(500).json({ error: "Prisma client not initialized for tenant." }); } const { settings: updatedSettings } = await OrganizationService.updateOrganizationSettings(req.tenantPrisma, userId, id, settings); return res.status(200).json({ settings: updatedSettings }); } catch (err) { if (err.message === "Solo el propietario puede modificar los settings.") { return res.status(403).json({ error: err.message }); } return res.status(500).json({ error: err.message || "Error al actualizar settings." }); } }; /** * Endpoint para consultar el estado de trial, bloqueo y plan activo de una organización. * GET /api/organizations/:id/status */ export const getOrganizationStatus = async (req, res) => { const userId = req.user.id; if (!userId) return res.status(401).json({ error: "No autenticado." }); const { id } = req.params; if (!id) return res.status(400).json({ error: "ID requerido." }); try { if (!req.tenantPrisma) { return res.status(500).json({ error: "Prisma client not initialized for tenant." }); } const statusInfo = await OrganizationService.getOrganizationStatus(req.tenantPrisma, userId, id); return res.status(200).json(statusInfo); } catch (err) { if (err.message === "No tienes acceso a esta organización." || err.message === "Organización no encontrada.") { return res.status(403).json({ error: err.message }); } return res.status(500).json({ error: err.message || "Error al consultar estado de organización." }); } }; //# sourceMappingURL=organizationController.js.map