// Tenant memberships — the M:N glue between users and tenants. // Backend: /api/v1/admin/memberships (admin) + /api/v1/me/tenants (self). import type { ArcadiaClient } from "@crema/arcadia-client" export type MembershipStatus = "active" | "suspended" | "deactivated" | string export interface MembershipUser { id: string email: string first_name: string | null last_name: string | null status: string } export interface MembershipTenant { id: string name: string slug: string status: string } export interface MembershipRole { id: string name: string slug: string } export interface Membership { id: string tenant_id: string tenant: MembershipTenant | null user_id: string user: MembershipUser | null status: MembershipStatus is_primary: boolean joined_at: string | null last_accessed_at: string | null metadata: Record roles: MembershipRole[] } export interface MembershipInput { user_id: string status?: MembershipStatus metadata?: Record role_ids?: string[] } const BASE = "/api/v1/admin/memberships" export async function listMemberships(arcadia: ArcadiaClient): Promise { const res = await arcadia.GET<{ data: Membership[] }>(BASE) return res.data } export async function createMembership( arcadia: ArcadiaClient, input: MembershipInput, ): Promise { const res = await arcadia.POST<{ data: Membership }>(BASE, { body: { membership: input }, }) return res.data } export async function updateMembership( arcadia: ArcadiaClient, id: string, input: Partial, ): Promise { const res = await arcadia.PATCH<{ data: Membership }>(`${BASE}/${id}`, { body: { membership: input }, }) return res.data } export async function deleteMembership(arcadia: ArcadiaClient, id: string): Promise { await arcadia.DELETE(`${BASE}/${id}`) } export async function suspendMembership( arcadia: ArcadiaClient, id: string, ): Promise { const res = await arcadia.POST<{ data: Membership }>(`${BASE}/${id}/suspend`) return res.data } export async function activateMembership( arcadia: ArcadiaClient, id: string, ): Promise { const res = await arcadia.POST<{ data: Membership }>(`${BASE}/${id}/activate`) return res.data }