@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
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
2
2
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
3
3
|
import { createServerFn } from '@tanstack/react-start'
|
|
4
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
5
4
|
import { z } from 'zod'
|
|
6
|
-
import {
|
|
5
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
7
6
|
import {
|
|
8
7
|
NOTIFICATION_CATEGORIES,
|
|
9
8
|
NOTIFICATION_FREQUENCIES,
|
|
@@ -27,12 +26,11 @@ const listSchema = z.object({
|
|
|
27
26
|
})
|
|
28
27
|
|
|
29
28
|
export const listNotificationsFn = createServerFn({ method: 'GET' })
|
|
29
|
+
.middleware([authContextMiddleware])
|
|
30
30
|
.validator(listSchema)
|
|
31
|
-
.handler(async ({ data }): Promise<NotificationListResult> => {
|
|
31
|
+
.handler(async ({ data, context }): Promise<NotificationListResult> => {
|
|
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 where = {
|
|
38
36
|
userId,
|
|
@@ -72,12 +70,11 @@ export const listNotificationsFn = createServerFn({ method: 'GET' })
|
|
|
72
70
|
const markReadSchema = z.object({ id: z.string().min(1) })
|
|
73
71
|
|
|
74
72
|
export const markNotificationReadFn = createServerFn({ method: 'POST' })
|
|
73
|
+
.middleware([authContextMiddleware])
|
|
75
74
|
.validator(markReadSchema)
|
|
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
|
await prisma.notification.updateMany({
|
|
82
79
|
where: { id: data.id, userId, readAt: null },
|
|
83
80
|
data: { readAt: new Date() },
|
|
@@ -86,12 +83,11 @@ export const markNotificationReadFn = createServerFn({ method: 'POST' })
|
|
|
86
83
|
})
|
|
87
84
|
|
|
88
85
|
export const markAllNotificationsReadFn = createServerFn({ method: 'POST' })
|
|
86
|
+
.middleware([authContextMiddleware])
|
|
89
87
|
.validator(z.object({}).optional())
|
|
90
|
-
.handler(async () => {
|
|
88
|
+
.handler(async ({ context }) => {
|
|
91
89
|
const prisma = await getPrisma()
|
|
92
|
-
const
|
|
93
|
-
const session = await requireAuth(request)
|
|
94
|
-
const userId = session.user.id
|
|
90
|
+
const userId = context.user.id
|
|
95
91
|
const result = await prisma.notification.updateMany({
|
|
96
92
|
where: { userId, readAt: null },
|
|
97
93
|
data: { readAt: new Date() },
|
|
@@ -102,34 +98,31 @@ export const markAllNotificationsReadFn = createServerFn({ method: 'POST' })
|
|
|
102
98
|
const deleteSchema = z.object({ id: z.string().min(1) })
|
|
103
99
|
|
|
104
100
|
export const deleteNotificationFn = createServerFn({ method: 'POST' })
|
|
101
|
+
.middleware([authContextMiddleware])
|
|
105
102
|
.validator(deleteSchema)
|
|
106
|
-
.handler(async ({ data }) => {
|
|
103
|
+
.handler(async ({ data, context }) => {
|
|
107
104
|
const prisma = await getPrisma()
|
|
108
|
-
const
|
|
109
|
-
const session = await requireAuth(request)
|
|
110
|
-
const userId = session.user.id
|
|
105
|
+
const userId = context.user.id
|
|
111
106
|
await prisma.notification.deleteMany({ where: { id: data.id, userId } })
|
|
112
107
|
return { success: true }
|
|
113
108
|
})
|
|
114
109
|
|
|
115
110
|
export const clearNotificationsFn = createServerFn({ method: 'POST' })
|
|
111
|
+
.middleware([authContextMiddleware])
|
|
116
112
|
.validator(z.object({}).optional())
|
|
117
|
-
.handler(async () => {
|
|
113
|
+
.handler(async ({ context }) => {
|
|
118
114
|
const prisma = await getPrisma()
|
|
119
|
-
const
|
|
120
|
-
const session = await requireAuth(request)
|
|
121
|
-
const userId = session.user.id
|
|
115
|
+
const userId = context.user.id
|
|
122
116
|
const result = await prisma.notification.deleteMany({ where: { userId } })
|
|
123
117
|
return { success: true, count: result.count }
|
|
124
118
|
})
|
|
125
119
|
|
|
126
120
|
export const getUnreadCountFn = createServerFn({ method: 'GET' })
|
|
121
|
+
.middleware([authContextMiddleware])
|
|
127
122
|
.validator(z.object({}).optional())
|
|
128
|
-
.handler(async () => {
|
|
123
|
+
.handler(async ({ context }) => {
|
|
129
124
|
const prisma = await getPrisma()
|
|
130
|
-
const
|
|
131
|
-
const session = await requireAuth(request)
|
|
132
|
-
const userId = session.user.id
|
|
125
|
+
const userId = context.user.id
|
|
133
126
|
const count = await prisma.notification.count({
|
|
134
127
|
where: { userId, readAt: null },
|
|
135
128
|
})
|
|
@@ -137,12 +130,11 @@ export const getUnreadCountFn = createServerFn({ method: 'GET' })
|
|
|
137
130
|
})
|
|
138
131
|
|
|
139
132
|
export const getNotificationPreferencesFn = createServerFn({ method: 'GET' })
|
|
133
|
+
.middleware([authContextMiddleware])
|
|
140
134
|
.validator(z.object({}).optional())
|
|
141
|
-
.handler(async () => {
|
|
135
|
+
.handler(async ({ context }) => {
|
|
142
136
|
const prisma = await getPrisma()
|
|
143
|
-
|
|
144
|
-
const session = await requireAuth(request)
|
|
145
|
-
return getOrCreatePreferences(session.user.id)
|
|
137
|
+
return getOrCreatePreferences(context.user.id)
|
|
146
138
|
})
|
|
147
139
|
|
|
148
140
|
const preferencesSchema = z.object({
|
|
@@ -160,12 +152,11 @@ const preferencesSchema = z.object({
|
|
|
160
152
|
export const updateNotificationPreferencesFn = createServerFn({
|
|
161
153
|
method: 'POST',
|
|
162
154
|
})
|
|
155
|
+
.middleware([authContextMiddleware])
|
|
163
156
|
.validator(preferencesSchema)
|
|
164
|
-
.handler(async ({ data }) => {
|
|
157
|
+
.handler(async ({ data, context }) => {
|
|
165
158
|
const prisma = await getPrisma()
|
|
166
|
-
const
|
|
167
|
-
const session = await requireAuth(request)
|
|
168
|
-
const userId = session.user.id
|
|
159
|
+
const userId = context.user.id
|
|
169
160
|
const categories = { ...DEFAULT_CATEGORIES } as CategoryFrequencies
|
|
170
161
|
for (const c of NOTIFICATION_CATEGORIES) {
|
|
171
162
|
const v = data.categories[c]
|
|
@@ -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 { toJsonInput } from "@/server/lib/prisma-json";
|
|
24
23
|
import {
|
|
25
24
|
precheckPluginCode,
|
|
@@ -62,12 +61,10 @@ const deletePluginSchema = z.object({
|
|
|
62
61
|
id: z.string(),
|
|
63
62
|
});
|
|
64
63
|
|
|
65
|
-
export const listPluginsFn = createServerFn({ method: "GET" }).handler(
|
|
66
|
-
async () => {
|
|
64
|
+
export const listPluginsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(
|
|
65
|
+
async ({ context }) => {
|
|
67
66
|
const prisma = await getPrisma()
|
|
68
|
-
const
|
|
69
|
-
const session = await requireAuth(request);
|
|
70
|
-
const userId = session.user.id;
|
|
67
|
+
const userId = context.user.id;
|
|
71
68
|
|
|
72
69
|
const plugins = await prisma.harnessPlugin.findMany({
|
|
73
70
|
where: { userId, isDeleted: false },
|
|
@@ -91,12 +88,11 @@ export const listPluginsFn = createServerFn({ method: "GET" }).handler(
|
|
|
91
88
|
);
|
|
92
89
|
|
|
93
90
|
export const upsertPluginFn = createServerFn({ method: "POST" })
|
|
91
|
+
.middleware([authContextMiddleware])
|
|
94
92
|
.validator(upsertPluginSchema)
|
|
95
|
-
.handler(async ({ data }) => {
|
|
93
|
+
.handler(async ({ data, context }) => {
|
|
96
94
|
const prisma = await getPrisma()
|
|
97
|
-
const
|
|
98
|
-
const session = await requireAuth(request);
|
|
99
|
-
const userId = session.user.id;
|
|
95
|
+
const userId = context.user.id;
|
|
100
96
|
|
|
101
97
|
const precheck = precheckPluginCode(data);
|
|
102
98
|
if (!precheck.ok) {
|
|
@@ -142,12 +138,11 @@ export const upsertPluginFn = createServerFn({ method: "POST" })
|
|
|
142
138
|
});
|
|
143
139
|
|
|
144
140
|
export const setPluginStatusFn = createServerFn({ method: "POST" })
|
|
141
|
+
.middleware([authContextMiddleware])
|
|
145
142
|
.validator(setPluginStatusSchema)
|
|
146
|
-
.handler(async ({ data }) => {
|
|
143
|
+
.handler(async ({ data, context }) => {
|
|
147
144
|
const prisma = await getPrisma()
|
|
148
|
-
const
|
|
149
|
-
const session = await requireAuth(request);
|
|
150
|
-
const userId = session.user.id;
|
|
145
|
+
const userId = context.user.id;
|
|
151
146
|
|
|
152
147
|
// DB-03:属主校验合并进写入(updateMany 计数判定),1 次查询替代 findFirst+update 2 次
|
|
153
148
|
const res = await prisma.harnessPlugin.updateMany({
|
|
@@ -163,12 +158,11 @@ export const setPluginStatusFn = createServerFn({ method: "POST" })
|
|
|
163
158
|
});
|
|
164
159
|
|
|
165
160
|
export const setPluginToolsFn = createServerFn({ method: "POST" })
|
|
161
|
+
.middleware([authContextMiddleware])
|
|
166
162
|
.validator(setPluginToolsSchema)
|
|
167
|
-
.handler(async ({ data }) => {
|
|
163
|
+
.handler(async ({ data, context }) => {
|
|
168
164
|
const prisma = await getPrisma()
|
|
169
|
-
const
|
|
170
|
-
const session = await requireAuth(request);
|
|
171
|
-
const userId = session.user.id;
|
|
165
|
+
const userId = context.user.id;
|
|
172
166
|
|
|
173
167
|
for (const tool of data.tools) {
|
|
174
168
|
if (!tool.name || tool.name.trim().length === 0) {
|
|
@@ -193,12 +187,11 @@ export const setPluginToolsFn = createServerFn({ method: "POST" })
|
|
|
193
187
|
});
|
|
194
188
|
|
|
195
189
|
export const deletePluginFn = createServerFn({ method: "POST" })
|
|
190
|
+
.middleware([authContextMiddleware])
|
|
196
191
|
.validator(deletePluginSchema)
|
|
197
|
-
.handler(async ({ data }) => {
|
|
192
|
+
.handler(async ({ data, context }) => {
|
|
198
193
|
const prisma = await getPrisma()
|
|
199
|
-
const
|
|
200
|
-
const session = await requireAuth(request);
|
|
201
|
-
const userId = session.user.id;
|
|
194
|
+
const userId = context.user.id;
|
|
202
195
|
|
|
203
196
|
// DB-03:软删属主校验合并进写入(updateMany 计数判定)
|
|
204
197
|
const res = await prisma.harnessPlugin.updateMany({
|
|
@@ -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 { assertProjectMembership } from "@/server/lib/project-membership";
|
|
24
23
|
|
|
25
24
|
const projectIdSchema = z.object({ projectId: z.string().min(1) });
|
|
@@ -36,12 +35,11 @@ const moduleStorySchema = z.object({
|
|
|
36
35
|
export type ModuleStoryItem = z.infer<typeof moduleStorySchema>;
|
|
37
36
|
|
|
38
37
|
export const getModuleOverviewFn = createServerFn({ method: "GET" })
|
|
38
|
+
.middleware([authContextMiddleware])
|
|
39
39
|
.validator(projectIdSchema)
|
|
40
|
-
.handler(async ({ data }) => {
|
|
40
|
+
.handler(async ({ data, context }) => {
|
|
41
41
|
const prisma = await getPrisma()
|
|
42
|
-
|
|
43
|
-
const session = await requireAuth(request);
|
|
44
|
-
await assertProjectMembership(data.projectId, session.user.id);
|
|
42
|
+
await assertProjectMembership(data.projectId, context.user.id);
|
|
45
43
|
|
|
46
44
|
const [storyAgg, prdLinks] = await Promise.all([
|
|
47
45
|
prisma.story.aggregate({
|
|
@@ -82,12 +80,11 @@ export const getModuleOverviewFn = createServerFn({ method: "GET" })
|
|
|
82
80
|
});
|
|
83
81
|
|
|
84
82
|
export const listModuleStoriesFn = createServerFn({ method: "GET" })
|
|
83
|
+
.middleware([authContextMiddleware])
|
|
85
84
|
.validator(projectIdSchema)
|
|
86
|
-
.handler(async ({ data }) => {
|
|
85
|
+
.handler(async ({ data, context }) => {
|
|
87
86
|
const prisma = await getPrisma()
|
|
88
|
-
|
|
89
|
-
const session = await requireAuth(request);
|
|
90
|
-
await assertProjectMembership(data.projectId, session.user.id);
|
|
87
|
+
await assertProjectMembership(data.projectId, context.user.id);
|
|
91
88
|
const stories = await prisma.story.findMany({
|
|
92
89
|
where: { projectId: data.projectId, archived: false },
|
|
93
90
|
orderBy: { updatedAt: "desc" },
|
|
@@ -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 { auditLog } from "@/server/audit";
|
|
24
23
|
import { validateDisplayId } from "@/lib/project-display-id";
|
|
25
24
|
import { ensureBuiltinIndependentProject, migrateStoriesToIndependentProject } from "@/server/builtin-project";
|
|
@@ -85,12 +84,11 @@ const checkDisplayIdSchema = z.object({
|
|
|
85
84
|
});
|
|
86
85
|
|
|
87
86
|
export const checkDisplayIdAvailableFn = createServerFn({ method: "GET" })
|
|
87
|
+
.middleware([authContextMiddleware])
|
|
88
88
|
.validator(checkDisplayIdSchema)
|
|
89
|
-
.handler(async ({ data }) => {
|
|
89
|
+
.handler(async ({ data, context }) => {
|
|
90
90
|
const prisma = await getPrisma()
|
|
91
|
-
const
|
|
92
|
-
const session = await requireAuth(request);
|
|
93
|
-
const userId = session.user.id;
|
|
91
|
+
const userId = context.user.id;
|
|
94
92
|
|
|
95
93
|
const formatError = validateDisplayId(data.displayId.toUpperCase());
|
|
96
94
|
if (formatError) return { available: false, reason: formatError };
|
|
@@ -111,12 +109,10 @@ export const checkDisplayIdAvailableFn = createServerFn({ method: "GET" })
|
|
|
111
109
|
});
|
|
112
110
|
|
|
113
111
|
// 列出当前用户参与的项目
|
|
114
|
-
export const listProjectsFn = createServerFn({ method: "GET" }).handler(
|
|
115
|
-
async () => {
|
|
112
|
+
export const listProjectsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(
|
|
113
|
+
async ({ context }) => {
|
|
116
114
|
const prisma = await getPrisma()
|
|
117
|
-
const
|
|
118
|
-
const session = await requireAuth(request);
|
|
119
|
-
const userId = session.user.id;
|
|
115
|
+
const userId = context.user.id;
|
|
120
116
|
|
|
121
117
|
const memberships = await prisma.projectMember.findMany({
|
|
122
118
|
where: { userId, status: { not: "suspended" } },
|
|
@@ -149,12 +145,10 @@ export const listProjectsFn = createServerFn({ method: "GET" }).handler(
|
|
|
149
145
|
);
|
|
150
146
|
|
|
151
147
|
// 项目精简列表(供 story 等模块创建表单选择用)
|
|
152
|
-
export const listProjectsBriefFn = createServerFn({ method: "GET" }).handler(
|
|
153
|
-
async () => {
|
|
148
|
+
export const listProjectsBriefFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(
|
|
149
|
+
async ({ context }) => {
|
|
154
150
|
const prisma = await getPrisma()
|
|
155
|
-
const
|
|
156
|
-
const session = await requireAuth(request);
|
|
157
|
-
const userId = session.user.id;
|
|
151
|
+
const userId = context.user.id;
|
|
158
152
|
|
|
159
153
|
await ensureBuiltinIndependentProject(userId);
|
|
160
154
|
|
|
@@ -183,12 +177,11 @@ const createSchema = z.object({
|
|
|
183
177
|
});
|
|
184
178
|
|
|
185
179
|
export const createProjectFn = createServerFn({ method: "POST" })
|
|
180
|
+
.middleware([authContextMiddleware])
|
|
186
181
|
.validator(createSchema)
|
|
187
|
-
.handler(async ({ data }) => {
|
|
182
|
+
.handler(async ({ data, context }) => {
|
|
188
183
|
const prisma = await getPrisma()
|
|
189
|
-
const
|
|
190
|
-
const session = await requireAuth(request);
|
|
191
|
-
const userId = session.user.id;
|
|
184
|
+
const userId = context.user.id;
|
|
192
185
|
|
|
193
186
|
const workspace = await prisma.workspace.findUnique({
|
|
194
187
|
where: { id: data.workspaceId },
|
|
@@ -228,12 +221,11 @@ export const createProjectFn = createServerFn({ method: "POST" })
|
|
|
228
221
|
const detailSchema = z.object({ projectId: z.string() });
|
|
229
222
|
|
|
230
223
|
export const getProjectDetailFn = createServerFn({ method: "GET" })
|
|
224
|
+
.middleware([authContextMiddleware])
|
|
231
225
|
.validator(detailSchema)
|
|
232
|
-
.handler(async ({ data }) => {
|
|
226
|
+
.handler(async ({ data, context }) => {
|
|
233
227
|
const prisma = await getPrisma()
|
|
234
|
-
const
|
|
235
|
-
const session = await requireAuth(request);
|
|
236
|
-
const userId = session.user.id;
|
|
228
|
+
const userId = context.user.id;
|
|
237
229
|
await requireProjectMember(data.projectId, userId);
|
|
238
230
|
|
|
239
231
|
const project = await prisma.project.findUnique({
|
|
@@ -270,12 +262,11 @@ const updateSchema = z.object({
|
|
|
270
262
|
});
|
|
271
263
|
|
|
272
264
|
export const updateProjectFn = createServerFn({ method: "POST" })
|
|
265
|
+
.middleware([authContextMiddleware])
|
|
273
266
|
.validator(updateSchema)
|
|
274
|
-
.handler(async ({ data }) => {
|
|
267
|
+
.handler(async ({ data, context }) => {
|
|
275
268
|
const prisma = await getPrisma()
|
|
276
|
-
const
|
|
277
|
-
const session = await requireAuth(request);
|
|
278
|
-
const userId = session.user.id;
|
|
269
|
+
const userId = context.user.id;
|
|
279
270
|
await requireProjectMember(data.projectId, userId, ["owner", "admin"]);
|
|
280
271
|
|
|
281
272
|
const { projectId, displayId, ...rest } = data;
|
|
@@ -303,12 +294,11 @@ const deleteSchema = z.object({
|
|
|
303
294
|
});
|
|
304
295
|
|
|
305
296
|
export const deleteProjectFn = createServerFn({ method: "POST" })
|
|
297
|
+
.middleware([authContextMiddleware])
|
|
306
298
|
.validator(deleteSchema)
|
|
307
|
-
.handler(async ({ data }) => {
|
|
299
|
+
.handler(async ({ data, context }) => {
|
|
308
300
|
const prisma = await getPrisma()
|
|
309
|
-
const
|
|
310
|
-
const session = await requireAuth(request);
|
|
311
|
-
const userId = session.user.id;
|
|
301
|
+
const userId = context.user.id;
|
|
312
302
|
await requireProjectMember(data.projectId, userId, ["owner"]);
|
|
313
303
|
|
|
314
304
|
const storyCount = await prisma.story.count({ where: { projectId: data.projectId } });
|
|
@@ -340,12 +330,11 @@ export const deleteProjectFn = createServerFn({ method: "POST" })
|
|
|
340
330
|
|
|
341
331
|
// 列出项目成员
|
|
342
332
|
export const listProjectMembersFn = createServerFn({ method: "GET" })
|
|
333
|
+
.middleware([authContextMiddleware])
|
|
343
334
|
.validator(detailSchema)
|
|
344
|
-
.handler(async ({ data }) => {
|
|
335
|
+
.handler(async ({ data, context }) => {
|
|
345
336
|
const prisma = await getPrisma()
|
|
346
|
-
const
|
|
347
|
-
const session = await requireAuth(request);
|
|
348
|
-
const userId = session.user.id;
|
|
337
|
+
const userId = context.user.id;
|
|
349
338
|
await requireProjectMember(data.projectId, userId);
|
|
350
339
|
|
|
351
340
|
const project = await prisma.project.findUnique({
|
|
@@ -383,12 +372,11 @@ const addMemberSchema = z.object({
|
|
|
383
372
|
});
|
|
384
373
|
|
|
385
374
|
export const addProjectMemberFromTeamFn = createServerFn({ method: "POST" })
|
|
375
|
+
.middleware([authContextMiddleware])
|
|
386
376
|
.validator(addMemberSchema)
|
|
387
|
-
.handler(async ({ data }) => {
|
|
377
|
+
.handler(async ({ data, context }) => {
|
|
388
378
|
const prisma = await getPrisma()
|
|
389
|
-
const
|
|
390
|
-
const session = await requireAuth(request);
|
|
391
|
-
const currentUserId = session.user.id;
|
|
379
|
+
const currentUserId = context.user.id;
|
|
392
380
|
await requireProjectMember(data.projectId, currentUserId, ["owner", "admin"]);
|
|
393
381
|
|
|
394
382
|
const project = await prisma.project.findUnique({
|
|
@@ -444,12 +432,11 @@ const removeMemberSchema = z.object({
|
|
|
444
432
|
});
|
|
445
433
|
|
|
446
434
|
export const removeProjectMemberFn = createServerFn({ method: "POST" })
|
|
435
|
+
.middleware([authContextMiddleware])
|
|
447
436
|
.validator(removeMemberSchema)
|
|
448
|
-
.handler(async ({ data }) => {
|
|
437
|
+
.handler(async ({ data, context }) => {
|
|
449
438
|
const prisma = await getPrisma()
|
|
450
|
-
const
|
|
451
|
-
const session = await requireAuth(request);
|
|
452
|
-
const currentUserId = session.user.id;
|
|
439
|
+
const currentUserId = context.user.id;
|
|
453
440
|
const membership = await requireProjectMember(
|
|
454
441
|
data.projectId,
|
|
455
442
|
currentUserId,
|
|
@@ -486,12 +473,11 @@ const updateRoleSchema = z.object({
|
|
|
486
473
|
});
|
|
487
474
|
|
|
488
475
|
export const updateMemberRoleFn = createServerFn({ method: "POST" })
|
|
476
|
+
.middleware([authContextMiddleware])
|
|
489
477
|
.validator(updateRoleSchema)
|
|
490
|
-
.handler(async ({ data }) => {
|
|
478
|
+
.handler(async ({ data, context }) => {
|
|
491
479
|
const prisma = await getPrisma()
|
|
492
|
-
const
|
|
493
|
-
const session = await requireAuth(request);
|
|
494
|
-
const currentUserId = session.user.id;
|
|
480
|
+
const currentUserId = context.user.id;
|
|
495
481
|
await requireProjectMember(data.projectId, currentUserId, ["owner"]);
|
|
496
482
|
|
|
497
483
|
// SEC-04:按 projectId 收敛查找,防止跨项目 memberId 操作(IDOR)
|
|
@@ -524,12 +510,11 @@ const activitiesSchema = z.object({
|
|
|
524
510
|
});
|
|
525
511
|
|
|
526
512
|
export const listProjectActivitiesFn = createServerFn({ method: "GET" })
|
|
513
|
+
.middleware([authContextMiddleware])
|
|
527
514
|
.validator(activitiesSchema)
|
|
528
|
-
.handler(async ({ data }) => {
|
|
515
|
+
.handler(async ({ data, context }) => {
|
|
529
516
|
const prisma = await getPrisma()
|
|
530
|
-
const
|
|
531
|
-
const session = await requireAuth(request);
|
|
532
|
-
const userId = session.user.id;
|
|
517
|
+
const userId = context.user.id;
|
|
533
518
|
await requireProjectMember(data.projectId, userId);
|
|
534
519
|
|
|
535
520
|
return prisma.projectActivity.findMany({
|
|
@@ -557,12 +542,11 @@ const projectActivityDataSchema = z.object({
|
|
|
557
542
|
});
|
|
558
543
|
|
|
559
544
|
export const getProjectActivityDataFn = createServerFn({ method: "GET" })
|
|
545
|
+
.middleware([authContextMiddleware])
|
|
560
546
|
.validator(projectActivityDataSchema)
|
|
561
|
-
.handler(async ({ data }) => {
|
|
547
|
+
.handler(async ({ data, context }) => {
|
|
562
548
|
const prisma = await getPrisma()
|
|
563
|
-
const
|
|
564
|
-
const session = await requireAuth(request);
|
|
565
|
-
const userId = session.user.id;
|
|
549
|
+
const userId = context.user.id;
|
|
566
550
|
await requireProjectMember(data.projectId, userId);
|
|
567
551
|
|
|
568
552
|
const timezone = data.timezone || "Asia/Shanghai";
|
|
@@ -596,23 +580,20 @@ export const getProjectActivityDataFn = createServerFn({ method: "GET" })
|
|
|
596
580
|
});
|
|
597
581
|
|
|
598
582
|
// 确保用户拥有内置独立需求项目(供客户端调用)
|
|
599
|
-
export const ensureBuiltinProjectFn = createServerFn({ method: "GET" }).handler(async () => {
|
|
583
|
+
export const ensureBuiltinProjectFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
|
|
600
584
|
const prisma = await getPrisma()
|
|
601
|
-
const
|
|
602
|
-
const session = await requireAuth(request);
|
|
603
|
-
const userId = session.user.id;
|
|
585
|
+
const userId = context.user.id;
|
|
604
586
|
const projectId = await ensureBuiltinIndependentProject(userId);
|
|
605
587
|
return { id: projectId, name: BUILTIN_INDEPENDENT_NAME, displayId: BUILTIN_INDEPENDENT_DISPLAY_ID, icon: BUILTIN_INDEPENDENT_ICON };
|
|
606
588
|
});
|
|
607
589
|
|
|
608
590
|
export const listProjectKbsFn = createServerFn({ method: "GET" })
|
|
591
|
+
.middleware([authContextMiddleware])
|
|
609
592
|
.validator(z.object({ projectId: z.string() }))
|
|
610
|
-
.handler(async ({ data }) => {
|
|
593
|
+
.handler(async ({ data, context }) => {
|
|
611
594
|
const prisma = await getPrisma()
|
|
612
|
-
const request = getRequest();
|
|
613
|
-
const session = await requireAuth(request);
|
|
614
595
|
// 读侧成员校验(审计 2026-10-25:任意登录用户可枚举任意项目关联的知识库)
|
|
615
|
-
await requireProjectMember(data.projectId,
|
|
596
|
+
await requireProjectMember(data.projectId, context.user.id);
|
|
616
597
|
const rows = await prisma.projectKnowledgeBase.findMany({
|
|
617
598
|
where: { projectId: data.projectId },
|
|
618
599
|
select: {
|
|
@@ -624,13 +605,12 @@ export const listProjectKbsFn = createServerFn({ method: "GET" })
|
|
|
624
605
|
});
|
|
625
606
|
|
|
626
607
|
export const setProjectKbsFn = createServerFn({ method: "POST" })
|
|
608
|
+
.middleware([authContextMiddleware])
|
|
627
609
|
.validator(z.object({ projectId: z.string(), kbIds: z.array(z.string()) }))
|
|
628
|
-
.handler(async ({ data }) => {
|
|
610
|
+
.handler(async ({ data, context }) => {
|
|
629
611
|
const prisma = await getPrisma()
|
|
630
|
-
const request = getRequest();
|
|
631
|
-
const session = await requireAuth(request);
|
|
632
612
|
// 关联知识库改变项目全员可见范围:限 owner / admin(与其余项目级写路径口径一致)
|
|
633
|
-
await requireProjectMember(data.projectId,
|
|
613
|
+
await requireProjectMember(data.projectId, context.user.id, ["owner", "admin"]);
|
|
634
614
|
if (data.kbIds.length > 0) {
|
|
635
615
|
const valid = await prisma.knowledgeBase.findMany({
|
|
636
616
|
where: { id: { in: data.kbIds }, visibility: "team", isDeleted: false },
|
|
@@ -16,11 +16,10 @@
|
|
|
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
20
|
import { createReference } from '@/server/references/engine'
|
|
22
21
|
import { assertEntityAccessible } from '@/server/references/access'
|
|
23
|
-
import {
|
|
22
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
24
23
|
|
|
25
24
|
const createReferenceSchema = z.object({
|
|
26
25
|
sourceModule: z.string().min(1),
|
|
@@ -34,11 +33,10 @@ const createReferenceSchema = z.object({
|
|
|
34
33
|
})
|
|
35
34
|
|
|
36
35
|
export const createReferenceFn = createServerFn({ method: 'POST' })
|
|
36
|
+
.middleware([authContextMiddleware])
|
|
37
37
|
.validator(createReferenceSchema)
|
|
38
|
-
.handler(async ({ data }) => {
|
|
39
|
-
const
|
|
40
|
-
const session = await requireAuth(request)
|
|
41
|
-
const userId = session.user.id
|
|
38
|
+
.handler(async ({ data, context }) => {
|
|
39
|
+
const userId = context.user.id
|
|
42
40
|
// 审计 🟠(2026-10-25):engine 无属主校验,source/target 须逐一断言归属
|
|
43
41
|
await assertEntityAccessible(userId, data.sourceModule, data.sourceEntityId, data.entityType)
|
|
44
42
|
await assertEntityAccessible(userId, data.targetModule, data.targetEntityId, data.entityType)
|
|
@@ -16,11 +16,10 @@
|
|
|
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
20
|
import { resolveReferences } from '@/server/references/engine'
|
|
22
21
|
import { assertEntityAccessible, filterAccessibleRefs } from '@/server/references/access'
|
|
23
|
-
import {
|
|
22
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
24
23
|
|
|
25
24
|
const schema = z.object({
|
|
26
25
|
sourceModule: z.string().min(1),
|
|
@@ -28,11 +27,10 @@ const schema = z.object({
|
|
|
28
27
|
})
|
|
29
28
|
|
|
30
29
|
export const resolveReferencesFn = createServerFn({ method: 'POST' })
|
|
30
|
+
.middleware([authContextMiddleware])
|
|
31
31
|
.validator(schema)
|
|
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
|
// 审计 🟠(2026-10-25):engine 无属主过滤——先断言 source 归属,再过滤
|
|
37
35
|
// target 不可访问(他人/未登记模块)的引用行,防跨用户枚举
|
|
38
36
|
await assertEntityAccessible(userId, data.sourceModule, data.sourceEntityId)
|
|
@@ -16,11 +16,10 @@
|
|
|
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
20
|
import { searchReferences } from '@/server/references/engine'
|
|
22
21
|
import { filterAccessibleRefs } from '@/server/references/access'
|
|
23
|
-
import {
|
|
22
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
24
23
|
|
|
25
24
|
const schema = z.object({
|
|
26
25
|
q: z.string().default(''),
|
|
@@ -28,11 +27,10 @@ const schema = z.object({
|
|
|
28
27
|
})
|
|
29
28
|
|
|
30
29
|
export const searchReferencesFn = createServerFn({ method: 'POST' })
|
|
30
|
+
.middleware([authContextMiddleware])
|
|
31
31
|
.validator(schema)
|
|
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
|
const types = data.types?.split(',').filter(Boolean)
|
|
37
35
|
const results = await searchReferences(data.q, types)
|
|
38
36
|
// 审计 🟠(2026-10-25):engine 为全局索引(无用户/项目维度),按结果行
|
|
@@ -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 { assertDesignReadable } from '@/server/design/access'
|
|
23
22
|
|
|
24
23
|
const schema = z.object({
|
|
@@ -29,10 +28,9 @@ const schema = z.object({
|
|
|
29
28
|
// 可读(属主或存在有效分享),防对任意/不存在 designId 恒返回已订阅的假契约
|
|
30
29
|
// (审计 🟡 2026-10-25)。真实事件推送落地时须替换为实际订阅语义并重命名。
|
|
31
30
|
export const shareEventsFn = createServerFn({ method: 'GET' })
|
|
31
|
+
.middleware([authContextMiddleware])
|
|
32
32
|
.validator(schema)
|
|
33
|
-
.handler(async ({ data }) => {
|
|
34
|
-
|
|
35
|
-
const session = await requireAuth(request)
|
|
36
|
-
await assertDesignReadable(data.designId, session.user.id)
|
|
33
|
+
.handler(async ({ data, context }) => {
|
|
34
|
+
await assertDesignReadable(data.designId, context.user.id)
|
|
37
35
|
return { designId: data.designId, subscribed: true }
|
|
38
36
|
})
|
|
@@ -3,7 +3,7 @@ import { createServerFn } from '@tanstack/react-start'
|
|
|
3
3
|
import { getRequest } from '@tanstack/react-start/server'
|
|
4
4
|
import { z } from 'zod'
|
|
5
5
|
import { getProService } from '@/server/pro-services'
|
|
6
|
-
import { checkRateLimit } from '@/lib/
|
|
6
|
+
import { checkRateLimit } from '@/server/lib/rate-limit'
|
|
7
7
|
|
|
8
8
|
const SSO_DOMAIN_RATE_LIMIT = { max: 20, windowMs: 60_000 }
|
|
9
9
|
// 审计 ⚪(2026-10-25):仅按 domain 限流时,攻击者可轮换不同 domain 无限探测
|