133 lines
3.6 KiB
TypeScript
133 lines
3.6 KiB
TypeScript
/**
|
|
* 工作空间相关 API
|
|
*/
|
|
import apiClient from './client';
|
|
|
|
export interface Workspace {
|
|
id: string;
|
|
workspace_id: string;
|
|
name: string;
|
|
owner_user_id?: string;
|
|
subscription_plan: 'free' | 'pro' | 'enterprise';
|
|
subscription_status: 'active' | 'inactive' | 'expired';
|
|
created_at?: string;
|
|
max_projects?: number;
|
|
max_storage_gb?: number;
|
|
used_storage_gb?: number;
|
|
member_count?: number;
|
|
user_role?: string;
|
|
}
|
|
|
|
export interface CreateWorkspaceRequest {
|
|
name: string;
|
|
subscription_plan?: 'free' | 'pro' | 'enterprise';
|
|
}
|
|
|
|
export interface WorkspaceMember {
|
|
id: string;
|
|
member_id: string;
|
|
user_id: string;
|
|
email: string;
|
|
username: string;
|
|
display_name?: string;
|
|
role: 'owner' | 'admin' | 'member' | 'viewer';
|
|
joined_at: string;
|
|
}
|
|
|
|
export interface InviteMemberRequest {
|
|
email: string;
|
|
role: 'admin' | 'member' | 'viewer';
|
|
}
|
|
|
|
export interface InviteMemberResponse {
|
|
invitation_id: string;
|
|
invitee_email: string;
|
|
role: 'admin' | 'member' | 'viewer';
|
|
expires_at: string;
|
|
}
|
|
|
|
type WorkspaceApiResponse = Omit<Workspace, 'id' | 'workspace_id'> & {
|
|
id?: string;
|
|
workspace_id?: string;
|
|
};
|
|
|
|
type WorkspaceMemberApiResponse = Omit<WorkspaceMember, 'id' | 'member_id'> & {
|
|
id?: string;
|
|
member_id?: string;
|
|
};
|
|
|
|
const normalizeWorkspace = (workspace: WorkspaceApiResponse): Workspace => {
|
|
const workspaceId = workspace.id || workspace.workspace_id || '';
|
|
return {
|
|
...workspace,
|
|
id: workspaceId,
|
|
workspace_id: workspaceId,
|
|
subscription_status: workspace.subscription_status || 'active',
|
|
};
|
|
};
|
|
|
|
const normalizeMember = (member: WorkspaceMemberApiResponse): WorkspaceMember => {
|
|
const memberId = member.member_id || member.id || '';
|
|
return {
|
|
...member,
|
|
id: member.user_id || memberId,
|
|
member_id: memberId,
|
|
};
|
|
};
|
|
|
|
export const getWorkspaces = async (): Promise<Workspace[]> => {
|
|
const response = await apiClient.get('/workspaces');
|
|
const payload = response.data;
|
|
const workspaces = Array.isArray(payload) ? payload : payload.workspaces || [];
|
|
return workspaces.map(normalizeWorkspace);
|
|
};
|
|
|
|
export const getWorkspace = async (id: string): Promise<Workspace> => {
|
|
const response = await apiClient.get(`/workspaces/${id}`);
|
|
return normalizeWorkspace(response.data);
|
|
};
|
|
|
|
export const createWorkspace = async (
|
|
data: CreateWorkspaceRequest
|
|
): Promise<Workspace> => {
|
|
const response = await apiClient.post('/workspaces', data);
|
|
return normalizeWorkspace(response.data);
|
|
};
|
|
|
|
export const getMembers = async (workspaceId: string): Promise<WorkspaceMember[]> => {
|
|
const response = await apiClient.get(`/workspaces/${workspaceId}/members`);
|
|
const payload = response.data;
|
|
const members = Array.isArray(payload) ? payload : payload.members || [];
|
|
return members.map(normalizeMember);
|
|
};
|
|
|
|
export const inviteMember = async (
|
|
workspaceId: string,
|
|
data: InviteMemberRequest
|
|
): Promise<InviteMemberResponse> => {
|
|
const response = await apiClient.post(`/workspaces/${workspaceId}/members/invite`, data);
|
|
return response.data;
|
|
};
|
|
|
|
export const removeMember = async (
|
|
workspaceId: string,
|
|
memberId: string
|
|
): Promise<void> => {
|
|
await apiClient.delete(`/workspaces/${workspaceId}/members/${memberId}`);
|
|
};
|
|
|
|
export const updateMemberRole = async (
|
|
workspaceId: string,
|
|
memberId: string,
|
|
role: 'admin' | 'member' | 'viewer'
|
|
): Promise<{ user_id: string; old_role: string; new_role: string }> => {
|
|
const response = await apiClient.patch(`/workspaces/${workspaceId}/members/${memberId}/role`, {
|
|
role,
|
|
});
|
|
return response.data;
|
|
};
|
|
|
|
export const leaveWorkspace = async (_workspaceId: string): Promise<{ message: string }> => {
|
|
throw new Error('主动退出工作空间暂未开放');
|
|
};
|