skailan-core
Version:
Servicio de autenticación y multitenancy para Skailan.
212 lines • 8.96 kB
JavaScript
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