Files
mic-check/src/admin/src/api/organizations.ts
James Wampler 0531e1943f Add primary organization flag with auto-selection on dashboard
Adds IsPrimary to OrganizationUser (per-user flag, one primary per user).
First org created is automatically set as primary. Selecting a different
org via the UI calls PUT /organisations/{id}/primary to persist the choice
server-side. Dashboard auto-selects: localStorage org (refreshed) →
primary org → single org when no explicit selection exists.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 10:00:09 -07:00

88 lines
3.0 KiB
TypeScript
Executable File

import apiClient from './client';
import type {
OrganizationResponse,
CreateOrganizationRequest,
UpdateOrganizationRequest,
OrganizationMemberResponse,
InviteUserRequest,
InviteUsersByEmailRequest,
InviteByEmailResult,
InviteTokenResponse,
PaginatedResponse,
} from '@/types/api';
export async function listOrganizations(page = 1, pageSize = 100): Promise<OrganizationResponse[]> {
const { data } = await apiClient.get<PaginatedResponse<OrganizationResponse>>(
'/v1/organisations',
{ params: { page, pageSize } },
);
return data.results;
}
export async function getOrganization(id: number): Promise<OrganizationResponse> {
const { data } = await apiClient.get<OrganizationResponse>(`/v1/organisations/${id}`);
return data;
}
export async function createOrganization(request: CreateOrganizationRequest): Promise<OrganizationResponse> {
const { data } = await apiClient.post<OrganizationResponse>('/v1/organisations', request);
return data;
}
export async function updateOrganization(id: number, request: UpdateOrganizationRequest): Promise<OrganizationResponse> {
const { data } = await apiClient.put<OrganizationResponse>(`/v1/organisations/${id}`, request);
return data;
}
export async function deleteOrganization(id: number): Promise<void> {
await apiClient.delete(`/v1/organisations/${id}`);
}
export async function listOrganizationMembers(organizationId: number): Promise<OrganizationMemberResponse[]> {
const { data } = await apiClient.get<OrganizationMemberResponse[]>(
`/v1/organisations/${organizationId}/users`,
);
return data;
}
export async function inviteOrganizationMember(organizationId: number, request: InviteUserRequest): Promise<void> {
await apiClient.post(`/v1/organisations/${organizationId}/users/invite`, request);
}
export async function removeOrganizationMember(organizationId: number, userId: number): Promise<void> {
await apiClient.delete(`/v1/organisations/${organizationId}/users/${userId}`);
}
export async function inviteOrganizationMembersByEmail(
organizationId: number,
request: InviteUsersByEmailRequest,
): Promise<InviteByEmailResult[]> {
const { data } = await apiClient.post<InviteByEmailResult[]>(
`/v1/organisations/${organizationId}/users/invite-by-email`,
request,
);
return data;
}
export async function getInviteLink(organizationId: number): Promise<InviteTokenResponse> {
const { data } = await apiClient.get<InviteTokenResponse>(
`/v1/organisations/${organizationId}/invite-link`,
);
return data;
}
export async function regenerateInviteLink(organizationId: number): Promise<InviteTokenResponse> {
const { data } = await apiClient.post<InviteTokenResponse>(
`/v1/organisations/${organizationId}/invite-link/regenerate`,
);
return data;
}
export async function acceptInvite(token: string): Promise<void> {
await apiClient.post(`/v1/organisations/invite/${token}/accept`);
}
export async function setPrimaryOrganization(id: number): Promise<void> {
await apiClient.put(`/v1/organisations/${id}/primary`);
}