/** * 工作空间相关 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 & { id?: string; workspace_id?: string; }; type WorkspaceMemberApiResponse = Omit & { 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 => { 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 => { const response = await apiClient.get(`/workspaces/${id}`); return normalizeWorkspace(response.data); }; export const createWorkspace = async ( data: CreateWorkspaceRequest ): Promise => { const response = await apiClient.post('/workspaces', data); return normalizeWorkspace(response.data); }; export const getMembers = async (workspaceId: string): Promise => { 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 => { const response = await apiClient.post(`/workspaces/${workspaceId}/members/invite`, data); return response.data; }; export const removeMember = async ( workspaceId: string, memberId: string ): Promise => { 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('主动退出工作空间暂未开放'); };