@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
|
@@ -23,9 +23,8 @@
|
|
|
23
23
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
24
24
|
import type { Prisma } from "@allbluecn/database";
|
|
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
|
import { generateProjectToken } from "@/server/bug-report/tokens";
|
|
30
29
|
import { assertProjectMembership } from "@/server/bug/bug-permissions";
|
|
31
30
|
|
|
@@ -63,12 +62,11 @@ function parseCollectConfig(raw: unknown): CollectPageConfigValue {
|
|
|
63
62
|
const projectIdSchema = z.object({ projectId: z.string().min(1) });
|
|
64
63
|
|
|
65
64
|
export const listCollectTokensFn = createServerFn({ method: "GET" })
|
|
65
|
+
.middleware([authContextMiddleware])
|
|
66
66
|
.validator(projectIdSchema)
|
|
67
|
-
.handler(async ({ data }) => {
|
|
67
|
+
.handler(async ({ data, context }) => {
|
|
68
68
|
const prisma = await getPrisma();
|
|
69
|
-
const
|
|
70
|
-
const session = await requireAuth(request);
|
|
71
|
-
const userId = session.user.id;
|
|
69
|
+
const userId = context.user.id;
|
|
72
70
|
await assertProjectMembership(data.projectId, userId);
|
|
73
71
|
|
|
74
72
|
const rows = await prisma.projectAccessToken.findMany({
|
|
@@ -104,12 +102,11 @@ const createCollectTokenSchema = z.object({
|
|
|
104
102
|
});
|
|
105
103
|
|
|
106
104
|
export const createCollectTokenFn = createServerFn({ method: "POST" })
|
|
105
|
+
.middleware([authContextMiddleware])
|
|
107
106
|
.validator(createCollectTokenSchema)
|
|
108
|
-
.handler(async ({ data }) => {
|
|
107
|
+
.handler(async ({ data, context }) => {
|
|
109
108
|
const prisma = await getPrisma();
|
|
110
|
-
const
|
|
111
|
-
const session = await requireAuth(request);
|
|
112
|
-
const userId = session.user.id;
|
|
109
|
+
const userId = context.user.id;
|
|
113
110
|
await assertProjectMembership(data.projectId, userId);
|
|
114
111
|
|
|
115
112
|
const { plaintext, tokenHash, tokenPrefix } = generateProjectToken();
|
|
@@ -140,12 +137,11 @@ const revokeCollectTokenSchema = z.object({
|
|
|
140
137
|
});
|
|
141
138
|
|
|
142
139
|
export const revokeCollectTokenFn = createServerFn({ method: "POST" })
|
|
140
|
+
.middleware([authContextMiddleware])
|
|
143
141
|
.validator(revokeCollectTokenSchema)
|
|
144
|
-
.handler(async ({ data }) => {
|
|
142
|
+
.handler(async ({ data, context }) => {
|
|
145
143
|
const prisma = await getPrisma();
|
|
146
|
-
const
|
|
147
|
-
const session = await requireAuth(request);
|
|
148
|
-
const userId = session.user.id;
|
|
144
|
+
const userId = context.user.id;
|
|
149
145
|
await assertProjectMembership(data.projectId, userId);
|
|
150
146
|
|
|
151
147
|
const revokedAt = new Date();
|
|
@@ -196,12 +192,11 @@ function mergeCollectConfig(
|
|
|
196
192
|
}
|
|
197
193
|
|
|
198
194
|
export const updateCollectConfigFn = createServerFn({ method: "POST" })
|
|
195
|
+
.middleware([authContextMiddleware])
|
|
199
196
|
.validator(updateCollectConfigSchema)
|
|
200
|
-
.handler(async ({ data }) => {
|
|
197
|
+
.handler(async ({ data, context }) => {
|
|
201
198
|
const prisma = await getPrisma();
|
|
202
|
-
const
|
|
203
|
-
const session = await requireAuth(request);
|
|
204
|
-
const userId = session.user.id;
|
|
199
|
+
const userId = context.user.id;
|
|
205
200
|
await assertProjectMembership(data.projectId, userId);
|
|
206
201
|
|
|
207
202
|
const existing = await prisma.projectAccessToken.findFirst({
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import type { AvatarConfig } from "@allbluecn/kernel";
|
|
24
23
|
import { BUG_USER_BRIEF_SELECT } from "@/shared/bug/types";
|
|
25
24
|
import type { BugCommentWithReplies } from "@/shared/bug/types";
|
|
@@ -42,6 +41,7 @@ function castCommentUser(u: {
|
|
|
42
41
|
// 契约从裸数组扩展为 { items, nextCursor }(对齐 listBugActivitiesFn 口径);
|
|
43
42
|
// 回复树不单独分页:根页内所有回复整树随根返回,客户端渲染契约不变。
|
|
44
43
|
export const listCommentsFn = createServerFn({ method: "GET" })
|
|
44
|
+
.middleware([authContextMiddleware])
|
|
45
45
|
.validator(
|
|
46
46
|
z.object({
|
|
47
47
|
bugId: z.string(),
|
|
@@ -50,11 +50,9 @@ export const listCommentsFn = createServerFn({ method: "GET" })
|
|
|
50
50
|
cursor: z.string().optional(),
|
|
51
51
|
}),
|
|
52
52
|
)
|
|
53
|
-
.handler(async ({ data }) => {
|
|
53
|
+
.handler(async ({ data, context }) => {
|
|
54
54
|
const prisma = await getPrisma();
|
|
55
|
-
const
|
|
56
|
-
const session = await requireAuth(request);
|
|
57
|
-
const userId = session.user.id;
|
|
55
|
+
const userId = context.user.id;
|
|
58
56
|
|
|
59
57
|
await assertBugProjectMember(data.bugId, userId);
|
|
60
58
|
|
|
@@ -122,12 +120,11 @@ const commentCreateSchema = z.object({
|
|
|
122
120
|
});
|
|
123
121
|
|
|
124
122
|
export const createCommentFn = createServerFn({ method: "POST" })
|
|
123
|
+
.middleware([authContextMiddleware])
|
|
125
124
|
.validator(commentCreateSchema)
|
|
126
|
-
.handler(async ({ data }) => {
|
|
125
|
+
.handler(async ({ data, context }) => {
|
|
127
126
|
const prisma = await getPrisma();
|
|
128
|
-
const
|
|
129
|
-
const session = await requireAuth(request);
|
|
130
|
-
const userId = session.user.id;
|
|
127
|
+
const userId = context.user.id;
|
|
131
128
|
|
|
132
129
|
await assertBugProjectMember(data.bugId, userId);
|
|
133
130
|
|
|
@@ -189,12 +186,11 @@ const commentUpdateSchema = z.object({
|
|
|
189
186
|
});
|
|
190
187
|
|
|
191
188
|
export const updateCommentFn = createServerFn({ method: "POST" })
|
|
189
|
+
.middleware([authContextMiddleware])
|
|
192
190
|
.validator(commentUpdateSchema)
|
|
193
|
-
.handler(async ({ data }) => {
|
|
191
|
+
.handler(async ({ data, context }) => {
|
|
194
192
|
const prisma = await getPrisma();
|
|
195
|
-
const
|
|
196
|
-
const session = await requireAuth(request);
|
|
197
|
-
const userId = session.user.id;
|
|
193
|
+
const userId = context.user.id;
|
|
198
194
|
|
|
199
195
|
const existing = await prisma.bugComment.findUnique({
|
|
200
196
|
where: { id: data.commentId },
|
|
@@ -226,12 +222,11 @@ export const updateCommentFn = createServerFn({ method: "POST" })
|
|
|
226
222
|
});
|
|
227
223
|
|
|
228
224
|
export const deleteCommentFn = createServerFn({ method: "POST" })
|
|
225
|
+
.middleware([authContextMiddleware])
|
|
229
226
|
.validator(z.object({ commentId: z.string() }))
|
|
230
|
-
.handler(async ({ data }) => {
|
|
227
|
+
.handler(async ({ data, context }) => {
|
|
231
228
|
const prisma = await getPrisma();
|
|
232
|
-
const
|
|
233
|
-
const session = await requireAuth(request);
|
|
234
|
-
const userId = session.user.id;
|
|
229
|
+
const userId = context.user.id;
|
|
235
230
|
|
|
236
231
|
const existing = await prisma.bugComment.findUnique({
|
|
237
232
|
where: { id: data.commentId },
|
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
19
19
|
import { createServerFn } from "@tanstack/react-start";
|
|
20
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
21
20
|
import { z } from "zod";
|
|
22
|
-
import {
|
|
21
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
23
22
|
import { castBugUsers } from "@/shared/bug/types";
|
|
24
23
|
import type { BugDetail, ReproduceSteps } from "@/shared/bug/types";
|
|
25
24
|
import { assertBugProjectMember } from "@/server/bug/bug-permissions";
|
|
@@ -28,12 +27,11 @@ import { BUG_DETAIL_SELECT, extractScreenshotBlobId } from "./detail-select";
|
|
|
28
27
|
const bugIdSchema = z.object({ bugId: z.string() });
|
|
29
28
|
|
|
30
29
|
export const getBugDetailFn = createServerFn({ method: "GET" })
|
|
30
|
+
.middleware([authContextMiddleware])
|
|
31
31
|
.validator(bugIdSchema)
|
|
32
|
-
.handler(async ({ data }) => {
|
|
32
|
+
.handler(async ({ data, context }) => {
|
|
33
33
|
const prisma = await getPrisma();
|
|
34
|
-
const
|
|
35
|
-
const session = await requireAuth(request);
|
|
36
|
-
const userId = session.user.id;
|
|
34
|
+
const userId = context.user.id;
|
|
37
35
|
|
|
38
36
|
await assertBugProjectMember(data.bugId, userId);
|
|
39
37
|
|
|
@@ -57,12 +55,11 @@ export const getBugDetailFn = createServerFn({ method: "GET" })
|
|
|
57
55
|
});
|
|
58
56
|
|
|
59
57
|
export const getBugNeighborsFn = createServerFn({ method: "GET" })
|
|
58
|
+
.middleware([authContextMiddleware])
|
|
60
59
|
.validator(bugIdSchema)
|
|
61
|
-
.handler(async ({ data }) => {
|
|
60
|
+
.handler(async ({ data, context }) => {
|
|
62
61
|
const prisma = await getPrisma();
|
|
63
|
-
const
|
|
64
|
-
const session = await requireAuth(request);
|
|
65
|
-
const userId = session.user.id;
|
|
62
|
+
const userId = context.user.id;
|
|
66
63
|
|
|
67
64
|
// 成员校验 + 圈定 projectId(任一方向越权均拒绝)
|
|
68
65
|
const projectId = await assertBugProjectMember(data.bugId, userId);
|
|
@@ -91,12 +88,11 @@ const listEventsSchema = z.object({
|
|
|
91
88
|
});
|
|
92
89
|
|
|
93
90
|
export const listBugEventsFn = createServerFn({ method: "GET" })
|
|
91
|
+
.middleware([authContextMiddleware])
|
|
94
92
|
.validator(listEventsSchema)
|
|
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
|
await assertBugProjectMember(data.bugId, userId);
|
|
102
98
|
|
|
@@ -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 { ensureBuiltinIndependentProject, resolveStoryScopeProjectIds } from "@/server/builtin-project";
|
|
24
23
|
import { diffDescriptionBlocks } from "@/lib/story/description-diff";
|
|
25
24
|
import {
|
|
@@ -81,12 +80,11 @@ const listSchema = z.object({
|
|
|
81
80
|
});
|
|
82
81
|
|
|
83
82
|
export const listBugsFn = createServerFn({ method: "GET" })
|
|
83
|
+
.middleware([authContextMiddleware])
|
|
84
84
|
.validator(listSchema)
|
|
85
|
-
.handler(async ({ data }) => {
|
|
85
|
+
.handler(async ({ data, context }) => {
|
|
86
86
|
const prisma = await getPrisma();
|
|
87
|
-
const
|
|
88
|
-
const session = await requireAuth(request);
|
|
89
|
-
const userId = session.user.id;
|
|
87
|
+
const userId = context.user.id;
|
|
90
88
|
|
|
91
89
|
// projectId === "__archived__" 为归档视图特殊值,直达 buildListWhere(跨项目成员圈定);
|
|
92
90
|
// 其余走 scope 解析:未传 = 全部可访问项目聚合,无效/非成员 → 静默回退独立项目,防越权
|
|
@@ -156,12 +154,11 @@ const createSchema = z.object({
|
|
|
156
154
|
});
|
|
157
155
|
|
|
158
156
|
export const createBugFn = createServerFn({ method: "POST" })
|
|
157
|
+
.middleware([authContextMiddleware])
|
|
159
158
|
.validator(createSchema)
|
|
160
|
-
.handler(async ({ data }) => {
|
|
159
|
+
.handler(async ({ data, context }) => {
|
|
161
160
|
const prisma = await getPrisma();
|
|
162
|
-
const
|
|
163
|
-
const session = await requireAuth(request);
|
|
164
|
-
const userId = session.user.id;
|
|
161
|
+
const userId = context.user.id;
|
|
165
162
|
|
|
166
163
|
let projectId = data.projectId;
|
|
167
164
|
if (projectId) {
|
|
@@ -356,12 +353,11 @@ const BUG_Y_UPDATE_KEYS = new Set([
|
|
|
356
353
|
|
|
357
354
|
|
|
358
355
|
export const updateBugFn = createServerFn({ method: "POST" })
|
|
356
|
+
.middleware([authContextMiddleware])
|
|
359
357
|
.validator(updateSchema)
|
|
360
|
-
.handler(async ({ data }) => {
|
|
358
|
+
.handler(async ({ data, context }) => {
|
|
361
359
|
const prisma = await getPrisma();
|
|
362
|
-
const
|
|
363
|
-
const session = await requireAuth(request);
|
|
364
|
-
const userId = session.user.id;
|
|
360
|
+
const userId = context.user.id;
|
|
365
361
|
|
|
366
362
|
// ── Yjs 多人协作 §5.3 写入门卫(任务 22;T21 教训:提至 $transaction
|
|
367
363
|
// 之前——门卫转发含网络 I/O(TTL 内重试最坏 ≈4s),事务内等待会击穿
|
|
@@ -585,12 +581,11 @@ export const updateBugFn = createServerFn({ method: "POST" })
|
|
|
585
581
|
const deleteSchema = z.object({ bugId: z.string() });
|
|
586
582
|
|
|
587
583
|
export const deleteBugFn = createServerFn({ method: "POST" })
|
|
584
|
+
.middleware([authContextMiddleware])
|
|
588
585
|
.validator(deleteSchema)
|
|
589
|
-
.handler(async ({ data }) => {
|
|
586
|
+
.handler(async ({ data, context }) => {
|
|
590
587
|
const prisma = await getPrisma();
|
|
591
|
-
const
|
|
592
|
-
const session = await requireAuth(request);
|
|
593
|
-
const userId = session.user.id;
|
|
588
|
+
const userId = context.user.id;
|
|
594
589
|
|
|
595
590
|
const bug = await prisma.bug.findUnique({
|
|
596
591
|
where: { id: data.bugId },
|
|
@@ -617,12 +612,11 @@ export const deleteBugFn = createServerFn({ method: "POST" })
|
|
|
617
612
|
const archiveSchema = z.object({ bugId: z.string() });
|
|
618
613
|
|
|
619
614
|
export const archiveBugFn = createServerFn({ method: "POST" })
|
|
615
|
+
.middleware([authContextMiddleware])
|
|
620
616
|
.validator(archiveSchema)
|
|
621
|
-
.handler(async ({ data }) => {
|
|
617
|
+
.handler(async ({ data, context }) => {
|
|
622
618
|
const prisma = await getPrisma();
|
|
623
|
-
const
|
|
624
|
-
const session = await requireAuth(request);
|
|
625
|
-
const userId = session.user.id;
|
|
619
|
+
const userId = context.user.id;
|
|
626
620
|
|
|
627
621
|
// R7:与 bulk 归档同口径的项目成员校验(单条归档同属批量写权限语义)
|
|
628
622
|
await assertBugsInMemberProjects([data.bugId], userId);
|
|
@@ -659,12 +653,11 @@ export const archiveBugFn = createServerFn({ method: "POST" })
|
|
|
659
653
|
});
|
|
660
654
|
|
|
661
655
|
export const unarchiveBugFn = createServerFn({ method: "POST" })
|
|
656
|
+
.middleware([authContextMiddleware])
|
|
662
657
|
.validator(archiveSchema)
|
|
663
|
-
.handler(async ({ data }) => {
|
|
658
|
+
.handler(async ({ data, context }) => {
|
|
664
659
|
const prisma = await getPrisma();
|
|
665
|
-
const
|
|
666
|
-
const session = await requireAuth(request);
|
|
667
|
-
const userId = session.user.id;
|
|
660
|
+
const userId = context.user.id;
|
|
668
661
|
|
|
669
662
|
await assertBugsInMemberProjects([data.bugId], userId);
|
|
670
663
|
|
|
@@ -707,12 +700,11 @@ const idListSchema = z.object({ bugIds: z.array(z.string()).min(1).max(500) });
|
|
|
707
700
|
const BULK_TX_BATCH_SIZE = 100;
|
|
708
701
|
|
|
709
702
|
export const bulkArchiveBugsFn = createServerFn({ method: "POST" })
|
|
703
|
+
.middleware([authContextMiddleware])
|
|
710
704
|
.validator(idListSchema)
|
|
711
|
-
.handler(async ({ data }) => {
|
|
705
|
+
.handler(async ({ data, context }) => {
|
|
712
706
|
const prisma = await getPrisma();
|
|
713
|
-
const
|
|
714
|
-
const session = await requireAuth(request);
|
|
715
|
-
const userId = session.user.id;
|
|
707
|
+
const userId = context.user.id;
|
|
716
708
|
|
|
717
709
|
await assertBugsInMemberProjects(data.bugIds, userId);
|
|
718
710
|
|
|
@@ -760,12 +752,11 @@ export const bulkArchiveBugsFn = createServerFn({ method: "POST" })
|
|
|
760
752
|
});
|
|
761
753
|
|
|
762
754
|
export const bulkDeleteBugsFn = createServerFn({ method: "POST" })
|
|
755
|
+
.middleware([authContextMiddleware])
|
|
763
756
|
.validator(idListSchema)
|
|
764
|
-
.handler(async ({ data }) => {
|
|
757
|
+
.handler(async ({ data, context }) => {
|
|
765
758
|
const prisma = await getPrisma();
|
|
766
|
-
const
|
|
767
|
-
const session = await requireAuth(request);
|
|
768
|
-
const userId = session.user.id;
|
|
759
|
+
const userId = context.user.id;
|
|
769
760
|
|
|
770
761
|
await assertBugsInMemberProjects(data.bugIds, userId);
|
|
771
762
|
|
|
@@ -795,12 +786,11 @@ const bulkUpdateSchema = z.object({
|
|
|
795
786
|
});
|
|
796
787
|
|
|
797
788
|
export const bulkUpdateBugsFn = createServerFn({ method: "POST" })
|
|
789
|
+
.middleware([authContextMiddleware])
|
|
798
790
|
.validator(bulkUpdateSchema)
|
|
799
|
-
.handler(async ({ data }) => {
|
|
791
|
+
.handler(async ({ data, context }) => {
|
|
800
792
|
const prisma = await getPrisma();
|
|
801
|
-
const
|
|
802
|
-
const session = await requireAuth(request);
|
|
803
|
-
const userId = session.user.id;
|
|
793
|
+
const userId = context.user.id;
|
|
804
794
|
|
|
805
795
|
await assertBugsInMemberProjects(data.bugIds, userId);
|
|
806
796
|
|
|
@@ -23,7 +23,7 @@ import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
|
23
23
|
import { createServerFn } from "@tanstack/react-start";
|
|
24
24
|
import { getRequest } from "@tanstack/react-start/server";
|
|
25
25
|
import { z } from "zod";
|
|
26
|
-
import {
|
|
26
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
27
27
|
import { requireFeature } from "@/server/entitlements";
|
|
28
28
|
import { isProEdition } from "@/server/pro-services";
|
|
29
29
|
import { toJsonInput } from "@/server/lib/prisma-json";
|
|
@@ -112,11 +112,9 @@ async function capPageSize(request: Request, pageSize: BugPageSize): Promise<Bug
|
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
/** 获取当前用户持久化的 BUG 显示选项(非法/缺失字段已回退默认值) */
|
|
115
|
-
export const getBugDisplayOptionsFn = createServerFn({ method: "GET" }).handler(async () => {
|
|
115
|
+
export const getBugDisplayOptionsFn = createServerFn({ method: "GET" }).middleware([authContextMiddleware]).handler(async ({ context }) => {
|
|
116
116
|
const prisma = await getPrisma();
|
|
117
|
-
const
|
|
118
|
-
const session = await requireAuth(request);
|
|
119
|
-
const userId = session.user.id;
|
|
117
|
+
const userId = context.user.id;
|
|
120
118
|
|
|
121
119
|
const row = await prisma.bugFilterView.findFirst({
|
|
122
120
|
where: { userId, name: BUG_DISPLAY_OPTIONS_VIEW_NAME },
|
|
@@ -124,23 +122,22 @@ export const getBugDisplayOptionsFn = createServerFn({ method: "GET" }).handler(
|
|
|
124
122
|
select: { displayOptions: true },
|
|
125
123
|
});
|
|
126
124
|
const options = parseStoredOptions(row?.displayOptions);
|
|
127
|
-
options.pageSize = await capPageSize(
|
|
125
|
+
options.pageSize = await capPageSize(getRequest(), options.pageSize);
|
|
128
126
|
return options;
|
|
129
127
|
});
|
|
130
128
|
|
|
131
129
|
/** 保存当前用户的 BUG 显示选项,返回更新后的完整对象 */
|
|
132
130
|
export const updateBugDisplayOptionsFn = createServerFn({ method: "POST" })
|
|
131
|
+
.middleware([authContextMiddleware])
|
|
133
132
|
.validator(optionsSchema)
|
|
134
|
-
.handler(async ({ data }) => {
|
|
133
|
+
.handler(async ({ data, context }) => {
|
|
135
134
|
const prisma = await getPrisma();
|
|
136
|
-
const
|
|
137
|
-
const session = await requireAuth(request);
|
|
138
|
-
const userId = session.user.id;
|
|
135
|
+
const userId = context.user.id;
|
|
139
136
|
|
|
140
137
|
// 服务端强制校验:pageSize > 200(500/1000)为 Pro 专属,前端锁定只是 UX
|
|
141
138
|
const options: BugDisplayOptions = {
|
|
142
139
|
...data,
|
|
143
|
-
pageSize: await capPageSize(
|
|
140
|
+
pageSize: await capPageSize(getRequest(), data.pageSize),
|
|
144
141
|
};
|
|
145
142
|
|
|
146
143
|
// 与 get 路径同一 orderBy:并发双保留行时读写对齐首行,避免保存后读不到
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
17
|
|
|
18
18
|
// BUG 列表 CSV 导出 serverFn(四期 Q8 任务 44,与 testcase-export.ts 同构;
|
|
19
|
-
// 照 bug-crud listBugsFn
|
|
19
|
+
// 照 bug-crud listBugsFn 口径)。权限:authContextMiddleware 鉴权 + resolveStoryScope-
|
|
20
20
|
// ProjectIds(projectId 缺省 → 成员关系内全部项目聚合;传值 → 单项目经鉴权)。
|
|
21
21
|
// 特殊值 projectId="__archived__"(归档视图)与 listBugsFn 同款直达 buildListWhere
|
|
22
22
|
// (跨项目成员圈定,防越权读他项目归档数据)。筛选:filters 为客户端
|
|
@@ -29,10 +29,9 @@
|
|
|
29
29
|
// 原值输出保持机器可读。
|
|
30
30
|
import { getPrisma } from "@allbluecn/database/get-prisma";
|
|
31
31
|
import { createServerFn } from "@tanstack/react-start";
|
|
32
|
-
import { getRequest } from "@tanstack/react-start/server";
|
|
33
32
|
import { z } from "zod";
|
|
34
33
|
import type { Prisma } from "@allbluecn/database";
|
|
35
|
-
import {
|
|
34
|
+
import { authContextMiddleware } from "@/server/middlewares/auth-context"
|
|
36
35
|
import { checkRateLimit } from "@/server/middlewares/rate-limit-server-fn";
|
|
37
36
|
import { resolveStoryScopeProjectIds } from "@/server/builtin-project";
|
|
38
37
|
import { buildListWhere } from "./bug-list-query";
|
|
@@ -84,12 +83,11 @@ const BUG_EXPORT_SELECT = {
|
|
|
84
83
|
type BugExportRow = Prisma.BugGetPayload<{ select: typeof BUG_EXPORT_SELECT }>;
|
|
85
84
|
|
|
86
85
|
export const exportBugsFn = createServerFn({ method: "GET" })
|
|
86
|
+
.middleware([authContextMiddleware])
|
|
87
87
|
.validator(exportSchema)
|
|
88
|
-
.handler(async ({ data }) => {
|
|
88
|
+
.handler(async ({ data, context }) => {
|
|
89
89
|
const prisma = await getPrisma();
|
|
90
|
-
const
|
|
91
|
-
const session = await requireAuth(request);
|
|
92
|
-
const userId = session.user.id;
|
|
90
|
+
const userId = context.user.id;
|
|
93
91
|
|
|
94
92
|
const rl = checkRateLimit(`bug-export:${userId}`, EXPORT_RATE_LIMIT);
|
|
95
93
|
if (!rl.allowed) {
|
|
@@ -23,9 +23,8 @@
|
|
|
23
23
|
// 同 bug-comments.ts 先例);权限与序列化助手下沉独立模块。
|
|
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
|
import { fireBugWebhook } from "@/server/bug-report/webhook-out";
|
|
30
29
|
import { assertBugProjectMember } from "@/server/bug/bug-permissions";
|
|
31
30
|
|
|
@@ -126,12 +125,11 @@ function castProgress(row: ProgressRow): FixProgressItem {
|
|
|
126
125
|
}
|
|
127
126
|
|
|
128
127
|
export const requestBugFixFn = createServerFn({ method: "POST" })
|
|
128
|
+
.middleware([authContextMiddleware])
|
|
129
129
|
.validator(z.object({ bugId: z.string() }))
|
|
130
|
-
.handler(async ({ data }) => {
|
|
130
|
+
.handler(async ({ data, context }) => {
|
|
131
131
|
const prisma = await getPrisma();
|
|
132
|
-
const
|
|
133
|
-
const session = await requireAuth(request);
|
|
134
|
-
const userId = session.user.id;
|
|
132
|
+
const userId = context.user.id;
|
|
135
133
|
|
|
136
134
|
const projectId = await assertBugProjectMember(data.bugId, userId);
|
|
137
135
|
|
|
@@ -194,12 +192,11 @@ export const requestBugFixFn = createServerFn({ method: "POST" })
|
|
|
194
192
|
});
|
|
195
193
|
|
|
196
194
|
export const cancelBugFixFn = createServerFn({ method: "POST" })
|
|
195
|
+
.middleware([authContextMiddleware])
|
|
197
196
|
.validator(z.object({ bugId: z.string() }))
|
|
198
|
-
.handler(async ({ data }) => {
|
|
197
|
+
.handler(async ({ data, context }) => {
|
|
199
198
|
const prisma = await getPrisma();
|
|
200
|
-
const
|
|
201
|
-
const session = await requireAuth(request);
|
|
202
|
-
const userId = session.user.id;
|
|
199
|
+
const userId = context.user.id;
|
|
203
200
|
|
|
204
201
|
await assertBugProjectMember(data.bugId, userId);
|
|
205
202
|
|
|
@@ -230,12 +227,11 @@ export const cancelBugFixFn = createServerFn({ method: "POST" })
|
|
|
230
227
|
});
|
|
231
228
|
|
|
232
229
|
export const listFixRunsFn = createServerFn({ method: "GET" })
|
|
230
|
+
.middleware([authContextMiddleware])
|
|
233
231
|
.validator(z.object({ bugId: z.string() }))
|
|
234
|
-
.handler(async ({ data }) => {
|
|
232
|
+
.handler(async ({ data, context }) => {
|
|
235
233
|
const prisma = await getPrisma();
|
|
236
|
-
const
|
|
237
|
-
const session = await requireAuth(request);
|
|
238
|
-
const userId = session.user.id;
|
|
234
|
+
const userId = context.user.id;
|
|
239
235
|
|
|
240
236
|
await assertBugProjectMember(data.bugId, userId);
|
|
241
237
|
|
|
@@ -21,9 +21,8 @@
|
|
|
21
21
|
// (缺省 = 全部可访问项目聚合,防越权只返回成员关系内项目)。
|
|
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 { resolveStoryScopeProjectIds } from "@/server/builtin-project";
|
|
28
27
|
import {
|
|
29
28
|
BUG_GROUP_KEYS,
|
|
@@ -93,12 +92,11 @@ const inGroupSchema = z.object({
|
|
|
93
92
|
});
|
|
94
93
|
|
|
95
94
|
export const listBugsInGroupFn = createServerFn({ method: "GET" })
|
|
95
|
+
.middleware([authContextMiddleware])
|
|
96
96
|
.validator(inGroupSchema)
|
|
97
|
-
.handler(async ({ data }) => {
|
|
97
|
+
.handler(async ({ data, context }) => {
|
|
98
98
|
const prisma = await getPrisma();
|
|
99
|
-
const
|
|
100
|
-
const session = await requireAuth(request);
|
|
101
|
-
const userId = session.user.id;
|
|
99
|
+
const userId = context.user.id;
|
|
102
100
|
|
|
103
101
|
const scope = await resolveReadScope(data.projectId, userId);
|
|
104
102
|
const base = buildListWhere({
|
|
@@ -150,12 +148,11 @@ const allGroupsItemsSchema = z.object({
|
|
|
150
148
|
});
|
|
151
149
|
|
|
152
150
|
export const listAllGroupsItemsFn = createServerFn({ method: "GET" })
|
|
151
|
+
.middleware([authContextMiddleware])
|
|
153
152
|
.validator(allGroupsItemsSchema)
|
|
154
|
-
.handler(async ({ data }) => {
|
|
153
|
+
.handler(async ({ data, context }) => {
|
|
155
154
|
const prisma = await getPrisma();
|
|
156
|
-
const
|
|
157
|
-
const session = await requireAuth(request);
|
|
158
|
-
const userId = session.user.id;
|
|
155
|
+
const userId = context.user.id;
|
|
159
156
|
|
|
160
157
|
const scope = await resolveReadScope(data.projectId, userId);
|
|
161
158
|
const base = buildListWhere({
|
|
@@ -202,12 +199,11 @@ const listGroupsSchema = z.object({
|
|
|
202
199
|
});
|
|
203
200
|
|
|
204
201
|
export const listBugGroupsFn = createServerFn({ method: "GET" })
|
|
202
|
+
.middleware([authContextMiddleware])
|
|
205
203
|
.validator(listGroupsSchema)
|
|
206
|
-
.handler(async ({ data }) => {
|
|
204
|
+
.handler(async ({ data, context }) => {
|
|
207
205
|
const prisma = await getPrisma();
|
|
208
|
-
const
|
|
209
|
-
const session = await requireAuth(request);
|
|
210
|
-
const userId = session.user.id;
|
|
206
|
+
const userId = context.user.id;
|
|
211
207
|
|
|
212
208
|
const scope = await resolveReadScope(data.projectId, userId);
|
|
213
209
|
const where = buildListWhere({
|
|
@@ -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/bug/bug-permissions";
|
|
24
23
|
import { aggregateReactions } from "@/server/story/types";
|
|
25
24
|
|
|
@@ -36,12 +35,11 @@ async function assertBugCommentProjectMember(commentId: string, userId: string)
|
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
export const listBugCommentReactionsFn = createServerFn({ method: "GET" })
|
|
38
|
+
.middleware([authContextMiddleware])
|
|
39
39
|
.validator(z.object({ commentId: z.string() }))
|
|
40
|
-
.handler(async ({ data }) => {
|
|
40
|
+
.handler(async ({ data, context }) => {
|
|
41
41
|
const prisma = await getPrisma();
|
|
42
|
-
const
|
|
43
|
-
const session = await requireAuth(request);
|
|
44
|
-
const userId = session.user.id;
|
|
42
|
+
const userId = context.user.id;
|
|
45
43
|
|
|
46
44
|
await assertBugCommentProjectMember(data.commentId, userId);
|
|
47
45
|
|
|
@@ -54,12 +52,11 @@ export const listBugCommentReactionsFn = createServerFn({ method: "GET" })
|
|
|
54
52
|
});
|
|
55
53
|
|
|
56
54
|
export const addBugCommentReactionFn = createServerFn({ method: "POST" })
|
|
55
|
+
.middleware([authContextMiddleware])
|
|
57
56
|
.validator(z.object({ commentId: z.string(), emoji: z.string().min(1) }))
|
|
58
|
-
.handler(async ({ data }) => {
|
|
57
|
+
.handler(async ({ data, context }) => {
|
|
59
58
|
const prisma = await getPrisma();
|
|
60
|
-
const
|
|
61
|
-
const session = await requireAuth(request);
|
|
62
|
-
const userId = session.user.id;
|
|
59
|
+
const userId = context.user.id;
|
|
63
60
|
|
|
64
61
|
await assertBugCommentProjectMember(data.commentId, userId);
|
|
65
62
|
|
|
@@ -87,12 +84,11 @@ export const addBugCommentReactionFn = createServerFn({ method: "POST" })
|
|
|
87
84
|
});
|
|
88
85
|
|
|
89
86
|
export const toggleBugCommentReactionFn = createServerFn({ method: "POST" })
|
|
87
|
+
.middleware([authContextMiddleware])
|
|
90
88
|
.validator(z.object({ commentId: z.string(), emoji: z.string().min(1) }))
|
|
91
|
-
.handler(async ({ data }) => {
|
|
89
|
+
.handler(async ({ data, context }) => {
|
|
92
90
|
const prisma = await getPrisma();
|
|
93
|
-
const
|
|
94
|
-
const session = await requireAuth(request);
|
|
95
|
-
const userId = session.user.id;
|
|
91
|
+
const userId = context.user.id;
|
|
96
92
|
|
|
97
93
|
await assertBugCommentProjectMember(data.commentId, userId);
|
|
98
94
|
|
|
@@ -21,9 +21,8 @@
|
|
|
21
21
|
// story/testCase 的 boardOrder 直写先例一致,无 withCollabGuard 接线。
|
|
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 { getAccessibleProjectIds } from "@/server/bug/bug-permissions";
|
|
28
27
|
|
|
29
28
|
const reorderSchema = z.object({
|
|
@@ -39,14 +38,13 @@ const reorderSchema = z.object({
|
|
|
39
38
|
});
|
|
40
39
|
|
|
41
40
|
export const reorderBugsFn = createServerFn({ method: "POST" })
|
|
41
|
+
.middleware([authContextMiddleware])
|
|
42
42
|
.validator(reorderSchema)
|
|
43
|
-
.handler(async ({ data }) => {
|
|
43
|
+
.handler(async ({ data, context }) => {
|
|
44
44
|
const prisma = await getPrisma();
|
|
45
|
-
const request = getRequest();
|
|
46
|
-
const session = await requireAuth(request);
|
|
47
45
|
// 可见性过滤进 where(SEC-03:防跨项目改他人 BUG 排序);updateMany 对
|
|
48
46
|
// 越权/不存在 id 静默跳过,不中断整批合法排序
|
|
49
|
-
const visibleProjectIds = await getAccessibleProjectIds(
|
|
47
|
+
const visibleProjectIds = await getAccessibleProjectIds(context.user.id);
|
|
50
48
|
|
|
51
49
|
await prisma.$transaction(
|
|
52
50
|
data.items.map((item) =>
|