From 9f7fe35cf15833ecde340f09befa6e74c47e577e Mon Sep 17 00:00:00 2001 From: Xiaoxia AI Date: Sun, 21 Jun 2026 16:43:49 +0800 Subject: [PATCH] fix(web): normalize workspace api responses --- apps/web/src/api/workspace.ts | 53 ++++++++++++++++--- .../src/pages/workspace/WorkspaceDetail.tsx | 4 +- .../web/src/pages/workspace/WorkspaceList.tsx | 4 +- 3 files changed, 53 insertions(+), 8 deletions(-) diff --git a/apps/web/src/api/workspace.ts b/apps/web/src/api/workspace.ts index f869ab3ef..5cdc9cc4d 100644 --- a/apps/web/src/api/workspace.ts +++ b/apps/web/src/api/workspace.ts @@ -5,11 +5,17 @@ import apiClient from './client'; export interface Workspace { id: string; + workspace_id: string; name: string; - owner_user_id: string; + owner_user_id?: string; subscription_plan: 'free' | 'pro' | 'enterprise'; subscription_status: 'active' | 'inactive' | 'expired'; - created_at: string; + created_at?: string; + max_projects?: number; + max_storage_gb?: number; + used_storage_gb?: number; + member_count?: number; + user_role?: string; } export interface CreateWorkspaceRequest { @@ -19,9 +25,11 @@ export interface CreateWorkspaceRequest { 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; } @@ -31,26 +39,59 @@ export interface InviteMemberRequest { role: 'admin' | 'member' | 'viewer'; } +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.id || member.member_id || member.user_id || ''; + return { + ...member, + id: memberId, + member_id: memberId, + }; +}; + export const getWorkspaces = async (): Promise => { const response = await apiClient.get('/workspaces'); - return response.data; + 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 response.data; + return normalizeWorkspace(response.data); }; export const createWorkspace = async ( data: CreateWorkspaceRequest ): Promise => { const response = await apiClient.post('/workspaces', data); - return response.data; + return normalizeWorkspace(response.data); }; export const getMembers = async (workspaceId: string): Promise => { const response = await apiClient.get(`/workspaces/${workspaceId}/members`); - return response.data; + const payload = response.data; + const members = Array.isArray(payload) ? payload : payload.members || []; + return members.map(normalizeMember); }; export const inviteMember = async ( diff --git a/apps/web/src/pages/workspace/WorkspaceDetail.tsx b/apps/web/src/pages/workspace/WorkspaceDetail.tsx index dc86ad6d7..80bd06c5d 100644 --- a/apps/web/src/pages/workspace/WorkspaceDetail.tsx +++ b/apps/web/src/pages/workspace/WorkspaceDetail.tsx @@ -56,7 +56,9 @@ const WorkspaceDetail: React.FC = () => { {workspace.subscription_plan} {workspace.subscription_status} - {new Date(workspace.created_at).toLocaleDateString()} + {workspace.created_at + ? new Date(workspace.created_at).toLocaleDateString() + : '暂未返回'} diff --git a/apps/web/src/pages/workspace/WorkspaceList.tsx b/apps/web/src/pages/workspace/WorkspaceList.tsx index 6f8d7ab6d..2da6e8f05 100644 --- a/apps/web/src/pages/workspace/WorkspaceList.tsx +++ b/apps/web/src/pages/workspace/WorkspaceList.tsx @@ -46,7 +46,9 @@ const WorkspaceList: React.FC = () => { 成员数量
- 创建于 {new Date(workspace.created_at).toLocaleDateString()} + {workspace.created_at + ? `创建于 ${new Date(workspace.created_at).toLocaleDateString()}` + : '创建时间暂未返回'}