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