fix(web): normalize workspace api responses

This commit is contained in:
Xiaoxia AI
2026-06-21 16:43:49 +08:00
parent 3680888d36
commit 9f7fe35cf1
3 changed files with 53 additions and 8 deletions
+47 -6
View File
@@ -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<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.id || member.member_id || member.user_id || '';
return {
...member,
id: memberId,
member_id: memberId,
};
};
export const getWorkspaces = async (): Promise<Workspace[]> => {
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<Workspace> => {
const response = await apiClient.get(`/workspaces/${id}`);
return response.data;
return normalizeWorkspace(response.data);
};
export const createWorkspace = async (
data: CreateWorkspaceRequest
): Promise<Workspace> => {
const response = await apiClient.post('/workspaces', data);
return response.data;
return normalizeWorkspace(response.data);
};
export const getMembers = async (workspaceId: string): Promise<WorkspaceMember[]> => {
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 (
@@ -56,7 +56,9 @@ const WorkspaceDetail: React.FC = () => {
<Descriptions.Item label="订阅计划">{workspace.subscription_plan}</Descriptions.Item>
<Descriptions.Item label="状态">{workspace.subscription_status}</Descriptions.Item>
<Descriptions.Item label="创建时间">
{new Date(workspace.created_at).toLocaleDateString()}
{workspace.created_at
? new Date(workspace.created_at).toLocaleDateString()
: '暂未返回'}
</Descriptions.Item>
</Descriptions>
</Card>
@@ -46,7 +46,9 @@ const WorkspaceList: React.FC = () => {
<TeamOutlined />
</div>
<div style={{ color: '#999', fontSize: '12px' }}>
{new Date(workspace.created_at).toLocaleDateString()}
{workspace.created_at
? `创建于 ${new Date(workspace.created_at).toLocaleDateString()}`
: '创建时间暂未返回'}
</div>
</Space>
</Card>