Files
stack/apps/web/src/lib/api/admin.ts
Jason Woltje 7106512fa9
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
feat(web): add user edit/invite dialogs and workspace member management (MS21-UI-002, MS21-UI-004) (#592)
Co-authored-by: Jason Woltje <jason@diversecanvas.com>
Co-committed-by: Jason Woltje <jason@diversecanvas.com>
2026-03-01 03:54:32 +00:00

100 lines
2.2 KiB
TypeScript

/**
* Admin API Client
* Handles admin user management requests
*/
import type { WorkspaceMemberRole } from "@mosaic/shared";
import { apiGet, apiPatch, apiPost, apiDelete } from "./client";
export interface AdminWorkspaceMembership {
workspaceId: string;
workspaceName: string;
role: WorkspaceMemberRole;
joinedAt: string;
}
export interface AdminUser {
id: string;
name: string;
email: string;
emailVerified: boolean;
image: string | null;
createdAt: string;
deactivatedAt: string | null;
isLocalAuth: boolean;
invitedAt: string | null;
invitedBy: string | null;
workspaceMemberships: AdminWorkspaceMembership[];
}
export interface AdminUsersResponse {
data: AdminUser[];
meta: {
total: number;
page: number;
limit: number;
totalPages: number;
};
}
export interface InviteUserDto {
email: string;
name?: string;
workspaceId?: string;
role?: WorkspaceMemberRole;
}
export interface InvitationResponse {
userId: string;
invitationToken: string;
email: string;
invitedAt: string;
}
export interface UpdateUserDto {
name?: string;
email?: string;
deactivatedAt?: string | null;
emailVerified?: boolean;
preferences?: Record<string, unknown>;
}
/**
* Fetch paginated admin users
*/
export async function fetchAdminUsers(page?: number, limit?: number): Promise<AdminUsersResponse> {
const params = new URLSearchParams();
if (page !== undefined) {
params.append("page", String(page));
}
if (limit !== undefined) {
params.append("limit", String(limit));
}
const endpoint = `/api/admin/users${params.toString() ? `?${params.toString()}` : ""}`;
return apiGet<AdminUsersResponse>(endpoint);
}
/**
* Invite a user by email
*/
export async function inviteUser(dto: InviteUserDto): Promise<InvitationResponse> {
return apiPost<InvitationResponse>("/api/admin/users/invite", dto);
}
/**
* Update admin user fields
*/
export async function updateUser(id: string, dto: UpdateUserDto): Promise<AdminUser> {
return apiPatch<AdminUser>(`/api/admin/users/${id}`, dto);
}
/**
* Deactivate a user account
*/
export async function deactivateUser(id: string): Promise<AdminUser> {
return apiDelete<AdminUser>(`/api/admin/users/${id}`);
}