General
Organizations

Permissions

Learn how to use role-based permissions.

Server-side roles check

If you import @workspace/auth/permissions you have following helpers:

  • isOrganizationOwner(userId, organizationId)
  • isOrganizationAdmin(userId, organizationId)
  • isOrganizationMember(userId, organizationId)

You can check the permission for the active organization on the server-side like following:

permission-example.ts
import { getAuthOrganizationContext } from '@workspace/auth/context';
import { isOrganizationAdmin } from '@workspace/auth/permissions';

const ctx = await getAuthOrganizationContext();
const isAdmin = await isOrganizationAdmin(
  ctx.session.user.id,
  ctx.organization.id
);

Please not that you can pass in any userId or organizationId, it doesn't have to be from a session context.

Client-side roles check

The profile object of the getProfile() server-side call returns the active organization permissions:

profile-example.ts
type ActiveOrganizationPermissions = { isOwner: boolean; role: Role };

The values are transient and not cached. Passing the profile object to any client component enables you to do permission checks on the client.

Accessing memberships

On the server-side the context object has all the current user's memberships.

access-user-memberships-server-example.ts
const memberships = ctx.session.user.memberships;

The same pattern for the active's organization memberships.

access-organization-memberships-server-example.ts
const memberships = ctx.organization.memberships;

You can check the active organization memberships on the client using:

access-organization-memberships-client-example.tsx
'use client';

import { useActiveOrganization } from '~/hooks/use-active-organization';

export function ClientComponent() {
  const activeOrganization = useActiveOrganization();
  const memberships = activeOrganization.memberships;
}