@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
|
@@ -24,7 +24,7 @@ import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
|
24
24
|
import { createServerFn } from "@tanstack/react-start";
|
|
25
25
|
import { getRequest } from "@tanstack/react-start/server";
|
|
26
26
|
import { z } from "zod";
|
|
27
|
-
import {
|
|
27
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
28
28
|
import { requireFeature } from "@/server/entitlements";
|
|
29
29
|
import { isProEdition } from "@/server/pro-services";
|
|
30
30
|
import {
|
|
@@ -109,11 +109,9 @@ async function capPageSize(request: Request, pageSize: TestCasePageSize): Promis
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/** 获取当前用户持久化的用例显示选项(非法/缺失字段已回退默认值) */
|
|
112
|
-
export const getTestCaseDisplayOptionsFn = createServerFn({ method: "GET" }).handler(async () => {
|
|
112
|
+
export const getTestCaseDisplayOptionsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
|
|
113
113
|
const prisma = await getPrisma();
|
|
114
|
-
const
|
|
115
|
-
const session = await requireAuth(request);
|
|
116
|
-
const userId = session.user.id;
|
|
114
|
+
const userId = context.user.id;
|
|
117
115
|
|
|
118
116
|
const row = await prisma.testCaseFilterView.findFirst({
|
|
119
117
|
where: { userId, name: TESTCASE_DISPLAY_OPTIONS_VIEW_NAME },
|
|
@@ -121,23 +119,22 @@ export const getTestCaseDisplayOptionsFn = createServerFn({ method: "GET" }).han
|
|
|
121
119
|
select: { displayOptions: true },
|
|
122
120
|
});
|
|
123
121
|
const options = parseStoredOptions(row?.displayOptions);
|
|
124
|
-
options.pageSize = await capPageSize(
|
|
122
|
+
options.pageSize = await capPageSize(getRequest(), options.pageSize);
|
|
125
123
|
return options;
|
|
126
124
|
});
|
|
127
125
|
|
|
128
126
|
/** 保存当前用户的用例显示选项,返回更新后的完整对象 */
|
|
129
127
|
export const updateTestCaseDisplayOptionsFn = createServerFn({ method: "POST" })
|
|
128
|
+
.middleware([authContextMiddleware])
|
|
130
129
|
.validator(optionsSchema)
|
|
131
|
-
.handler(async ({ data }) => {
|
|
130
|
+
.handler(async ({ data, context }) => {
|
|
132
131
|
const prisma = await getPrisma();
|
|
133
|
-
const
|
|
134
|
-
const session = await requireAuth(request);
|
|
135
|
-
const userId = session.user.id;
|
|
132
|
+
const userId = context.user.id;
|
|
136
133
|
|
|
137
134
|
// 服务端强制校验:pageSize > 200(500/1000)为 Pro 专属,前端锁定只是 UX
|
|
138
135
|
const options: TestCaseDisplayOptions = {
|
|
139
136
|
...data,
|
|
140
|
-
pageSize: await capPageSize(
|
|
137
|
+
pageSize: await capPageSize(getRequest(), data.pageSize),
|
|
141
138
|
};
|
|
142
139
|
|
|
143
140
|
// 与 get 路径同一 orderBy:并发双保留行时读写对齐首行,避免保存后读不到
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
// 用例列表 CSV 导出 serverFn(四期 Q8 任务 44,照 testcase-crud listTestCasesFn
|
|
19
|
-
//
|
|
19
|
+
// 口径同构)。权限:authContextMiddleware 鉴权 + resolveStoryScopeProjectIds(projectId
|
|
20
20
|
// 缺省 → 成员关系内全部项目聚合;传值 → 单项目经鉴权,防越权导出)。筛选:
|
|
21
21
|
// filters 为客户端 serializeFilters 产物(FilterCondition JSON 串),与列表共
|
|
22
22
|
// 用 server/testcase/list-query.ts buildListWhere 翻译——导出范围=当前筛选/
|
|
@@ -27,10 +27,9 @@
|
|
|
27
27
|
// 四项),DB 枚举原值输出保持机器可读。
|
|
28
28
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
29
29
|
import { createServerFn } from "@tanstack/react-start";
|
|
30
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
31
30
|
import { z } from "zod";
|
|
32
31
|
import type { Prisma } from "@allbluecn/database";
|
|
33
|
-
import {
|
|
32
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
34
33
|
import { resolveStoryScopeProjectIds } from "@/server/builtin-project";
|
|
35
34
|
import { buildListWhere } from "@/server/testcase/list-query";
|
|
36
35
|
import { CSV_EXPORT_MAX_ROWS, toCsv, type CsvCell } from "@/server/csv";
|
|
@@ -70,12 +69,11 @@ const TEST_CASE_EXPORT_SELECT = {
|
|
|
70
69
|
type TestCaseExportRow = Prisma.TestCaseGetPayload<{ select: typeof TEST_CASE_EXPORT_SELECT }>;
|
|
71
70
|
|
|
72
71
|
export const exportTestCasesFn = createServerFn({ method: "GET" })
|
|
72
|
+
.middleware([authContextMiddleware])
|
|
73
73
|
.validator(exportSchema)
|
|
74
|
-
.handler(async ({ data }) => {
|
|
74
|
+
.handler(async ({ data, context }) => {
|
|
75
75
|
const prisma = await getPrisma();
|
|
76
|
-
const
|
|
77
|
-
const session = await requireAuth(request);
|
|
78
|
-
const userId = session.user.id;
|
|
76
|
+
const userId = context.user.id;
|
|
79
77
|
|
|
80
78
|
const projectIds = await resolveStoryScopeProjectIds(data.projectId, userId);
|
|
81
79
|
|
|
@@ -24,10 +24,9 @@
|
|
|
24
24
|
// update 无乐观锁(StoryFilterView 先例没有,任务 5 审查指针同口径)。
|
|
25
25
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
26
26
|
import { createServerFn } from "@tanstack/react-start";
|
|
27
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
28
27
|
import { z } from "zod";
|
|
29
28
|
import type { Prisma } from "@allbluecn/database";
|
|
30
|
-
import {
|
|
29
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
31
30
|
import { TESTCASE_DISPLAY_OPTIONS_VIEW_NAME } from "@/shared/testcase/field-configs";
|
|
32
31
|
|
|
33
32
|
// 显示选项保留行(任务 20,testcase-display-options.ts 落点)对视图清单
|
|
@@ -125,11 +124,9 @@ function toJson(value: Record<string, unknown>): Prisma.InputJsonValue {
|
|
|
125
124
|
return value as unknown as Prisma.InputJsonValue;
|
|
126
125
|
}
|
|
127
126
|
|
|
128
|
-
export const listFilterViewsFn = createServerFn({ method: "GET" }).handler(async () => {
|
|
127
|
+
export const listFilterViewsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
|
|
129
128
|
const prisma = await getPrisma();
|
|
130
|
-
const
|
|
131
|
-
const session = await requireAuth(request);
|
|
132
|
-
const userId = session.user.id;
|
|
129
|
+
const userId = context.user.id;
|
|
133
130
|
const rows = await prisma.testCaseFilterView.findMany({
|
|
134
131
|
where: { userId, ...NOT_RESERVED },
|
|
135
132
|
orderBy: { sortOrder: "asc" },
|
|
@@ -150,15 +147,14 @@ const createSchema = z.object({
|
|
|
150
147
|
});
|
|
151
148
|
|
|
152
149
|
export const createFilterViewFn = createServerFn({ method: "POST" })
|
|
150
|
+
.middleware([authContextMiddleware])
|
|
153
151
|
.validator(createSchema)
|
|
154
|
-
.handler(async ({ data }) => {
|
|
152
|
+
.handler(async ({ data, context }) => {
|
|
155
153
|
if (data.name === TESTCASE_DISPLAY_OPTIONS_VIEW_NAME) {
|
|
156
154
|
throw new Error("该视图名称为系统保留,请换一个名称");
|
|
157
155
|
}
|
|
158
156
|
const prisma = await getPrisma();
|
|
159
|
-
const
|
|
160
|
-
const session = await requireAuth(request);
|
|
161
|
-
const userId = session.user.id;
|
|
157
|
+
const userId = context.user.id;
|
|
162
158
|
const row = await prisma.testCaseFilterView.create({
|
|
163
159
|
data: {
|
|
164
160
|
userId,
|
|
@@ -185,15 +181,14 @@ const updateSchema = z.object({
|
|
|
185
181
|
});
|
|
186
182
|
|
|
187
183
|
export const updateFilterViewFn = createServerFn({ method: "POST" })
|
|
184
|
+
.middleware([authContextMiddleware])
|
|
188
185
|
.validator(updateSchema)
|
|
189
|
-
.handler(async ({ data }) => {
|
|
186
|
+
.handler(async ({ data, context }) => {
|
|
190
187
|
if (data.name === TESTCASE_DISPLAY_OPTIONS_VIEW_NAME) {
|
|
191
188
|
throw new Error("该视图名称为系统保留,请换一个名称");
|
|
192
189
|
}
|
|
193
190
|
const prisma = await getPrisma();
|
|
194
|
-
const
|
|
195
|
-
const session = await requireAuth(request);
|
|
196
|
-
const userId = session.user.id;
|
|
191
|
+
const userId = context.user.id;
|
|
197
192
|
const { id, ...patch } = data;
|
|
198
193
|
const updates: Record<string, unknown> = {};
|
|
199
194
|
if (patch.name !== undefined) updates.name = patch.name;
|
|
@@ -214,12 +209,11 @@ export const updateFilterViewFn = createServerFn({ method: "POST" })
|
|
|
214
209
|
const deleteSchema = z.object({ id: z.string().min(1) });
|
|
215
210
|
|
|
216
211
|
export const deleteFilterViewFn = createServerFn({ method: "POST" })
|
|
212
|
+
.middleware([authContextMiddleware])
|
|
217
213
|
.validator(deleteSchema)
|
|
218
|
-
.handler(async ({ data }) => {
|
|
214
|
+
.handler(async ({ data, context }) => {
|
|
219
215
|
const prisma = await getPrisma();
|
|
220
|
-
const
|
|
221
|
-
const session = await requireAuth(request);
|
|
222
|
-
const userId = session.user.id;
|
|
216
|
+
const userId = context.user.id;
|
|
223
217
|
await prisma.testCaseFilterView.delete({
|
|
224
218
|
// userId + 非保留名限定:他人视图与显示选项保留行均删不到(照 bug-views.ts)
|
|
225
219
|
where: { id: data.id, userId, ...NOT_RESERVED },
|
|
@@ -21,9 +21,8 @@
|
|
|
21
21
|
// 视同无权限)。create/delete 落 ProjectActivity(targetType=testcase)。
|
|
22
22
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
23
23
|
import { createServerFn } from "@tanstack/react-start";
|
|
24
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
25
24
|
import { z } from "zod";
|
|
26
|
-
import {
|
|
25
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
27
26
|
import { ensureBuiltinIndependentProject, resolveStoryScopeProjectId } from "@/server/builtin-project";
|
|
28
27
|
import { assertTestProjectMembership as assertProjectMembership } from "@/server/testcase/permissions";
|
|
29
28
|
|
|
@@ -32,12 +31,11 @@ import { assertTestProjectMembership as assertProjectMembership } from "@/server
|
|
|
32
31
|
const listSchema = z.object({ projectId: z.string().optional() });
|
|
33
32
|
|
|
34
33
|
export const listFoldersFn = createServerFn({ method: "GET" })
|
|
34
|
+
.middleware([authContextMiddleware])
|
|
35
35
|
.validator(listSchema)
|
|
36
|
-
.handler(async ({ data }) => {
|
|
36
|
+
.handler(async ({ data, context }) => {
|
|
37
37
|
const prisma = await getPrisma();
|
|
38
|
-
const
|
|
39
|
-
const session = await requireAuth(request);
|
|
40
|
-
const userId = session.user.id;
|
|
38
|
+
const userId = context.user.id;
|
|
41
39
|
|
|
42
40
|
const projectId = await resolveStoryScopeProjectId(data.projectId, userId);
|
|
43
41
|
|
|
@@ -58,12 +56,11 @@ const createSchema = z.object({
|
|
|
58
56
|
});
|
|
59
57
|
|
|
60
58
|
export const createFolderFn = createServerFn({ method: "POST" })
|
|
59
|
+
.middleware([authContextMiddleware])
|
|
61
60
|
.validator(createSchema)
|
|
62
|
-
.handler(async ({ data }) => {
|
|
61
|
+
.handler(async ({ data, context }) => {
|
|
63
62
|
const prisma = await getPrisma();
|
|
64
|
-
const
|
|
65
|
-
const session = await requireAuth(request);
|
|
66
|
-
const userId = session.user.id;
|
|
63
|
+
const userId = context.user.id;
|
|
67
64
|
|
|
68
65
|
let projectId = data.projectId;
|
|
69
66
|
if (projectId) {
|
|
@@ -121,12 +118,11 @@ async function getFolderWithMembership(folderId: string, userId: string) {
|
|
|
121
118
|
const renameSchema = z.object({ id: z.string(), name: z.string().min(1).max(100) });
|
|
122
119
|
|
|
123
120
|
export const renameFolderFn = createServerFn({ method: "POST" })
|
|
121
|
+
.middleware([authContextMiddleware])
|
|
124
122
|
.validator(renameSchema)
|
|
125
|
-
.handler(async ({ data }) => {
|
|
123
|
+
.handler(async ({ data, context }) => {
|
|
126
124
|
const prisma = await getPrisma();
|
|
127
|
-
const
|
|
128
|
-
const session = await requireAuth(request);
|
|
129
|
-
const userId = session.user.id;
|
|
125
|
+
const userId = context.user.id;
|
|
130
126
|
|
|
131
127
|
await getFolderWithMembership(data.id, userId);
|
|
132
128
|
|
|
@@ -139,12 +135,11 @@ export const renameFolderFn = createServerFn({ method: "POST" })
|
|
|
139
135
|
const deleteSchema = z.object({ id: z.string() });
|
|
140
136
|
|
|
141
137
|
export const deleteFolderFn = createServerFn({ method: "POST" })
|
|
138
|
+
.middleware([authContextMiddleware])
|
|
142
139
|
.validator(deleteSchema)
|
|
143
|
-
.handler(async ({ data }) => {
|
|
140
|
+
.handler(async ({ data, context }) => {
|
|
144
141
|
const prisma = await getPrisma();
|
|
145
|
-
const
|
|
146
|
-
const session = await requireAuth(request);
|
|
147
|
-
const userId = session.user.id;
|
|
142
|
+
const userId = context.user.id;
|
|
148
143
|
|
|
149
144
|
const folder = await getFolderWithMembership(data.id, userId);
|
|
150
145
|
|
|
@@ -177,12 +172,11 @@ const reorderSchema = z.object({
|
|
|
177
172
|
});
|
|
178
173
|
|
|
179
174
|
export const reorderFolderFn = createServerFn({ method: "POST" })
|
|
175
|
+
.middleware([authContextMiddleware])
|
|
180
176
|
.validator(reorderSchema)
|
|
181
|
-
.handler(async ({ data }) => {
|
|
177
|
+
.handler(async ({ data, context }) => {
|
|
182
178
|
const prisma = await getPrisma();
|
|
183
|
-
const
|
|
184
|
-
const session = await requireAuth(request);
|
|
185
|
-
const userId = session.user.id;
|
|
179
|
+
const userId = context.user.id;
|
|
186
180
|
|
|
187
181
|
const folder = await getFolderWithMembership(data.id, userId);
|
|
188
182
|
|
|
@@ -23,10 +23,9 @@
|
|
|
23
23
|
// unassigned,前端用已有模块树数据解析名称)。
|
|
24
24
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
25
25
|
import { createServerFn } from "@tanstack/react-start";
|
|
26
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
27
26
|
import { z } from "zod";
|
|
28
27
|
import type { Prisma } from "@allbluecn/database";
|
|
29
|
-
import {
|
|
28
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
30
29
|
import { resolveStoryScopeProjectIds } from "@/server/builtin-project";
|
|
31
30
|
import { buildListWhere } from "@/server/testcase/list-query";
|
|
32
31
|
import {
|
|
@@ -92,12 +91,11 @@ const listGroupsSchema = z.object({
|
|
|
92
91
|
});
|
|
93
92
|
|
|
94
93
|
export const listGroupsFn = createServerFn({ method: "GET" })
|
|
94
|
+
.middleware([authContextMiddleware])
|
|
95
95
|
.validator(listGroupsSchema)
|
|
96
|
-
.handler(async ({ data }) => {
|
|
96
|
+
.handler(async ({ data, context }) => {
|
|
97
97
|
const prisma = await getPrisma();
|
|
98
|
-
const
|
|
99
|
-
const session = await requireAuth(request);
|
|
100
|
-
const userId = session.user.id;
|
|
98
|
+
const userId = context.user.id;
|
|
101
99
|
|
|
102
100
|
// scope 解析与列表一致(同 story/story-groups 与 bug 域):未传 → 成员关系
|
|
103
101
|
// 全部项目聚合;单项目经鉴权(无效/非成员 → 静默回退独立项目),防越权查询
|
|
@@ -23,9 +23,8 @@
|
|
|
23
23
|
// 无 withCollabGuard/touchCollabSnapshot 接线。
|
|
24
24
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
25
25
|
import { createServerFn } from "@tanstack/react-start";
|
|
26
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
27
26
|
import { z } from "zod";
|
|
28
|
-
import {
|
|
27
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
29
28
|
|
|
30
29
|
const reorderSchema = z.object({
|
|
31
30
|
// 批量上限 500(story-crud/bulk idListSchema 同款):防误用超大拖垮 $transaction
|
|
@@ -40,15 +39,14 @@ const reorderSchema = z.object({
|
|
|
40
39
|
});
|
|
41
40
|
|
|
42
41
|
export const reorderTestCasesFn = createServerFn({ method: "POST" })
|
|
42
|
+
.middleware([authContextMiddleware])
|
|
43
43
|
.validator(reorderSchema)
|
|
44
|
-
.handler(async ({ data }) => {
|
|
44
|
+
.handler(async ({ data, context }) => {
|
|
45
45
|
const prisma = await getPrisma();
|
|
46
|
-
const request = getRequest();
|
|
47
|
-
const session = await requireAuth(request);
|
|
48
46
|
// 可见性过滤进 where(SEC-03:防跨项目改他人用例排序);updateMany 对
|
|
49
47
|
// 越权/不存在 id 静默跳过,不中断整批合法排序
|
|
50
48
|
const memberships = await prisma.projectMember.findMany({
|
|
51
|
-
where: { userId:
|
|
49
|
+
where: { userId: context.user.id, status: { not: "suspended" } },
|
|
52
50
|
select: { projectId: true },
|
|
53
51
|
});
|
|
54
52
|
const visibleProjectIds = memberships.map((m) => m.projectId);
|
|
@@ -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 { checkAiRateLimit } from '@/server/lib/rate-limit'
|
|
23
22
|
import { hasAiKey } from "@/server/ai-gateway/adapter"
|
|
24
23
|
import { runChatAsAgent } from "@/server/ai-gateway/runs/agent-runtime"
|
|
@@ -30,11 +29,10 @@ const schema = z.object({
|
|
|
30
29
|
})
|
|
31
30
|
|
|
32
31
|
export const translateFn = createServerFn({ method: 'POST' })
|
|
32
|
+
.middleware([authContextMiddleware])
|
|
33
33
|
.validator(schema)
|
|
34
|
-
.handler(async ({ data }) => {
|
|
35
|
-
const
|
|
36
|
-
const session = await requireAuth(request)
|
|
37
|
-
const userId = session.user.id
|
|
34
|
+
.handler(async ({ data, context }) => {
|
|
35
|
+
const userId = context.user.id
|
|
38
36
|
// AI 昂贵调用独立限流(审计 🟠:对照 startGenerationFn 同款;先于 hasAiKey 消耗配额)
|
|
39
37
|
await checkAiRateLimit(userId, "translation")
|
|
40
38
|
if (!(await hasAiKey(userId))) throw new Error('AI 未配置')
|
|
@@ -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
|
|
|
24
23
|
const schema = z.object({
|
|
25
24
|
avatarConfig: z.record(z.string(), z.number()),
|
|
@@ -28,13 +27,12 @@ const schema = z.object({
|
|
|
28
27
|
})
|
|
29
28
|
|
|
30
29
|
export const updateAvatarFn = createServerFn({ method: 'POST' })
|
|
30
|
+
.middleware([authContextMiddleware])
|
|
31
31
|
.validator(schema)
|
|
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
|
const user = await prisma.user.update({
|
|
37
|
-
where: { id:
|
|
35
|
+
where: { id: context.user.id },
|
|
38
36
|
data: { ...data, avatarConfig: data.avatarConfig as object },
|
|
39
37
|
})
|
|
40
38
|
return { avatarConfig: user.avatarConfig, bgShape: user.bgShape, bgColor: user.bgColor }
|
|
@@ -17,22 +17,20 @@
|
|
|
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
|
|
|
24
23
|
const updateTimezoneSchema = z.object({
|
|
25
24
|
timezone: z.string().min(1).max(50),
|
|
26
25
|
})
|
|
27
26
|
|
|
28
27
|
export const updateUserTimezoneFn = createServerFn({ method: 'POST' })
|
|
28
|
+
.middleware([authContextMiddleware])
|
|
29
29
|
.validator(updateTimezoneSchema)
|
|
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
|
await prisma.user.update({
|
|
35
|
-
where: { id:
|
|
33
|
+
where: { id: context.user.id },
|
|
36
34
|
data: { timezone: data.timezone },
|
|
37
35
|
})
|
|
38
36
|
return { success: true }
|
|
@@ -2,17 +2,15 @@
|
|
|
2
2
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
3
3
|
import { createServerFn } from '@tanstack/react-start'
|
|
4
4
|
import { z } from 'zod'
|
|
5
|
-
import {
|
|
6
|
-
import { getRequest } from '@tanstack/react-start/server'
|
|
5
|
+
import { authContextMiddleware } from '@/server/middlewares/auth-context'
|
|
7
6
|
|
|
8
7
|
export const updateLocaleFn = createServerFn({ method: 'POST' })
|
|
8
|
+
.middleware([authContextMiddleware])
|
|
9
9
|
.validator(z.object({ locale: z.enum(['zh', 'en']) }))
|
|
10
|
-
.handler(async ({ data }) => {
|
|
10
|
+
.handler(async ({ data, context }) => {
|
|
11
11
|
const prisma = await getPrisma()
|
|
12
|
-
const request = getRequest()
|
|
13
|
-
const session = await requireAuth(request)
|
|
14
12
|
await prisma.user.update({
|
|
15
|
-
where: { id:
|
|
13
|
+
where: { id: context.user.id },
|
|
16
14
|
data: { locale: data.locale },
|
|
17
15
|
})
|
|
18
16
|
return { success: true }
|
|
@@ -20,8 +20,7 @@
|
|
|
20
20
|
import { getPrisma } from "@allbluecn/database/get-prisma"
|
|
21
21
|
import { z } from "zod";
|
|
22
22
|
import { createServerFn } from "@tanstack/react-start";
|
|
23
|
-
import {
|
|
24
|
-
import { requireAuth } from "@/server/auth-helpers";
|
|
23
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context";
|
|
25
24
|
import { GENERAL_GROUP_TABLES, GENERAL_GROUPS, type GeneralGroup } from "@/server/knowledge/kb-general";
|
|
26
25
|
import type { QuickDocRow, WorkspaceKbCardData } from "./workspace-kb-utils";
|
|
27
26
|
import {
|
|
@@ -76,12 +75,11 @@ async function generalGroupVisibleFilter(
|
|
|
76
75
|
}
|
|
77
76
|
|
|
78
77
|
export const getWorkspaceKbCardFn = createServerFn({ method: "GET" })
|
|
78
|
+
.middleware([authContextMiddleware])
|
|
79
79
|
.validator(z.object({ workspaceId: z.string() }))
|
|
80
|
-
.handler(async ({ data }): Promise<WorkspaceKbCardData> => {
|
|
80
|
+
.handler(async ({ data, context }): Promise<WorkspaceKbCardData> => {
|
|
81
81
|
const prisma = await getPrisma()
|
|
82
|
-
const
|
|
83
|
-
const session = await requireAuth(request);
|
|
84
|
-
const userId = session.user.id;
|
|
82
|
+
const userId = context.user.id;
|
|
85
83
|
await requireWorkspaceMember(data.workspaceId, userId);
|
|
86
84
|
|
|
87
85
|
const [linkRows, quickRows] = await Promise.all([
|
|
@@ -169,12 +167,11 @@ export const getWorkspaceKbCardFn = createServerFn({ method: "GET" })
|
|
|
169
167
|
});
|
|
170
168
|
|
|
171
169
|
export const listWorkspaceAvailableKbsFn = createServerFn({ method: "GET" })
|
|
170
|
+
.middleware([authContextMiddleware])
|
|
172
171
|
.validator(z.object({ workspaceId: z.string() }))
|
|
173
|
-
.handler(async ({ data }) => {
|
|
172
|
+
.handler(async ({ data, context }) => {
|
|
174
173
|
const prisma = await getPrisma()
|
|
175
|
-
const
|
|
176
|
-
const session = await requireAuth(request);
|
|
177
|
-
const userId = session.user.id;
|
|
174
|
+
const userId = context.user.id;
|
|
178
175
|
await requireWorkspaceMember(data.workspaceId, userId);
|
|
179
176
|
|
|
180
177
|
const linked = await prisma.workspaceKnowledgeBase.findMany({
|
|
@@ -195,12 +192,11 @@ export const listWorkspaceAvailableKbsFn = createServerFn({ method: "GET" })
|
|
|
195
192
|
});
|
|
196
193
|
|
|
197
194
|
export const setWorkspaceKbsFn = createServerFn({ method: "POST" })
|
|
195
|
+
.middleware([authContextMiddleware])
|
|
198
196
|
.validator(z.object({ workspaceId: z.string(), kbIds: z.array(z.string()) }))
|
|
199
|
-
.handler(async ({ data }) => {
|
|
197
|
+
.handler(async ({ data, context }) => {
|
|
200
198
|
const prisma = await getPrisma()
|
|
201
|
-
|
|
202
|
-
const session = await requireAuth(request);
|
|
203
|
-
await requireWorkspaceMember(data.workspaceId, session.user.id);
|
|
199
|
+
await requireWorkspaceMember(data.workspaceId, context.user.id);
|
|
204
200
|
|
|
205
201
|
// 校验与候选清单(listWorkspaceAvailableKbsFn)同口径(审计 🟡):
|
|
206
202
|
// 本空间已关联 ∪ 本人 team 库——防凭 id 把任意他人 team 库挂入自己空间
|
|
@@ -215,7 +211,7 @@ export const setWorkspaceKbsFn = createServerFn({ method: "POST" })
|
|
|
215
211
|
id: { in: data.kbIds },
|
|
216
212
|
visibility: "team",
|
|
217
213
|
isDeleted: false,
|
|
218
|
-
OR: [{ id: { in: linkedIds } }, { userId:
|
|
214
|
+
OR: [{ id: { in: linkedIds } }, { userId: context.user.id }],
|
|
219
215
|
},
|
|
220
216
|
select: { id: true },
|
|
221
217
|
});
|
|
@@ -238,6 +234,7 @@ export const setWorkspaceKbsFn = createServerFn({ method: "POST" })
|
|
|
238
234
|
});
|
|
239
235
|
|
|
240
236
|
export const searchQuickDocCandidatesFn = createServerFn({ method: "GET" })
|
|
237
|
+
.middleware([authContextMiddleware])
|
|
241
238
|
.validator(
|
|
242
239
|
z.object({
|
|
243
240
|
workspaceId: z.string(),
|
|
@@ -246,11 +243,9 @@ export const searchQuickDocCandidatesFn = createServerFn({ method: "GET" })
|
|
|
246
243
|
query: z.string().default(""),
|
|
247
244
|
}),
|
|
248
245
|
)
|
|
249
|
-
.handler(async ({ data }) => {
|
|
246
|
+
.handler(async ({ data, context }) => {
|
|
250
247
|
const prisma = await getPrisma()
|
|
251
|
-
const
|
|
252
|
-
const session = await requireAuth(request);
|
|
253
|
-
const userId = session.user.id;
|
|
248
|
+
const userId = context.user.id;
|
|
254
249
|
await requireWorkspaceMember(data.workspaceId, userId);
|
|
255
250
|
|
|
256
251
|
if (data.generalGroup) {
|
|
@@ -290,12 +285,11 @@ export const searchQuickDocCandidatesFn = createServerFn({ method: "GET" })
|
|
|
290
285
|
});
|
|
291
286
|
|
|
292
287
|
export const addQuickDocsFn = createServerFn({ method: "POST" })
|
|
288
|
+
.middleware([authContextMiddleware])
|
|
293
289
|
.validator(z.object({ workspaceId: z.string(), items: z.array(quickDocItemSchema).min(1) }))
|
|
294
|
-
.handler(async ({ data }) => {
|
|
290
|
+
.handler(async ({ data, context }) => {
|
|
295
291
|
const prisma = await getPrisma()
|
|
296
|
-
const
|
|
297
|
-
const session = await requireAuth(request);
|
|
298
|
-
const userId = session.user.id;
|
|
292
|
+
const userId = context.user.id;
|
|
299
293
|
await requireWorkspaceMember(data.workspaceId, userId);
|
|
300
294
|
|
|
301
295
|
// DB-01:批量快捷文档原每项 2~3 次串行查询(存在性 findFirst + 查重 findFirst + create)。
|
|
@@ -411,6 +405,7 @@ export const addQuickDocsFn = createServerFn({ method: "POST" })
|
|
|
411
405
|
});
|
|
412
406
|
|
|
413
407
|
export const renameQuickDocFn = createServerFn({ method: "POST" })
|
|
408
|
+
.middleware([authContextMiddleware])
|
|
414
409
|
.validator(
|
|
415
410
|
z.object({
|
|
416
411
|
quickDocId: z.string(),
|
|
@@ -419,16 +414,14 @@ export const renameQuickDocFn = createServerFn({ method: "POST" })
|
|
|
419
414
|
icon: z.string().optional(),
|
|
420
415
|
}),
|
|
421
416
|
)
|
|
422
|
-
.handler(async ({ data }) => {
|
|
417
|
+
.handler(async ({ data, context }) => {
|
|
423
418
|
const prisma = await getPrisma()
|
|
424
|
-
const request = getRequest();
|
|
425
|
-
const session = await requireAuth(request);
|
|
426
419
|
const row = await prisma.workspaceQuickDoc.findUnique({
|
|
427
420
|
where: { id: data.quickDocId },
|
|
428
421
|
select: { workspaceId: true },
|
|
429
422
|
});
|
|
430
423
|
if (!row) throw new Error("快捷文档不存在");
|
|
431
|
-
await requireWorkspaceMember(row.workspaceId,
|
|
424
|
+
await requireWorkspaceMember(row.workspaceId, context.user.id);
|
|
432
425
|
await prisma.workspaceQuickDoc.update({
|
|
433
426
|
where: { id: data.quickDocId },
|
|
434
427
|
data: {
|
|
@@ -440,22 +433,22 @@ export const renameQuickDocFn = createServerFn({ method: "POST" })
|
|
|
440
433
|
});
|
|
441
434
|
|
|
442
435
|
export const removeQuickDocFn = createServerFn({ method: "POST" })
|
|
436
|
+
.middleware([authContextMiddleware])
|
|
443
437
|
.validator(z.object({ quickDocId: z.string() }))
|
|
444
|
-
.handler(async ({ data }) => {
|
|
438
|
+
.handler(async ({ data, context }) => {
|
|
445
439
|
const prisma = await getPrisma()
|
|
446
|
-
const request = getRequest();
|
|
447
|
-
const session = await requireAuth(request);
|
|
448
440
|
const row = await prisma.workspaceQuickDoc.findUnique({
|
|
449
441
|
where: { id: data.quickDocId },
|
|
450
442
|
select: { workspaceId: true },
|
|
451
443
|
});
|
|
452
444
|
if (!row) throw new Error("快捷文档不存在");
|
|
453
|
-
await requireWorkspaceMember(row.workspaceId,
|
|
445
|
+
await requireWorkspaceMember(row.workspaceId, context.user.id);
|
|
454
446
|
await prisma.workspaceQuickDoc.delete({ where: { id: data.quickDocId } });
|
|
455
447
|
return { ok: true };
|
|
456
448
|
});
|
|
457
449
|
|
|
458
450
|
export const reorderQuickDocsFn = createServerFn({ method: "POST" })
|
|
451
|
+
.middleware([authContextMiddleware])
|
|
459
452
|
.validator(
|
|
460
453
|
z.object({
|
|
461
454
|
workspaceId: z.string(),
|
|
@@ -467,11 +460,9 @@ export const reorderQuickDocsFn = createServerFn({ method: "POST" })
|
|
|
467
460
|
.max(500),
|
|
468
461
|
}),
|
|
469
462
|
)
|
|
470
|
-
.handler(async ({ data }) => {
|
|
463
|
+
.handler(async ({ data, context }) => {
|
|
471
464
|
const prisma = await getPrisma()
|
|
472
|
-
|
|
473
|
-
const session = await requireAuth(request);
|
|
474
|
-
await requireWorkspaceMember(data.workspaceId, session.user.id);
|
|
465
|
+
await requireWorkspaceMember(data.workspaceId, context.user.id);
|
|
475
466
|
const ids = data.items.map((item) => item.id);
|
|
476
467
|
const owned = await prisma.workspaceQuickDoc.findMany({
|
|
477
468
|
where: { id: { in: ids }, workspaceId: data.workspaceId },
|