@allbluecn/web-app 0.22.4 → 0.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -14
- package/src/__tests__/integration/login-email-acceptance.test.ts +16 -0
- package/src/__tests__/story-view.test.ts +33 -1
- package/src/components/agents/__tests__/agent-bindings-tab.test.tsx +221 -0
- package/src/components/agents/__tests__/agents-page.test.tsx +284 -0
- package/src/components/agents/agent-bindings-tab.tsx +59 -45
- package/src/components/agents/agent-form-dialog.tsx +3 -3
- package/src/components/agents/agent-selector.tsx +2 -3
- package/src/components/agents/agents-page.tsx +66 -31
- package/src/components/agents/slash-skill-menu.tsx +2 -3
- package/src/components/auth/__tests__/session-guard.test.tsx +74 -0
- package/src/components/auth/session-guard.tsx +8 -0
- package/src/components/billing/login-prompt-dialog.tsx +1 -1
- package/src/components/billing/subscription-provider.tsx +2 -16
- package/src/components/bug/__tests__/peek-modes.test.tsx +8 -0
- package/src/components/bug/__tests__/subgroup-header.test.tsx +202 -40
- package/src/components/bug/peek-panel.tsx +5 -3
- package/src/components/bug/views/bug-list/group.tsx +12 -2
- package/src/components/bug/views/bug-list/index.tsx +94 -67
- package/src/components/command/command-palette.tsx +10 -9
- package/src/components/design/canvas/document/frame-custom-presets.ts +9 -1
- package/src/components/design/canvas/panels/toolbar.tsx +21 -22
- package/src/components/design/canvas/react/__tests__/canvas-context-load-echo.test.tsx +199 -0
- package/src/components/design/canvas/react/__tests__/hooks.test.tsx +17 -3
- package/src/components/design/canvas/react/canvas-context.tsx +47 -26
- package/src/components/design/canvas/react/hooks.ts +39 -34
- package/src/components/design/editor/layout/__tests__/collab-param-wiring.test.tsx +17 -0
- package/src/components/design/editor/layout/__tests__/context-menu.test.tsx +17 -1
- package/src/components/design/editor/layout/__tests__/no-page-save-toast.test.tsx +17 -0
- package/src/components/design/editor/layout/__tests__/persistence-restore.test.tsx +17 -1
- package/src/components/design/editor/layout/__tests__/ssr-localstorage-smoke.test.tsx +17 -1
- package/src/components/design/editor/layout/design-editor-layout.tsx +13 -2
- package/src/components/design/editor/layout/hooks/use-design-auto-save.ts +3 -19
- package/src/components/devtools/devtools-panel.tsx +56 -0
- package/src/components/forms/__tests__/create-app-form.test.tsx +131 -0
- package/src/components/forms/app-field-error.tsx +21 -1
- package/src/components/forms/app-field.tsx +8 -8
- package/src/components/forms/app-submit.tsx +12 -9
- package/src/components/forms/create-app-form.tsx +124 -0
- package/src/components/forms/index.ts +2 -3
- package/src/components/harness/__tests__/gallery-behavior.test.tsx +37 -1
- package/src/components/harness/__tests__/harness-workbench-first-send.test.tsx +4 -1
- package/src/components/harness/__tests__/message-actions.test.tsx +7 -6
- package/src/components/harness/__tests__/use-video-generation.test.tsx +165 -0
- package/src/components/harness/ai-chat-history/index.tsx +5 -3
- package/src/components/harness/gallery/gallery-card.tsx +57 -35
- package/src/components/harness/gallery/gallery-grid.tsx +32 -15
- package/src/components/harness/gallery/gallery-types.ts +19 -0
- package/src/components/harness/gallery/gallery-video-card.tsx +54 -0
- package/src/components/harness/gallery/types.ts +2 -0
- package/src/components/harness/gallery/use-video-generation.ts +95 -0
- package/src/components/harness/harness-workbench-page.tsx +2 -3
- package/src/components/harness/message-actions.tsx +5 -3
- package/src/components/hotkeys/shortcuts-panel.tsx +28 -13
- package/src/components/iteration/__tests__/burndown-chart.test.tsx +118 -0
- package/src/components/iteration/burndown-chart.tsx +54 -23
- package/src/components/knowledge/editor/__tests__/knowledge-doc-editor-collab.test.tsx +96 -0
- package/src/components/knowledge/editor/knowledge-doc-editor.tsx +56 -1
- package/src/components/knowledge/editor/mindmap-doc-editor.tsx +12 -0
- package/src/components/knowledge/editor/use-auto-save-channels.ts +3 -1
- package/src/components/layout/sidebar-03/__tests__/nav-workspace.test.tsx +0 -4
- package/src/components/layout/sidebar-03/nav-knowledge.tsx +11 -11
- package/src/components/layout/sidebar-03/nav-main.tsx +12 -15
- package/src/components/layout/sidebar-03/nav-notifications.tsx +5 -8
- package/src/components/layout/sidebar-03/nav-workspace.tsx +11 -9
- package/src/components/notifications/__tests__/settings-notifications.test.tsx +158 -0
- package/src/components/notifications/settings-notifications.tsx +37 -13
- package/src/components/notifications/team-notifications.tsx +10 -14
- package/src/components/settings/personal-team/account/__tests__/account-client.test.tsx +170 -0
- package/src/components/settings/personal-team/account/account-client.tsx +44 -7
- package/src/components/settings/personal-team/team/team-client.tsx +17 -19
- package/src/components/shared-kit/list-kit/__tests__/frozen-header.test.ts +210 -41
- package/src/components/shared-kit/list-kit/frozen-header.ts +134 -21
- package/src/components/shared-kit/list-kit/kanban/frozen-header.ts +20 -27
- package/src/components/story/__tests__/peek-panel-patch-sync.test.tsx +8 -0
- package/src/components/story/__tests__/story-list-table.test.tsx +214 -0
- package/src/components/story/columns.tsx +11 -2
- package/src/components/story/peek-panel.tsx +4 -2
- package/src/components/story/story-list-table.tsx +16 -1
- package/src/components/story/views/story-list/__tests__/frozen-headers.test.tsx +186 -0
- package/src/components/story/views/story-list/group.tsx +12 -1
- package/src/components/story/views/story-list/index.tsx +101 -68
- package/src/components/testcase/__tests__/case-row.test.tsx +134 -2
- package/src/components/testcase/__tests__/peek-panel.test.tsx +8 -0
- package/src/components/testcase/__tests__/step-editor.test.tsx +106 -0
- package/src/components/testcase/list/grouped-list.tsx +50 -22
- package/src/components/testcase/peek-panel.tsx +7 -4
- package/src/components/testcase/step-editor.tsx +196 -150
- package/src/components/tiptap/notion-like/editor-extensions.ts +0 -3
- package/src/components/tiptap/notion-like/notion-like-editor-header.tsx +1 -31
- package/src/components/tiptap/notion-like/notion-like-editor.tsx +32 -1
- package/src/components/workspace/__tests__/dialogs/create-workspace-dialog.test.tsx +2 -28
- package/src/components/workspace/__tests__/dialogs/edit-workspace-dialog.test.tsx +2 -28
- package/src/components/workspace/dialogs/create-workspace-dialog.tsx +45 -43
- package/src/components/workspace/dialogs/edit-workspace-dialog.tsx +38 -36
- package/src/design-engine/engine/engine-decor.ts +2 -0
- package/src/design-engine/engine/engine-path.ts +2 -0
- package/src/hooks/__tests__/use-unsaved-guard.test.tsx +180 -0
- package/src/hooks/use-notifications.ts +9 -16
- package/src/hooks/use-unsaved-guard.tsx +87 -0
- package/src/lib/__tests__/pacer.test.ts +33 -96
- package/src/lib/__tests__/query-defaults.test.ts +169 -0
- package/src/lib/__tests__/query-global-error.test.ts +256 -0
- package/src/lib/anyhub/anyhub-store.ts +2 -2
- package/src/lib/changelog/sdk-versions.ts +2 -10
- package/src/lib/collab/presence-store.ts +5 -5
- package/src/lib/collab/use-presence-list-refresh.ts +2 -2
- package/src/lib/collab/use-share-presence.ts +2 -2
- package/src/lib/collections/query-keys.ts +7 -2
- package/src/lib/commands/__tests__/command-palette-state.test.ts +12 -14
- package/src/lib/commands/__tests__/registry.test.ts +6 -3
- package/src/lib/commands/command-palette-state.ts +8 -31
- package/src/lib/hotkeys/__tests__/registry.test.ts +71 -18
- package/src/lib/hotkeys/registry.ts +188 -85
- package/src/lib/hotkeys/types.ts +1 -13
- package/src/lib/pacer.ts +1 -79
- package/src/lib/queries/README.md +67 -0
- package/src/lib/queries/__tests__/agents-queries.test.ts +101 -0
- package/src/lib/queries/__tests__/compliance-queries.test.ts +136 -0
- package/src/lib/queries/__tests__/notifications-queries.test.ts +175 -0
- package/src/lib/queries/__tests__/team-queries.test.ts +87 -0
- package/src/lib/queries/agents.ts +40 -0
- package/src/lib/queries/compliance.ts +69 -0
- package/src/lib/queries/notifications.ts +63 -0
- package/src/lib/queries/team.ts +39 -0
- package/src/lib/query-defaults.ts +8 -0
- package/src/lib/query-global-error.ts +128 -0
- package/src/lib/remote-auth-client.ts +16 -0
- package/src/paraglide/README.md +1 -1
- package/src/paraglide/messages/_index.d.ts +11 -0
- package/src/paraglide/messages/_index.js +5659 -88285
- package/src/paraglide/messages/common_error_generic.d.ts +16 -0
- package/src/paraglide/messages/common_error_generic.js +29 -0
- package/src/paraglide/messages/common_unsaved_body.d.ts +16 -0
- package/src/paraglide/messages/common_unsaved_body.js +29 -0
- package/src/paraglide/messages/common_unsaved_leave.d.ts +16 -0
- package/src/paraglide/messages/common_unsaved_leave.js +29 -0
- package/src/paraglide/messages/common_unsaved_stay.d.ts +16 -0
- package/src/paraglide/messages/common_unsaved_stay.js +29 -0
- package/src/paraglide/messages/common_unsaved_title.d.ts +16 -0
- package/src/paraglide/messages/common_unsaved_title.js +29 -0
- package/src/paraglide/messages/gallery_videofailed1.d.ts +17 -0
- package/src/paraglide/messages/gallery_videofailed1.js +30 -0
- package/src/paraglide/messages/gallery_videogenerating1.d.ts +17 -0
- package/src/paraglide/messages/gallery_videogenerating1.js +30 -0
- package/src/paraglide/messages/gallery_videomissingprompt2.d.ts +17 -0
- package/src/paraglide/messages/gallery_videomissingprompt2.js +30 -0
- package/src/paraglide/messages/gallery_videoprogress1.d.ts +19 -0
- package/src/paraglide/messages/gallery_videoprogress1.js +30 -0
- package/src/paraglide/messages/gallery_videostop1.d.ts +17 -0
- package/src/paraglide/messages/gallery_videostop1.js +30 -0
- package/src/paraglide/messages/story_table_resizecolumn1.d.ts +17 -0
- package/src/paraglide/messages/story_table_resizecolumn1.js +30 -0
- package/src/providers/index.tsx +5 -50
- package/src/routeTree.gen.ts +21 -0
- package/src/router.tsx +21 -8
- package/src/routes/__root.tsx +2 -1
- package/src/routes/__tests__/-edition-routing.test.tsx +6 -1
- package/src/routes/_login/forgot-password/route.lazy.tsx +7 -6
- package/src/routes/_login/login/route.lazy.tsx +10 -9
- package/src/routes/_login/register/route.lazy.tsx +19 -18
- package/src/routes/_login/reset-password/route.lazy.tsx +10 -9
- package/src/routes/_nav/knowledge/compliance/$id.lazy.tsx +9 -12
- package/src/routes/_nav/knowledge/compliance/index.lazy.tsx +16 -13
- package/src/routes/_nav/knowledge/laws/$id.lazy.tsx +1 -1
- package/src/routes/_nav/notifications/route.tsx +6 -16
- package/src/routes/_nav/settings/-settings-tabs.tsx +9 -12
- package/src/routes/api/generate/__tests__/media.test.ts +378 -0
- package/src/routes/api/generate/media.ts +179 -0
- package/src/server/__tests__/agent-client-graph.test.ts +0 -1
- package/src/server/__tests__/agent-crud.test.ts +37 -4
- package/src/server/__tests__/bug-groups-two-level.test.ts +34 -1
- package/src/server/__tests__/chat-conversations.test.ts +37 -4
- package/src/server/__tests__/chat-list-messages.test.ts +40 -7
- package/src/server/__tests__/csv-export.test.ts +36 -3
- package/src/server/__tests__/desktop-bootstrap.test.ts +189 -0
- package/src/server/__tests__/remote-auth.test.ts +72 -0
- package/src/server/__tests__/skill-crud.test.ts +37 -4
- package/src/server/__tests__/sso-domain.test.ts +1 -1
- package/src/server/__tests__/sso-rate-limit-singleton.test.ts +123 -0
- package/src/server/__tests__/task-serverfn-crud.test.ts +35 -2
- package/src/server/__tests__/task-serverfn-queries.test.ts +35 -2
- package/src/server/__tests__/testcase-board.test.ts +38 -5
- package/src/server/__tests__/testcase-bulk.test.ts +38 -5
- package/src/server/__tests__/testcase-list-scope.test.ts +38 -5
- package/src/server/ai-gateway/__tests__/ai-output-guard.test.ts +126 -2
- package/src/server/ai-gateway/__tests__/chat-stream-builder-code-mode.test.ts +4 -0
- package/src/server/ai-gateway/__tests__/chat-stream-builder-memory.test.ts +4 -0
- package/src/server/ai-gateway/__tests__/chat-stream-builder-sandbox.test.ts +4 -0
- package/src/server/ai-gateway/__tests__/chat-stream-builder-skills.test.ts +4 -0
- package/src/server/ai-gateway/__tests__/pgvector-memory-adapter.test.ts +30 -0
- package/src/server/ai-gateway/__tests__/pgvector-memory-conformance.test.ts +92 -0
- package/src/server/ai-gateway/__tests__/source-mode.test.ts +49 -8
- package/src/server/ai-gateway/ai-output-guard.ts +50 -2
- package/src/server/ai-gateway/chat-stream-builder.ts +3 -0
- package/src/server/ai-gateway/media/index.ts +36 -29
- package/src/server/ai-gateway/media/trim-input.ts +52 -0
- package/src/server/ai-gateway/memory/pgvector-adapter.ts +27 -13
- package/src/server/ai-gateway/sandbox/__tests__/harness-sandbox.test.ts +252 -41
- package/src/server/ai-gateway/sandbox/harness-sandbox.ts +6 -67
- package/src/server/ai-gateway/source-mode.ts +24 -8
- package/src/server/desktop-bootstrap.ts +74 -0
- package/src/server/lib/__tests__/rate-limit.test.ts +0 -1
- package/src/server/lib/rate-limit.ts +0 -2
- package/src/server/middlewares/__tests__/auth-context.test.ts +156 -0
- package/src/server/middlewares/auth-context.ts +62 -0
- package/src/server/remote-auth.ts +58 -31
- package/src/server/serverFns/__tests__/ai-hosted-models.test.ts +47 -15
- package/src/server/serverFns/__tests__/ai-source-mode.test.ts +45 -15
- package/src/server/serverFns/__tests__/billing.test.ts +37 -2
- package/src/server/serverFns/__tests__/collab-snapshot.test.ts +41 -14
- package/src/server/serverFns/__tests__/collab.test.ts +41 -14
- package/src/server/serverFns/__tests__/compliance.test.ts +33 -1
- package/src/server/serverFns/__tests__/email-verification.test.ts +35 -1
- package/src/server/serverFns/__tests__/knowledge-breadcrumb.test.ts +46 -6
- package/src/server/serverFns/__tests__/knowledge-delete.test.ts +42 -14
- package/src/server/serverFns/__tests__/knowledge-kb-projects.test.ts +46 -6
- package/src/server/serverFns/__tests__/knowledge-public-compliance.test.ts +36 -2
- package/src/server/serverFns/__tests__/knowledge-readable-kb.test.ts +42 -10
- package/src/server/serverFns/__tests__/knowledge-search.test.ts +45 -9
- package/src/server/serverFns/__tests__/legal-code-canonical.test.ts +36 -2
- package/src/server/serverFns/__tests__/link-preview.test.ts +38 -4
- package/src/server/serverFns/__tests__/notifications-list.test.ts +36 -3
- package/src/server/serverFns/__tests__/ownership-merge.test.ts +38 -4
- package/src/server/serverFns/__tests__/project-delete-transaction.test.ts +39 -2
- package/src/server/serverFns/__tests__/project-kb.test.ts +34 -1
- package/src/server/serverFns/__tests__/project-member-idor.test.ts +34 -1
- package/src/server/serverFns/__tests__/project-team-assign.test.ts +34 -1
- package/src/server/serverFns/__tests__/read-write-merge.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-comments.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-crud-archive-detail.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-crud-labels-users.test.ts +37 -3
- package/src/server/serverFns/__tests__/story-crud.test.ts +36 -3
- package/src/server/serverFns/__tests__/story-links.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-reactions.test.ts +38 -4
- package/src/server/serverFns/__tests__/story-tree.test.ts +38 -4
- package/src/server/serverFns/__tests__/team-accept.test.ts +34 -1
- package/src/server/serverFns/__tests__/team-invitation.test.ts +34 -1
- package/src/server/serverFns/__tests__/team-join-request.test.ts +34 -1
- package/src/server/serverFns/__tests__/team-members.test.ts +34 -1
- package/src/server/serverFns/__tests__/team-ownership-merge.test.ts +34 -1
- package/src/server/serverFns/__tests__/update-bug-guard.test.ts +37 -3
- package/src/server/serverFns/__tests__/update-document-guard.test.ts +38 -4
- package/src/server/serverFns/__tests__/update-page-guard.test.ts +40 -4
- package/src/server/serverFns/__tests__/update-seats.test.ts +33 -1
- package/src/server/serverFns/__tests__/update-story-guard.test.ts +36 -3
- package/src/server/serverFns/__tests__/update-testcase-guard.test.ts +37 -3
- package/src/server/serverFns/__tests__/workspace-kb-idor.test.ts +36 -2
- package/src/server/serverFns/__tests__/workspace-kb.test.ts +36 -2
- package/src/server/serverFns/__tests__/workspace.test.ts +34 -1
- package/src/server/serverFns/activity.ts +10 -14
- package/src/server/serverFns/agents/agent-crud.ts +16 -15
- package/src/server/serverFns/agents/bindings.ts +12 -13
- package/src/server/serverFns/agents/skill-crud.ts +16 -15
- package/src/server/serverFns/ai/code-mode-readiness.ts +3 -4
- package/src/server/serverFns/ai/search-capability.ts +3 -4
- package/src/server/serverFns/anyhub/app.ts +10 -14
- package/src/server/serverFns/anyhub/index.ts +7 -10
- package/src/server/serverFns/anyhub/install.ts +4 -4
- package/src/server/serverFns/anyhub/permissions.ts +10 -14
- package/src/server/serverFns/anyhub/proxy.ts +4 -6
- package/src/server/serverFns/auth/email-verification.ts +4 -5
- package/src/server/serverFns/auth/session.ts +9 -0
- package/src/server/serverFns/billing.ts +18 -28
- package/src/server/serverFns/blob-upload.ts +6 -9
- package/src/server/serverFns/bug/__tests__/bug-access-tokens.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-activities.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-comments.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-crud.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-fix.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-groups.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-reactions.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-reorder.test.ts +39 -5
- package/src/server/serverFns/bug/__tests__/bug-repro.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-story.test.ts +34 -1
- package/src/server/serverFns/bug/__tests__/bug-webhooks.test.ts +34 -1
- package/src/server/serverFns/bug/bug-access-tokens.ts +16 -22
- package/src/server/serverFns/bug/bug-activities.ts +4 -6
- package/src/server/serverFns/bug/bug-collect-tokens.ts +13 -18
- package/src/server/serverFns/bug/bug-comments.ts +13 -18
- package/src/server/serverFns/bug/bug-crud/detail.ts +10 -14
- package/src/server/serverFns/bug/bug-crud.ts +28 -38
- package/src/server/serverFns/bug/bug-display-options.ts +8 -11
- package/src/server/serverFns/bug/bug-export.ts +5 -7
- package/src/server/serverFns/bug/bug-fix.ts +10 -14
- package/src/server/serverFns/bug/bug-groups.ts +10 -14
- package/src/server/serverFns/bug/bug-reactions.ts +10 -14
- package/src/server/serverFns/bug/bug-reorder.ts +4 -6
- package/src/server/serverFns/bug/bug-repro.ts +8 -11
- package/src/server/serverFns/bug/bug-story-bulk.ts +13 -18
- package/src/server/serverFns/bug/bug-story.ts +10 -14
- package/src/server/serverFns/bug/bug-views.ts +12 -18
- package/src/server/serverFns/bug/bug-webhooks.ts +13 -18
- package/src/server/serverFns/bug/test-bug-confirm.ts +7 -10
- package/src/server/serverFns/changelog/__tests__/fetch.test.ts +40 -1
- package/src/server/serverFns/changelog/fetch.ts +4 -6
- package/src/server/serverFns/chat/conversations.ts +17 -28
- package/src/server/serverFns/chat/list-messages.ts +4 -7
- package/src/server/serverFns/collab-presence.ts +11 -13
- package/src/server/serverFns/collab-snapshot.ts +6 -7
- package/src/server/serverFns/collab.ts +7 -7
- package/src/server/serverFns/compliance.ts +8 -8
- package/src/server/serverFns/design/__tests__/comments.test.ts +54 -10
- package/src/server/serverFns/design/__tests__/designs.test.ts +39 -16
- package/src/server/serverFns/design/__tests__/page-versions.test.ts +52 -14
- package/src/server/serverFns/design/__tests__/shares-password.test.ts +44 -14
- package/src/server/serverFns/design/__tests__/shares.test.ts +44 -14
- package/src/server/serverFns/design/__tests__/versions.test.ts +44 -14
- package/src/server/serverFns/design/ai/__tests__/agent-conversations.test.ts +50 -21
- package/src/server/serverFns/design/ai/__tests__/providers.test.ts +42 -8
- package/src/server/serverFns/design/ai/agent-conversations.ts +19 -26
- package/src/server/serverFns/design/ai/fill-annotation.ts +5 -7
- package/src/server/serverFns/design/ai/generate-prototype.ts +5 -7
- package/src/server/serverFns/design/ai/hosted-models.ts +4 -5
- package/src/server/serverFns/design/ai/providers.ts +30 -39
- package/src/server/serverFns/design/ai/source-mode.ts +10 -12
- package/src/server/serverFns/design/comments.ts +14 -13
- package/src/server/serverFns/design/designs.ts +13 -19
- package/src/server/serverFns/design/page-versions.ts +17 -18
- package/src/server/serverFns/design/pages.ts +17 -18
- package/src/server/serverFns/design/reviews.ts +8 -9
- package/src/server/serverFns/design/shares-password.ts +13 -19
- package/src/server/serverFns/design/shares.ts +22 -31
- package/src/server/serverFns/design/versions.ts +8 -9
- package/src/server/serverFns/harness/__tests__/attach-prototype.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/attach-to-kb.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/attach-to-story-ssrf.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/attach-to-story.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/cancel-run.test.ts +40 -15
- package/src/server/serverFns/harness/__tests__/extract-attachment.spec.ts +52 -2
- package/src/server/serverFns/harness/__tests__/gallery.spec.ts +76 -12
- package/src/server/serverFns/harness/__tests__/github-workspace.spec.ts +38 -6
- package/src/server/serverFns/harness/__tests__/media-prototype.spec.ts +50 -6
- package/src/server/serverFns/harness/__tests__/media.spec.ts +55 -11
- package/src/server/serverFns/harness/__tests__/sandbox-policy.test.ts +41 -16
- package/src/server/serverFns/harness/__tests__/workspace-files.test.ts +41 -16
- package/src/server/serverFns/harness/attach-prototype.ts +4 -4
- package/src/server/serverFns/harness/attach-to-kb.ts +4 -4
- package/src/server/serverFns/harness/attach-to-story.ts +4 -4
- package/src/server/serverFns/harness/cancel-run.ts +4 -6
- package/src/server/serverFns/harness/extract-attachment.ts +3 -4
- package/src/server/serverFns/harness/gallery.ts +19 -23
- package/src/server/serverFns/harness/github-workspace.ts +14 -21
- package/src/server/serverFns/harness/media.ts +18 -117
- package/src/server/serverFns/harness/sandbox-policy.ts +11 -10
- package/src/server/serverFns/harness/search-mention-candidates.ts +4 -6
- package/src/server/serverFns/harness/workspace-files.ts +19 -26
- package/src/server/serverFns/iteration/__tests__/iteration-auto-schedule.test.ts +35 -3
- package/src/server/serverFns/iteration/__tests__/iteration-crud.test.ts +35 -3
- package/src/server/serverFns/iteration/__tests__/iteration-stories.test.ts +35 -3
- package/src/server/serverFns/iteration/__tests__/iteration-transfer.test.ts +35 -3
- package/src/server/serverFns/iteration/iteration-auto-schedule.ts +7 -10
- package/src/server/serverFns/iteration/iteration-burndown.ts +4 -6
- package/src/server/serverFns/iteration/iteration-crud.ts +26 -35
- package/src/server/serverFns/iteration/iteration-stories.ts +10 -14
- package/src/server/serverFns/iteration/iteration-transfer.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/categories.ts +11 -15
- package/src/server/serverFns/knowledge/public/bookmarks/create.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/delete.ts +5 -7
- package/src/server/serverFns/knowledge/public/bookmarks/detail.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/favorite.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/list.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/refresh-favicon.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/share.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/sync-github.ts +5 -7
- package/src/server/serverFns/knowledge/public/bookmarks/unshare.ts +4 -6
- package/src/server/serverFns/knowledge/public/bookmarks/update.ts +6 -8
- package/src/server/serverFns/knowledge/public/compliance/create.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/delete.ts +5 -7
- package/src/server/serverFns/knowledge/public/compliance/detail.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/list.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/share.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/unshare.ts +4 -6
- package/src/server/serverFns/knowledge/public/compliance/update.ts +5 -7
- package/src/server/serverFns/knowledge/public/dictionary/create.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/delete.ts +5 -7
- package/src/server/serverFns/knowledge/public/dictionary/detail.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/list.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/share.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/unshare.ts +4 -6
- package/src/server/serverFns/knowledge/public/dictionary/update.ts +5 -7
- package/src/server/serverFns/knowledge/public/entity-tags.ts +4 -6
- package/src/server/serverFns/knowledge/public/favorite.ts +7 -10
- package/src/server/serverFns/knowledge/public/legal/create.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/delete.ts +5 -7
- package/src/server/serverFns/knowledge/public/legal/detail.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/list.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/share.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/unshare.ts +4 -6
- package/src/server/serverFns/knowledge/public/legal/update.ts +5 -7
- package/src/server/serverFns/knowledge-index.ts +12 -16
- package/src/server/serverFns/knowledge.ts +50 -67
- package/src/server/serverFns/notifications.ts +25 -34
- package/src/server/serverFns/plugins/harness-plugins.ts +16 -23
- package/src/server/serverFns/project/module-overview.ts +7 -10
- package/src/server/serverFns/project.ts +48 -68
- package/src/server/serverFns/references/create.ts +4 -6
- package/src/server/serverFns/references/resolve.ts +4 -6
- package/src/server/serverFns/references/search.ts +4 -6
- package/src/server/serverFns/share/design/[designId]/events.ts +4 -6
- package/src/server/serverFns/sso.ts +1 -1
- package/src/server/serverFns/story/__tests__/bulk.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-assoc.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-attachments.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-crud-date-key.test.ts +42 -17
- package/src/server/serverFns/story/__tests__/story-dependencies.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-gantt-deps.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-groups.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-read-path-authz.test.ts +40 -4
- package/src/server/serverFns/story/__tests__/story-search.test.ts +34 -1
- package/src/server/serverFns/story/__tests__/story-transfer.test.ts +34 -1
- package/src/server/serverFns/story/link-preview.ts +5 -7
- package/src/server/serverFns/story/story-assoc.ts +28 -38
- package/src/server/serverFns/story/story-attachments.ts +7 -10
- package/src/server/serverFns/story/story-children.ts +4 -6
- package/src/server/serverFns/story/story-comments.ts +13 -18
- package/src/server/serverFns/story/story-crud/activities.ts +4 -6
- package/src/server/serverFns/story/story-crud/archive.ts +7 -10
- package/src/server/serverFns/story/story-crud/bulk.ts +10 -14
- package/src/server/serverFns/story/story-crud/detail.ts +7 -10
- package/src/server/serverFns/story/story-crud/label-suggest.ts +4 -6
- package/src/server/serverFns/story/story-crud/labels.ts +6 -9
- package/src/server/serverFns/story/story-crud/user-brief.ts +4 -6
- package/src/server/serverFns/story/story-crud.ts +13 -18
- package/src/server/serverFns/story/story-dependencies.ts +16 -22
- package/src/server/serverFns/story/story-groups.ts +10 -14
- package/src/server/serverFns/story/story-links.ts +13 -18
- package/src/server/serverFns/story/story-reactions.ts +13 -18
- package/src/server/serverFns/story/story-search.ts +7 -10
- package/src/server/serverFns/story/story-transfer.ts +10 -14
- package/src/server/serverFns/story/story-tree.ts +7 -10
- package/src/server/serverFns/story-display-options.ts +7 -8
- package/src/server/serverFns/story-view.ts +12 -18
- package/src/server/serverFns/tasks/task-crud.ts +13 -17
- package/src/server/serverFns/tasks/task-queries.ts +12 -18
- package/src/server/serverFns/team.ts +46 -66
- package/src/server/serverFns/testcase/__tests__/automation.test.ts +38 -5
- package/src/server/serverFns/testcase/__tests__/evidence-upload.test.ts +37 -3
- package/src/server/serverFns/testcase/__tests__/generation.test.ts +38 -5
- package/src/server/serverFns/testcase/__tests__/plans.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/regression.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/run-cases.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/runs.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/stats.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/testcase-board.test.ts +39 -5
- package/src/server/serverFns/testcase/__tests__/testcase-crud.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/testcase-folders.test.ts +36 -3
- package/src/server/serverFns/testcase/__tests__/testcase-groups.test.ts +38 -5
- package/src/server/serverFns/testcase/automation.ts +13 -17
- package/src/server/serverFns/testcase/bulk.ts +10 -14
- package/src/server/serverFns/testcase/evidence-upload.ts +5 -7
- package/src/server/serverFns/testcase/generation.ts +10 -13
- package/src/server/serverFns/testcase/plans.ts +23 -31
- package/src/server/serverFns/testcase/regression.ts +7 -10
- package/src/server/serverFns/testcase/run-cases.ts +13 -18
- package/src/server/serverFns/testcase/runs.ts +13 -18
- package/src/server/serverFns/testcase/stats.ts +13 -18
- package/src/server/serverFns/testcase/testcase-activities.ts +4 -6
- package/src/server/serverFns/testcase/testcase-board.ts +4 -6
- package/src/server/serverFns/testcase/testcase-crud.ts +20 -27
- package/src/server/serverFns/testcase/testcase-display-options.ts +8 -11
- package/src/server/serverFns/testcase/testcase-export.ts +5 -7
- package/src/server/serverFns/testcase/testcase-filter-views.ts +12 -18
- package/src/server/serverFns/testcase/testcase-folders.ts +16 -22
- package/src/server/serverFns/testcase/testcase-groups.ts +4 -6
- package/src/server/serverFns/testcase/testcase-reorder.ts +4 -6
- package/src/server/serverFns/translation.ts +4 -6
- package/src/server/serverFns/user/avatar.ts +4 -6
- package/src/server/serverFns/user/settings.ts +4 -6
- package/src/server/serverFns/user/update-locale.ts +4 -6
- package/src/server/serverFns/workspace-kb.ts +26 -35
- package/src/server/serverFns/workspace.ts +43 -59
- package/src/server/serverFns/ws.ts +4 -6
- package/src/server/serverfn-public-allowlist.ts +117 -0
- package/src/server/story/types.ts +0 -1
- package/src/server/sync/__tests__/scopes.test.ts +64 -0
- package/src/server/sync/scopes.ts +7 -0
- package/src/server/testcase/__tests__/auto-bug.test.ts +44 -12
- package/src/__tests__/bench/baselines/format-timestamp.json +0 -44
- package/src/__typeprobe__.d.ts +0 -4
- package/src/components/forms/app-form-dialog.tsx +0 -126
- package/src/components/forms/hooks/use-form-submit.ts +0 -57
- package/src/components/forms/types.ts +0 -34
- package/src/components/harness/code/workspace-picker.tsx +0 -239
- package/src/components/tiptap/extensions/local-file/insert-local-file.ts +0 -35
- package/src/components/tiptap/extensions/local-file/local-file-node.ts +0 -71
- package/src/devframe-docks/ai-chat-iframe.tsx +0 -29
- package/src/devframe-docks/session-iframe.tsx +0 -90
- package/src/lib/__tests__/desktop-detect.test.ts +0 -19
- package/src/lib/collections/index.ts +0 -22
- package/src/lib/collections/knowledge/index.ts +0 -18
- package/src/lib/collections/knowledge/knowledge-bases-collection.ts +0 -34
- package/src/lib/collections/reference/bookmark-categories-collection.ts +0 -31
- package/src/lib/collections/reference/labels-collection.ts +0 -31
- package/src/lib/collections/reference/projects-collection.ts +0 -31
- package/src/lib/collections/reference/users-brief-collection.ts +0 -35
- package/src/lib/collections/reference/workspaces-collection.ts +0 -34
- package/src/lib/desktop-detect.ts +0 -29
- package/src/paraglide/messages/en.js +0 -28260
- package/src/paraglide/messages/zh.js +0 -28258
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { ACTIVITY_SELECT, toActivityItem } from "@/server/story/types";
|
|
24
23
|
import { buildKbScopeWhere } from "./kb-scope";
|
|
25
24
|
import {
|
|
@@ -48,12 +47,11 @@ import { assertStoryProjectMember } from "@/server/story/permissions";
|
|
|
48
47
|
// 批量关联设计(PRD 文档与 UI 画板同源 Design 表,链接统一落 storyDesignLink)。
|
|
49
48
|
// 设计单属主:仅本人未删除设计可关联(口径同 searchDesignsFn),越界 id 归 failed。
|
|
50
49
|
export const linkDesignsFn = createServerFn({ method: "POST" })
|
|
50
|
+
.middleware([authContextMiddleware])
|
|
51
51
|
.validator(z.object({ storyId: z.string(), designIds: z.array(z.string()).min(1) }))
|
|
52
|
-
.handler(async ({ data }) => {
|
|
52
|
+
.handler(async ({ data, context }) => {
|
|
53
53
|
const prisma = await getPrisma()
|
|
54
|
-
const
|
|
55
|
-
const session = await requireAuth(request);
|
|
56
|
-
const userId = session.user.id;
|
|
54
|
+
const userId = context.user.id;
|
|
57
55
|
|
|
58
56
|
await assertStoryProjectMember(data.storyId, userId);
|
|
59
57
|
|
|
@@ -99,12 +97,11 @@ export const linkDesignsFn = createServerFn({ method: "POST" })
|
|
|
99
97
|
});
|
|
100
98
|
|
|
101
99
|
export const unlinkDesignFn = createServerFn({ method: "POST" })
|
|
100
|
+
.middleware([authContextMiddleware])
|
|
102
101
|
.validator(z.object({ storyId: z.string(), designId: z.string() }))
|
|
103
|
-
.handler(async ({ data }) => {
|
|
102
|
+
.handler(async ({ data, context }) => {
|
|
104
103
|
const prisma = await getPrisma()
|
|
105
|
-
const
|
|
106
|
-
const session = await requireAuth(request);
|
|
107
|
-
const userId = session.user.id;
|
|
104
|
+
const userId = context.user.id;
|
|
108
105
|
|
|
109
106
|
await assertStoryProjectMember(data.storyId, userId);
|
|
110
107
|
|
|
@@ -132,12 +129,11 @@ export const unlinkDesignFn = createServerFn({ method: "POST" })
|
|
|
132
129
|
});
|
|
133
130
|
|
|
134
131
|
export const getLinkedDesignsFn = createServerFn({ method: "GET" })
|
|
132
|
+
.middleware([authContextMiddleware])
|
|
135
133
|
.validator(z.object({ storyId: z.string() }))
|
|
136
|
-
.handler(async ({ data }) => {
|
|
134
|
+
.handler(async ({ data, context }) => {
|
|
137
135
|
const prisma = await getPrisma()
|
|
138
|
-
|
|
139
|
-
const session = await requireAuth(request);
|
|
140
|
-
await assertStoryProjectMember(data.storyId, session.user.id);
|
|
136
|
+
await assertStoryProjectMember(data.storyId, context.user.id);
|
|
141
137
|
|
|
142
138
|
const links = await prisma.storyDesignLink.findMany({
|
|
143
139
|
where: { storyId: data.storyId, design: { isDeleted: false } },
|
|
@@ -160,12 +156,11 @@ export const getLinkedDesignsFn = createServerFn({ method: "GET" })
|
|
|
160
156
|
});
|
|
161
157
|
|
|
162
158
|
export const searchDesignsFn = createServerFn({ method: "GET" })
|
|
159
|
+
.middleware([authContextMiddleware])
|
|
163
160
|
.validator(z.object({ query: z.string() }))
|
|
164
|
-
.handler(async ({ data }) => {
|
|
161
|
+
.handler(async ({ data, context }) => {
|
|
165
162
|
const prisma = await getPrisma()
|
|
166
|
-
const
|
|
167
|
-
const session = await requireAuth(request);
|
|
168
|
-
const userId = session.user.id;
|
|
163
|
+
const userId = context.user.id;
|
|
169
164
|
|
|
170
165
|
// Design 单属主(无项目归属),口径同 listDesignsFn / attach-guards:仅返回本人未删除设计
|
|
171
166
|
const prds = await prisma.design.findMany({
|
|
@@ -204,12 +199,11 @@ async function resolveStoryScope(storyId: string, userId: string) {
|
|
|
204
199
|
}
|
|
205
200
|
|
|
206
201
|
export const listStoryAvailableKbsFn = createServerFn({ method: "GET" })
|
|
202
|
+
.middleware([authContextMiddleware])
|
|
207
203
|
.validator(z.object({ storyId: z.string() }))
|
|
208
|
-
.handler(async ({ data }) => {
|
|
204
|
+
.handler(async ({ data, context }) => {
|
|
209
205
|
const prisma = await getPrisma()
|
|
210
|
-
const
|
|
211
|
-
const session = await requireAuth(request);
|
|
212
|
-
const scope = await resolveStoryScope(data.storyId, session.user.id);
|
|
206
|
+
const scope = await resolveStoryScope(data.storyId, context.user.id);
|
|
213
207
|
const kbs = await prisma.knowledgeBase.findMany({
|
|
214
208
|
where: { AND: [scope, { isDeleted: false }] },
|
|
215
209
|
select: { id: true, name: true, icon: true, visibility: true },
|
|
@@ -219,6 +213,7 @@ export const listStoryAvailableKbsFn = createServerFn({ method: "GET" })
|
|
|
219
213
|
});
|
|
220
214
|
|
|
221
215
|
export const searchKbDocsFn = createServerFn({ method: "GET" })
|
|
216
|
+
.middleware([authContextMiddleware])
|
|
222
217
|
.validator(
|
|
223
218
|
z.object({
|
|
224
219
|
storyId: z.string(),
|
|
@@ -228,15 +223,13 @@ export const searchKbDocsFn = createServerFn({ method: "GET" })
|
|
|
228
223
|
cursor: z.string().optional(),
|
|
229
224
|
}),
|
|
230
225
|
)
|
|
231
|
-
.handler(async ({ data }) => {
|
|
226
|
+
.handler(async ({ data, context }) => {
|
|
232
227
|
const prisma = await getPrisma()
|
|
233
|
-
const
|
|
234
|
-
const session = await requireAuth(request);
|
|
235
|
-
const scope = await resolveStoryScope(data.storyId, session.user.id);
|
|
228
|
+
const scope = await resolveStoryScope(data.storyId, context.user.id);
|
|
236
229
|
|
|
237
230
|
if (data.generalGroup) {
|
|
238
231
|
// 态③:通用知识库分组 → 平铺列表(周报月报暂无实体内容)
|
|
239
|
-
const items = await searchGeneralGroupDocs(data.generalGroup,
|
|
232
|
+
const items = await searchGeneralGroupDocs(data.generalGroup, context.user.id, data.query);
|
|
240
233
|
return { items, nextCursor: null };
|
|
241
234
|
}
|
|
242
235
|
|
|
@@ -281,12 +274,11 @@ export const searchKbDocsFn = createServerFn({ method: "GET" })
|
|
|
281
274
|
});
|
|
282
275
|
|
|
283
276
|
export const linkDocsFn = createServerFn({ method: "POST" })
|
|
277
|
+
.middleware([authContextMiddleware])
|
|
284
278
|
.validator(z.object({ storyId: z.string(), docIds: z.array(z.string()).min(1) }))
|
|
285
|
-
.handler(async ({ data }) => {
|
|
279
|
+
.handler(async ({ data, context }) => {
|
|
286
280
|
const prisma = await getPrisma()
|
|
287
|
-
const
|
|
288
|
-
const session = await requireAuth(request);
|
|
289
|
-
const userId = session.user.id;
|
|
281
|
+
const userId = context.user.id;
|
|
290
282
|
await assertStoryProjectMember(data.storyId, userId);
|
|
291
283
|
const scope = await resolveStoryScope(data.storyId, userId);
|
|
292
284
|
|
|
@@ -395,12 +387,11 @@ export const linkDocsFn = createServerFn({ method: "POST" })
|
|
|
395
387
|
});
|
|
396
388
|
|
|
397
389
|
export const unlinkDocFn = createServerFn({ method: "POST" })
|
|
390
|
+
.middleware([authContextMiddleware])
|
|
398
391
|
.validator(z.object({ storyId: z.string(), docId: z.string() }))
|
|
399
|
-
.handler(async ({ data }) => {
|
|
392
|
+
.handler(async ({ data, context }) => {
|
|
400
393
|
const prisma = await getPrisma()
|
|
401
|
-
const
|
|
402
|
-
const session = await requireAuth(request);
|
|
403
|
-
const userId = session.user.id;
|
|
394
|
+
const userId = context.user.id;
|
|
404
395
|
|
|
405
396
|
await assertStoryProjectMember(data.storyId, userId);
|
|
406
397
|
|
|
@@ -431,11 +422,10 @@ export const unlinkDocFn = createServerFn({ method: "POST" })
|
|
|
431
422
|
});
|
|
432
423
|
|
|
433
424
|
export const getLinkedDocsFn = createServerFn({ method: "GET" })
|
|
425
|
+
.middleware([authContextMiddleware])
|
|
434
426
|
.validator(z.object({ storyId: z.string() }))
|
|
435
|
-
.handler(async ({ data }) => {
|
|
427
|
+
.handler(async ({ data, context }) => {
|
|
436
428
|
const prisma = await getPrisma()
|
|
437
|
-
const request = getRequest();
|
|
438
|
-
const session = await requireAuth(request);
|
|
439
429
|
const links = await prisma.storyDocLink.findMany({
|
|
440
430
|
where: { storyId: data.storyId },
|
|
441
431
|
include: { doc: { select: DOC_SELECT } },
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { ACTIVITY_SELECT, toActivityItem } from "@/server/story/types";
|
|
24
23
|
import {
|
|
25
24
|
assertStoryProjectMember,
|
|
@@ -27,12 +26,11 @@ import {
|
|
|
27
26
|
} from "@/server/story/permissions";
|
|
28
27
|
|
|
29
28
|
export const removeAttachmentFn = createServerFn({ method: "POST" })
|
|
29
|
+
.middleware([authContextMiddleware])
|
|
30
30
|
.validator(z.object({ attachmentId: z.string() }))
|
|
31
|
-
.handler(async ({ data }) => {
|
|
31
|
+
.handler(async ({ data, context }) => {
|
|
32
32
|
const prisma = await getPrisma()
|
|
33
|
-
const
|
|
34
|
-
const session = await requireAuth(request);
|
|
35
|
-
const userId = session.user.id;
|
|
33
|
+
const userId = context.user.id;
|
|
36
34
|
|
|
37
35
|
const attachment = await prisma.storyAttachment.findUnique({ where: { id: data.attachmentId } });
|
|
38
36
|
// 反查附件所属需求的项目成员资格(SEC-03:防删他人需求的附件)
|
|
@@ -67,12 +65,11 @@ export const removeAttachmentFn = createServerFn({ method: "POST" })
|
|
|
67
65
|
});
|
|
68
66
|
|
|
69
67
|
export const getAttachmentsFn = createServerFn({ method: "GET" })
|
|
68
|
+
.middleware([authContextMiddleware])
|
|
70
69
|
.validator(z.object({ storyId: z.string() }))
|
|
71
|
-
.handler(async ({ data }) => {
|
|
70
|
+
.handler(async ({ data, context }) => {
|
|
72
71
|
const prisma = await getPrisma()
|
|
73
|
-
|
|
74
|
-
const session = await requireAuth(request);
|
|
75
|
-
await assertStoryProjectMember(data.storyId, session.user.id);
|
|
72
|
+
await assertStoryProjectMember(data.storyId, context.user.id);
|
|
76
73
|
|
|
77
74
|
const attachments = await prisma.storyAttachment.findMany({
|
|
78
75
|
where: { storyId: data.storyId },
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { assertStoryProjectMember } from "@/server/story/permissions";
|
|
24
23
|
import { STORY_LIST_SELECT, castStoryUsers } from "@/server/story/types";
|
|
25
24
|
|
|
@@ -28,13 +27,12 @@ import type { StoryListItem } from "@/shared/story/types";
|
|
|
28
27
|
const childrenSchema = z.object({ parentId: z.string() });
|
|
29
28
|
|
|
30
29
|
export const listChildStoriesFn = createServerFn({ method: "GET" })
|
|
30
|
+
.middleware([authContextMiddleware])
|
|
31
31
|
.validator(childrenSchema)
|
|
32
|
-
.handler(async ({ data }) => {
|
|
32
|
+
.handler(async ({ data, context }) => {
|
|
33
33
|
const prisma = await getPrisma()
|
|
34
|
-
const request = getRequest();
|
|
35
|
-
const session = await requireAuth(request);
|
|
36
34
|
// 经父需求反查项目做成员校验
|
|
37
|
-
await assertStoryProjectMember(data.parentId,
|
|
35
|
+
await assertStoryProjectMember(data.parentId, context.user.id);
|
|
38
36
|
|
|
39
37
|
const stories = await prisma.story.findMany({
|
|
40
38
|
where: { parentId: data.parentId, archived: false },
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import type { CommentWithReplies, ReactionGroup } from "@/shared/story/types";
|
|
24
23
|
import { USER_BRIEF_SELECT, castUserBrief } from "@/server/story/user-brief";
|
|
25
24
|
import { aggregateReactions } from "@/server/story/types";
|
|
@@ -28,12 +27,11 @@ import { assertStoryProjectMember, assertStoryProjectMembership as assertProject
|
|
|
28
27
|
|
|
29
28
|
|
|
30
29
|
export const listCommentsFn = createServerFn({ method: "GET" })
|
|
30
|
+
.middleware([authContextMiddleware])
|
|
31
31
|
.validator(z.object({ storyId: z.string() }))
|
|
32
|
-
.handler(async ({ data }) => {
|
|
32
|
+
.handler(async ({ data, context }) => {
|
|
33
33
|
const prisma = await getPrisma()
|
|
34
|
-
const
|
|
35
|
-
const session = await requireAuth(request);
|
|
36
|
-
const userId = session.user.id;
|
|
34
|
+
const userId = context.user.id;
|
|
37
35
|
await assertStoryProjectMember(data.storyId, userId);
|
|
38
36
|
|
|
39
37
|
const comments = await prisma.storyComment.findMany({
|
|
@@ -84,12 +82,11 @@ const commentCreateSchema = z.object({
|
|
|
84
82
|
});
|
|
85
83
|
|
|
86
84
|
export const createCommentFn = createServerFn({ method: "POST" })
|
|
85
|
+
.middleware([authContextMiddleware])
|
|
87
86
|
.validator(commentCreateSchema)
|
|
88
|
-
.handler(async ({ data }) => {
|
|
87
|
+
.handler(async ({ data, context }) => {
|
|
89
88
|
const prisma = await getPrisma()
|
|
90
|
-
const
|
|
91
|
-
const session = await requireAuth(request);
|
|
92
|
-
const userId = session.user.id;
|
|
89
|
+
const userId = context.user.id;
|
|
93
90
|
|
|
94
91
|
await assertStoryProjectMember(data.storyId, userId);
|
|
95
92
|
|
|
@@ -135,12 +132,11 @@ const commentUpdateSchema = z.object({
|
|
|
135
132
|
});
|
|
136
133
|
|
|
137
134
|
export const updateCommentFn = createServerFn({ method: "POST" })
|
|
135
|
+
.middleware([authContextMiddleware])
|
|
138
136
|
.validator(commentUpdateSchema)
|
|
139
|
-
.handler(async ({ data }) => {
|
|
137
|
+
.handler(async ({ data, context }) => {
|
|
140
138
|
const prisma = await getPrisma()
|
|
141
|
-
const
|
|
142
|
-
const session = await requireAuth(request);
|
|
143
|
-
const userId = session.user.id;
|
|
139
|
+
const userId = context.user.id;
|
|
144
140
|
|
|
145
141
|
const existing = await prisma.storyComment.findUnique({
|
|
146
142
|
where: { id: data.commentId },
|
|
@@ -164,12 +160,11 @@ export const updateCommentFn = createServerFn({ method: "POST" })
|
|
|
164
160
|
});
|
|
165
161
|
|
|
166
162
|
export const deleteCommentFn = createServerFn({ method: "POST" })
|
|
163
|
+
.middleware([authContextMiddleware])
|
|
167
164
|
.validator(z.object({ commentId: z.string() }))
|
|
168
|
-
.handler(async ({ data }) => {
|
|
165
|
+
.handler(async ({ data, context }) => {
|
|
169
166
|
const prisma = await getPrisma()
|
|
170
|
-
const
|
|
171
|
-
const session = await requireAuth(request);
|
|
172
|
-
const userId = session.user.id;
|
|
167
|
+
const userId = context.user.id;
|
|
173
168
|
|
|
174
169
|
const existing = await prisma.storyComment.findUnique({
|
|
175
170
|
where: { id: data.commentId },
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { assertStoryProjectMember } from "@/server/story/permissions";
|
|
24
23
|
import { USER_BRIEF_SELECT, castUserBrief } from "@/server/story/user-brief";
|
|
25
24
|
|
|
@@ -30,12 +29,11 @@ const listActivitiesSchema = z.object({
|
|
|
30
29
|
});
|
|
31
30
|
|
|
32
31
|
export const listActivitiesFn = createServerFn({ method: "GET" })
|
|
32
|
+
.middleware([authContextMiddleware])
|
|
33
33
|
.validator(listActivitiesSchema)
|
|
34
|
-
.handler(async ({ data }) => {
|
|
34
|
+
.handler(async ({ data, context }) => {
|
|
35
35
|
const prisma = await getPrisma()
|
|
36
|
-
|
|
37
|
-
const session = await requireAuth(request);
|
|
38
|
-
await assertStoryProjectMember(data.storyId, session.user.id);
|
|
36
|
+
await assertStoryProjectMember(data.storyId, context.user.id);
|
|
39
37
|
|
|
40
38
|
const activities = await prisma.storyActivity.findMany({
|
|
41
39
|
where: {
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { STORY_LIST_SELECT, castStoryUsers } from "@/server/story/types";
|
|
24
23
|
import { buildRoomName } from "@allbluecn/collab-core/rooms";
|
|
25
24
|
import { touchCollabSnapshot } from "@/server/collab/touch-snapshot";
|
|
@@ -30,12 +29,11 @@ const archiveStorySchema = z.object({ storyId: z.string() });
|
|
|
30
29
|
|
|
31
30
|
|
|
32
31
|
export const archiveStoryFn = createServerFn({ method: "POST" })
|
|
32
|
+
.middleware([authContextMiddleware])
|
|
33
33
|
.validator(archiveStorySchema)
|
|
34
|
-
.handler(async ({ data }) => {
|
|
34
|
+
.handler(async ({ data, context }) => {
|
|
35
35
|
const prisma = await getPrisma()
|
|
36
|
-
const
|
|
37
|
-
const session = await requireAuth(request);
|
|
38
|
-
const userId = session.user.id;
|
|
36
|
+
const userId = context.user.id;
|
|
39
37
|
|
|
40
38
|
await assertStoryProjectMember(data.storyId, userId);
|
|
41
39
|
|
|
@@ -72,12 +70,11 @@ export const archiveStoryFn = createServerFn({ method: "POST" })
|
|
|
72
70
|
});
|
|
73
71
|
|
|
74
72
|
export const unarchiveStoryFn = createServerFn({ method: "POST" })
|
|
73
|
+
.middleware([authContextMiddleware])
|
|
75
74
|
.validator(archiveStorySchema)
|
|
76
|
-
.handler(async ({ data }) => {
|
|
75
|
+
.handler(async ({ data, context }) => {
|
|
77
76
|
const prisma = await getPrisma()
|
|
78
|
-
const
|
|
79
|
-
const session = await requireAuth(request);
|
|
80
|
-
const userId = session.user.id;
|
|
77
|
+
const userId = context.user.id;
|
|
81
78
|
|
|
82
79
|
await assertStoryProjectMember(data.storyId, userId);
|
|
83
80
|
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { STORY_STATES, STORY_PRIORITIES, type StoryState, type StoryPriority } from "@/shared/story/constants";
|
|
24
23
|
import { toDateKeyUtc } from "@/server/story/date-key";
|
|
25
24
|
import type { Prisma } from "@allbluecn/database";
|
|
@@ -39,12 +38,11 @@ async function accessibleProjectIds(userId: string): Promise<string[]> {
|
|
|
39
38
|
}
|
|
40
39
|
|
|
41
40
|
export const bulkArchiveStoriesFn = createServerFn({ method: "POST" })
|
|
41
|
+
.middleware([authContextMiddleware])
|
|
42
42
|
.validator(idListSchema)
|
|
43
|
-
.handler(async ({ data }) => {
|
|
43
|
+
.handler(async ({ data, context }) => {
|
|
44
44
|
const prisma = await getPrisma()
|
|
45
|
-
const
|
|
46
|
-
const session = await requireAuth(request);
|
|
47
|
-
const userId = session.user.id;
|
|
45
|
+
const userId = context.user.id;
|
|
48
46
|
const visibleProjectIds = await accessibleProjectIds(userId);
|
|
49
47
|
|
|
50
48
|
return prisma.$transaction(async (tx) => {
|
|
@@ -82,13 +80,12 @@ export const bulkArchiveStoriesFn = createServerFn({ method: "POST" })
|
|
|
82
80
|
});
|
|
83
81
|
|
|
84
82
|
export const bulkDeleteStoriesFn = createServerFn({ method: "POST" })
|
|
83
|
+
.middleware([authContextMiddleware])
|
|
85
84
|
.validator(idListSchema)
|
|
86
|
-
.handler(async ({ data }) => {
|
|
85
|
+
.handler(async ({ data, context }) => {
|
|
87
86
|
const prisma = await getPrisma()
|
|
88
|
-
const request = getRequest();
|
|
89
|
-
const session = await requireAuth(request);
|
|
90
87
|
// 可见性过滤进 where:跨项目 id 静默跳过而非报错(SEC-03/DB-03:单语句消除跨项目删除)
|
|
91
|
-
const visibleProjectIds = await accessibleProjectIds(
|
|
88
|
+
const visibleProjectIds = await accessibleProjectIds(context.user.id);
|
|
92
89
|
const result = await prisma.story.deleteMany({
|
|
93
90
|
where: { id: { in: data.storyIds }, projectId: { in: visibleProjectIds } },
|
|
94
91
|
});
|
|
@@ -112,12 +109,11 @@ const bulkUpdateSchema = z.object({
|
|
|
112
109
|
});
|
|
113
110
|
|
|
114
111
|
export const bulkUpdateStoriesFn = createServerFn({ method: "POST" })
|
|
112
|
+
.middleware([authContextMiddleware])
|
|
115
113
|
.validator(bulkUpdateSchema)
|
|
116
|
-
.handler(async ({ data }) => {
|
|
114
|
+
.handler(async ({ data, context }) => {
|
|
117
115
|
const prisma = await getPrisma()
|
|
118
|
-
const
|
|
119
|
-
const session = await requireAuth(request);
|
|
120
|
-
const userId = session.user.id;
|
|
116
|
+
const userId = context.user.id;
|
|
121
117
|
const visibleProjectIds = await accessibleProjectIds(userId);
|
|
122
118
|
|
|
123
119
|
return prisma.$transaction(async (tx) => {
|
|
@@ -17,20 +17,18 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { assertStoryProjectMember, assertStoryProjectMembership } from "@/server/story/permissions";
|
|
24
23
|
import { STORY_LIST_SELECT, castStoryUsers } from "@/server/story/types";
|
|
25
24
|
|
|
26
25
|
const detailSchema = z.object({ storyId: z.string() });
|
|
27
26
|
|
|
28
27
|
export const getStoryNeighborsFn = createServerFn({ method: "GET" })
|
|
28
|
+
.middleware([authContextMiddleware])
|
|
29
29
|
.validator(detailSchema)
|
|
30
|
-
.handler(async ({ data }) => {
|
|
30
|
+
.handler(async ({ data, context }) => {
|
|
31
31
|
const prisma = await getPrisma()
|
|
32
|
-
const request = getRequest();
|
|
33
|
-
const session = await requireAuth(request);
|
|
34
32
|
|
|
35
33
|
const current = await prisma.story.findUnique({
|
|
36
34
|
where: { id: data.storyId },
|
|
@@ -38,7 +36,7 @@ export const getStoryNeighborsFn = createServerFn({ method: "GET" })
|
|
|
38
36
|
});
|
|
39
37
|
if (!current) return { prevId: null, nextId: null };
|
|
40
38
|
// 读侧成员校验(复用已查到的 projectId,免二次反查)
|
|
41
|
-
await assertStoryProjectMembership(current.projectId,
|
|
39
|
+
await assertStoryProjectMembership(current.projectId, context.user.id);
|
|
42
40
|
|
|
43
41
|
const [prev, next] = await Promise.all([
|
|
44
42
|
prisma.story.findFirst({
|
|
@@ -57,13 +55,12 @@ export const getStoryNeighborsFn = createServerFn({ method: "GET" })
|
|
|
57
55
|
});
|
|
58
56
|
|
|
59
57
|
export const getStoryDetailFn = createServerFn({ method: "GET" })
|
|
58
|
+
.middleware([authContextMiddleware])
|
|
60
59
|
.validator(detailSchema)
|
|
61
|
-
.handler(async ({ data }) => {
|
|
60
|
+
.handler(async ({ data, context }) => {
|
|
62
61
|
const prisma = await getPrisma()
|
|
63
|
-
const request = getRequest();
|
|
64
|
-
const session = await requireAuth(request);
|
|
65
62
|
// 读侧与写侧同口径:须为需求所属项目的有效成员(审计 2026-10-25 story 域读路径缺口)
|
|
66
|
-
await assertStoryProjectMember(data.storyId,
|
|
63
|
+
await assertStoryProjectMember(data.storyId, context.user.id);
|
|
67
64
|
const story = await prisma.story.findUnique({
|
|
68
65
|
where: { id: data.storyId },
|
|
69
66
|
select: { ...STORY_LIST_SELECT, sequenceId: true },
|
|
@@ -16,9 +16,8 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
import { createServerFn } from "@tanstack/react-start"
|
|
19
|
-
import { getRequest } from "@tanstack/react-start/server"
|
|
20
19
|
import { z } from "zod"
|
|
21
|
-
import {
|
|
20
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
22
21
|
import { suggestLabelsCore } from "@/server/story/story-crud/label-suggest-core"
|
|
23
22
|
|
|
24
23
|
const suggestSchema = z.object({
|
|
@@ -28,11 +27,10 @@ const suggestSchema = z.object({
|
|
|
28
27
|
})
|
|
29
28
|
|
|
30
29
|
export const suggestStoryLabelsFn = createServerFn({ method: "POST" })
|
|
30
|
+
.middleware([authContextMiddleware])
|
|
31
31
|
.validator(suggestSchema)
|
|
32
|
-
.handler(async ({ data }) => {
|
|
33
|
-
const
|
|
34
|
-
const session = await requireAuth(request)
|
|
35
|
-
const userId = session.user?.id
|
|
32
|
+
.handler(async ({ data, context }) => {
|
|
33
|
+
const userId = context.user.id
|
|
36
34
|
if (!userId) throw new Error("用户未登录")
|
|
37
35
|
return suggestLabelsCore(data, userId)
|
|
38
36
|
})
|
|
@@ -17,10 +17,9 @@
|
|
|
17
17
|
|
|
18
18
|
import { z } from "zod";
|
|
19
19
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { createServerFn } from "@tanstack/react-start";
|
|
22
|
-
import {
|
|
23
|
-
import type { Prisma } from
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context";
|
|
22
|
+
import type { Prisma } from "@allbluecn/database";
|
|
24
23
|
import { upsertLabel } from "@/server/story/story-crud/label-upsert";
|
|
25
24
|
|
|
26
25
|
const labelCreateSchema = z.object({
|
|
@@ -32,11 +31,10 @@ const labelCreateSchema = z.object({
|
|
|
32
31
|
|
|
33
32
|
/** S24:标签范围 = 存量全局(projectId IS NULL)∪ 本项目归属。 */
|
|
34
33
|
export const listLabelsFn = createServerFn({ method: "GET" })
|
|
34
|
+
.middleware([authContextMiddleware])
|
|
35
35
|
.validator(z.object({ projectId: z.string().optional() }))
|
|
36
36
|
.handler(async ({ data }) => {
|
|
37
37
|
const prisma = await getPrisma()
|
|
38
|
-
const request = getRequest();
|
|
39
|
-
await requireAuth(request);
|
|
40
38
|
// null 字面量与 Prisma Nullable 字段类型不可比(TS 限制),Json 边界同款
|
|
41
39
|
// 单点断言收窄(S24)
|
|
42
40
|
const where = {
|
|
@@ -53,10 +51,9 @@ export const listLabelsFn = createServerFn({ method: "GET" })
|
|
|
53
51
|
);
|
|
54
52
|
|
|
55
53
|
export const createLabelFn = createServerFn({ method: "POST" })
|
|
54
|
+
.middleware([authContextMiddleware])
|
|
56
55
|
.validator(labelCreateSchema)
|
|
57
|
-
.handler(async ({ data }) => {
|
|
56
|
+
.handler(async ({ data, context }) => {
|
|
58
57
|
const prisma = await getPrisma()
|
|
59
|
-
|
|
60
|
-
const session = await requireAuth(request);
|
|
61
|
-
return upsertLabel(data.name, session.user.id, data.color, data.projectId);
|
|
58
|
+
return upsertLabel(data.name, context.user.id, data.color, data.projectId);
|
|
62
59
|
});
|
|
@@ -6,18 +6,16 @@
|
|
|
6
6
|
// 与标签 CRUD 无关的职责混装),迁出为单一职责文件,客户端消费方同步改 import。
|
|
7
7
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
8
8
|
import { createServerFn } from "@tanstack/react-start";
|
|
9
|
-
import {
|
|
10
|
-
import { requireAuth } from "@/server/auth-helpers";
|
|
9
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
11
10
|
import { assertStoryProjectMembership } from "@/server/story/permissions";
|
|
12
11
|
import { USER_BRIEF_SELECT } from "@/server/story/user-brief";
|
|
13
12
|
|
|
14
13
|
export const listUsersBriefFn = createServerFn({ method: "GET" })
|
|
14
|
+
.middleware([authContextMiddleware])
|
|
15
15
|
.validator((data?: { projectId?: string }) => data)
|
|
16
|
-
.handler(async ({ data }) => {
|
|
16
|
+
.handler(async ({ data, context }) => {
|
|
17
17
|
const prisma = await getPrisma()
|
|
18
|
-
const
|
|
19
|
-
const session = await requireAuth(request);
|
|
20
|
-
const currentUserId = session.user.id;
|
|
18
|
+
const currentUserId = context.user.id;
|
|
21
19
|
|
|
22
20
|
if (data?.projectId) {
|
|
23
21
|
// 项目级别:只返回项目成员——且仅对该项目的有效成员开放(防跨项目成员枚举)
|
|
@@ -17,10 +17,9 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
21
|
import { buildRoomName } from "@allbluecn/collab-core/rooms";
|
|
23
|
-
import {
|
|
22
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
24
23
|
import { ensureBuiltinIndependentProject, resolveStoryScopeProjectIds } from "@/server/builtin-project";
|
|
25
24
|
import { validateAssignee } from "@/server/lib/validate-assignee";
|
|
26
25
|
import { withCollabGuard } from "@/server/collab/write-guard";
|
|
@@ -55,12 +54,11 @@ const listSchema = z.object({
|
|
|
55
54
|
});
|
|
56
55
|
|
|
57
56
|
export const listStoriesFn = createServerFn({ method: "GET" })
|
|
57
|
+
.middleware([authContextMiddleware])
|
|
58
58
|
.validator(listSchema)
|
|
59
|
-
.handler(async ({ data }) => {
|
|
59
|
+
.handler(async ({ data, context }) => {
|
|
60
60
|
const prisma = await getPrisma()
|
|
61
|
-
const
|
|
62
|
-
const session = await requireAuth(request);
|
|
63
|
-
const userId = session.user.id;
|
|
61
|
+
const userId = context.user.id;
|
|
64
62
|
|
|
65
63
|
const projectIds = await resolveStoryScopeProjectIds(data.projectId, userId);
|
|
66
64
|
|
|
@@ -99,12 +97,11 @@ const createSchema = z.object({
|
|
|
99
97
|
});
|
|
100
98
|
|
|
101
99
|
export const createStoryFn = createServerFn({ method: "POST" })
|
|
100
|
+
.middleware([authContextMiddleware])
|
|
102
101
|
.validator(createSchema)
|
|
103
|
-
.handler(async ({ data }) => {
|
|
102
|
+
.handler(async ({ data, context }) => {
|
|
104
103
|
const prisma = await getPrisma()
|
|
105
|
-
const
|
|
106
|
-
const session = await requireAuth(request);
|
|
107
|
-
const userId = session.user.id;
|
|
104
|
+
const userId = context.user.id;
|
|
108
105
|
|
|
109
106
|
let projectId = data.projectId;
|
|
110
107
|
if (!projectId) {
|
|
@@ -200,12 +197,11 @@ function storyDescriptionToContent(description: string): { html: string; markdow
|
|
|
200
197
|
}
|
|
201
198
|
|
|
202
199
|
export const updateStoryFn = createServerFn({ method: "POST" })
|
|
200
|
+
.middleware([authContextMiddleware])
|
|
203
201
|
.validator(updateSchema)
|
|
204
|
-
.handler(async ({ data }) => {
|
|
202
|
+
.handler(async ({ data, context }) => {
|
|
205
203
|
const prisma = await getPrisma()
|
|
206
|
-
const
|
|
207
|
-
const session = await requireAuth(request);
|
|
208
|
-
const userId = session.user.id;
|
|
204
|
+
const userId = context.user.id;
|
|
209
205
|
|
|
210
206
|
// ── Yjs 多人协作 §5.3 写入门卫(任务 21;审查修正:提至 $transaction
|
|
211
207
|
// 之前——门卫转发含网络 I/O(TTL 内重试最坏 ≈4s),事务内等待会击穿
|
|
@@ -514,12 +510,11 @@ export const updateStoryFn = createServerFn({ method: "POST" })
|
|
|
514
510
|
const deleteSchema = z.object({ storyId: z.string() });
|
|
515
511
|
|
|
516
512
|
export const deleteStoryFn = createServerFn({ method: "POST" })
|
|
513
|
+
.middleware([authContextMiddleware])
|
|
517
514
|
.validator(deleteSchema)
|
|
518
|
-
.handler(async ({ data }) => {
|
|
515
|
+
.handler(async ({ data, context }) => {
|
|
519
516
|
const prisma = await getPrisma()
|
|
520
|
-
const
|
|
521
|
-
const session = await requireAuth(request);
|
|
522
|
-
const userId = session.user.id;
|
|
517
|
+
const userId = context.user.id;
|
|
523
518
|
|
|
524
519
|
// 先取回目标行校验成员资格,再删(SEC-03:防跨项目删除他人需求)
|
|
525
520
|
const existing = await prisma.story.findUnique({
|