UNPKG

skailan-core

Version:

Servicio de autenticación y multitenancy para Skailan.

89 lines 3.27 kB
/** * Servicio centralizado para la gestión de membresías y roles en organizaciones. * Incluye lógica para invitar, aceptar, listar, cambiar rol y eliminar miembros. */ import { Role, MembershipStatus } from "@prisma/client"; // import { sendEmail } from "@skailan/email"; // Función temporal para envío de email const sendEmail = async (to, subject, html) => { console.log(`📧 Email simulado enviado a ${to}: ${subject}`); return { success: true }; }; export class MembershipService { static async createMembership(prisma, userId, organizationId, role = Role.MEMBER, status = MembershipStatus.INVITED) { return await prisma.membership.create({ data: { userId, organizationId, role, status, }, include: { user: true, organization: true, }, }); } static async updateMembership(prisma, membershipId, data) { return await prisma.membership.update({ where: { id: membershipId }, data, include: { user: true, organization: true, }, }); } static async deleteMembership(prisma, membershipId, organizationId) { return await prisma.membership.delete({ where: { id: membershipId }, }); } static async getMembership(prisma, userId, organizationId) { return await prisma.membership.findUnique({ where: { userId_organizationId: { userId, organizationId } }, include: { user: true, organization: true, }, }); } static async getOrganizationMembers(prisma, organizationId) { return await prisma.membership.findMany({ where: { organizationId }, include: { user: true, }, }); } static async inviteUser(prisma, organizationId, email, role = "member") { // Buscar o crear usuario let user = await prisma.user.findUnique({ where: { email } }); if (!user) { // Crear usuario temporal user = await prisma.user.create({ data: { email, password: "temp-password", // Se cambiará en el primer login name: email.split("@")[0], }, }); } // Crear membresía const membership = await this.createMembership(prisma, user.id, organizationId, role, MembershipStatus.INVITED); // Enviar email de invitación const organization = await prisma.organization.findUnique({ where: { id: organizationId }, }); await sendEmail(email, `Invitación a ${organization?.name || "Skailan"}`, ` <h1>Invitación a ${organization?.name || "Skailan"}</h1> <p>Has sido invitado a unirte a ${organization?.name || "Skailan"}.</p> <p>Tu rol será: ${role}</p> <a href="${process.env.APP_URL}/accept-invitation?token=${membership.id}"> Aceptar invitación </a> `); return membership; } } //# sourceMappingURL=membershipService.js.map