Skip to content

Commit 2b1e9fa

Browse files
committed
Add defensive createdAt insertion on frontend
Add ensureCreatedAt() helper that defaults to 2025-01-01 if backend violates the createdAt guarantee. Applied to all metadata loading paths: - workspace.list() - workspace.onMetadata() updates - workspace.getInfo() after rename - workspace fork switch event This prevents crashes if backend contract is violated.
1 parent 1368b69 commit 2b1e9fa

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/App.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,14 @@ function AppInner() {
639639
return;
640640
}
641641

642+
// DEFENSIVE: Ensure createdAt exists
643+
if (!workspaceInfo.createdAt) {
644+
console.warn(
645+
`[Frontend] Workspace ${workspaceInfo.id} missing createdAt in fork switch - using default (2025-01-01)`
646+
);
647+
workspaceInfo.createdAt = "2025-01-01T00:00:00.000Z";
648+
}
649+
642650
// Update metadata Map immediately (don't wait for async metadata event)
643651
// This ensures the title bar effect has the workspace name available
644652
setWorkspaceMetadata((prev) => {

src/hooks/useWorkspaceManagement.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,20 @@ interface UseWorkspaceManagementProps {
1010
onSelectedWorkspaceUpdate: (workspace: WorkspaceSelection | null) => void;
1111
}
1212

13+
/**
14+
* Ensure workspace metadata has createdAt timestamp.
15+
* DEFENSIVE: Backend guarantees createdAt, but default to 2025-01-01 if missing.
16+
* This prevents crashes if backend contract is violated.
17+
*/
18+
function ensureCreatedAt(metadata: FrontendWorkspaceMetadata): void {
19+
if (!metadata.createdAt) {
20+
console.warn(
21+
`[Frontend] Workspace ${metadata.id} missing createdAt - using default (2025-01-01)`
22+
);
23+
metadata.createdAt = "2025-01-01T00:00:00.000Z";
24+
}
25+
}
26+
1327
/**
1428
* Hook to manage workspace operations (create, remove, rename, list)
1529
*/
@@ -28,6 +42,7 @@ export function useWorkspaceManagement({
2842
const metadataList = await window.api.workspace.list();
2943
const metadataMap = new Map();
3044
for (const metadata of metadataList) {
45+
ensureCreatedAt(metadata);
3146
// Use stable workspace ID as key (not path, which can change)
3247
metadataMap.set(metadata.id, metadata);
3348
}
@@ -62,6 +77,7 @@ export function useWorkspaceManagement({
6277
// Workspace deleted - remove from map
6378
updated.delete(event.workspaceId);
6479
} else {
80+
ensureCreatedAt(event.metadata);
6581
updated.set(event.workspaceId, event.metadata);
6682
}
6783

@@ -169,6 +185,7 @@ export function useWorkspaceManagement({
169185
// Get updated workspace metadata from backend
170186
const newMetadata = await window.api.workspace.getInfo(newWorkspaceId);
171187
if (newMetadata) {
188+
ensureCreatedAt(newMetadata);
172189
onSelectedWorkspaceUpdate({
173190
projectPath: selectedWorkspace.projectPath,
174191
projectName: newMetadata.projectName,

0 commit comments

Comments
 (0)