import { getPrismaClient } from "@b2bcall/database"; /** * Verifica se `userId` tem a permissão `permissionKey`, considerando roles * PLATFORM (tenantId nulo, valem em qualquer contexto) e roles TENANT * atribuídas especificamente em `tenantId` (agente.md secao 144: role scope * PLATFORM ou TENANT — nunca escopo global acidental). * * Não usa RLS (ver comentário na migration auth_and_rbac): a checagem é * feita explicitamente aqui, na camada de serviço confiável. */ export async function userHasPermission( userId: string, permissionKey: string, tenantId?: string, ): Promise { const prisma = getPrismaClient(); const where = tenantId ? { userId, OR: [{ tenantId }, { tenantId: null }] } : { userId, tenantId: null }; const userRoles = await prisma.userRole.findMany({ where, include: { role: { include: { rolePermissions: { include: { permission: true } } } } }, }); return userRoles.some((userRole) => userRole.role.rolePermissions.some((rp) => rp.permission.key === permissionKey), ); } /** Atalho: usuário tem QUALQUER role com scope PLATFORM (ex.: platform_super_admin). */ export async function isPlatformUser(userId: string): Promise { const prisma = getPrismaClient(); const count = await prisma.userRole.count({ where: { userId, tenantId: null, role: { scope: "PLATFORM" } }, }); return count > 0; }