/home/techb158/balavpn.abdallabala.com/src/lib
NameSizeModeActions
api-client.js10120644editdlrm
crypto.js16760644editdlrm
email.js21750644editdlrm
http.js5630644editdlrm
idempotency.js5700644editdlrm
metrics.js10610644editdlrm
oidc.js17300644editdlrm
prisma.js2800644editdlrm
rate-limit.js26620644editdlrm
redis.js35170644editdlrm
request-context.js37250644editdlrm
tenant-guard.js14270644editdlrm
Edit: /home/techb158/balavpn.abdallabala.com/src/lib/tenant-guard.js (1427B)
const { prisma } = require("./prisma"); const { hasPermission, canAccessWorkspace } = require("../domain/permissions"); async function getProjectScope(projectId) { const project = await prisma.project.findUnique({ where: { id: projectId }, include: { workspace: { include: { organization: true } } } }); if (!project) { const error = new Error(`Project not found: ${projectId}`); error.status = 404; throw error; } return project; } async function requireProjectAccess(actor, projectId, permission = "project:read") { const project = await getProjectScope(projectId); const membership = actor.memberships.find(item => item.organizationId === project.workspace.organizationId && item.status === "ACTIVE"); if (!membership) { const error = new Error("Actor cannot access this project's organization."); error.status = 403; throw error; } if (!hasPermission(membership.role.permissions, permission)) { const error = new Error(`Permission denied: ${permission}`); error.status = 403; throw error; } if (!canAccessWorkspace(membership, project.workspaceId)) { const error = new Error("Actor cannot access this workspace."); error.status = 403; throw error; } return { project, membership, organization: project.workspace.organization }; } module.exports = { getProjectScope, requireProjectAccess };