@cosmicdrift/kumiko-bundled-features 0.306.0 → 0.308.0
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 +9 -9
- package/src/__tests__/access-invalidation-consumer.integration.test.ts +107 -0
- package/src/__tests__/access-invalidation-stream.integration.test.ts +1 -1
- package/src/__tests__/credential-scoped-sse-revoke.integration.test.ts +296 -0
- package/src/agent-tools/__tests__/agent-doc-lint.test.ts +1 -1
- package/src/agent-tools/__tests__/agent-manifest.test.ts +1 -1
- package/src/agent-tools/__tests__/agent-optout.test.ts +1 -1
- package/src/agent-tools/__tests__/agent-tools.integration.test.ts +1 -1
- package/src/agent-tools/__tests__/feature.test.ts +1 -1
- package/src/agent-tools/__tests__/tool-catalog.test.ts +1 -1
- package/src/agent-tools/agent-manifest.ts +1 -1
- package/src/audit/__tests__/escape-hatch-audit.integration.test.ts +1 -1
- package/src/audit/escape-hatch-audit-sink.ts +1 -1
- package/src/audit/handlers/details.query.ts +1 -1
- package/src/audit/handlers/list.query.ts +1 -1
- package/src/auth-email-password/__tests__/query-as-member.integration.test.ts +1 -1
- package/src/auth-email-password/changes.json +5 -0
- package/src/auth-email-password/feature.ts +1 -1
- package/src/auth-email-password/handlers/change-password.write.ts +1 -1
- package/src/auth-email-password/handlers/confirm-account-unlock.write.ts +1 -1
- package/src/auth-email-password/handlers/invite-accept-with-login.write.ts +1 -1
- package/src/auth-email-password/handlers/invite-accept.write.ts +1 -1
- package/src/auth-email-password/handlers/invite-create.write.ts +1 -1
- package/src/auth-email-password/handlers/invite-signup-complete.write.ts +2 -2
- package/src/auth-email-password/handlers/login.write.ts +1 -1
- package/src/auth-email-password/handlers/logout.write.ts +1 -1
- package/src/auth-email-password/handlers/reset-password.write.ts +1 -1
- package/src/auth-email-password/handlers/self-registration-status.query.ts +1 -1
- package/src/auth-email-password/handlers/signup-confirm.write.ts +2 -2
- package/src/auth-email-password/handlers/signup-request.write.ts +1 -1
- package/src/auth-email-password/handlers/token-request-handler.ts +1 -1
- package/src/auth-email-password/handlers/verify-email.write.ts +1 -1
- package/src/auth-email-password/password-policy.ts +1 -1
- package/src/auth-mfa/__tests__/session-scoped-sse-revoke.integration.test.ts +270 -0
- package/src/auth-mfa/handlers/disable.write.ts +1 -1
- package/src/auth-mfa/handlers/enable-confirm-preauth.write.ts +2 -2
- package/src/auth-mfa/handlers/enable-confirm.write.ts +1 -1
- package/src/auth-mfa/handlers/enable-start-preauth.write.ts +1 -1
- package/src/auth-mfa/handlers/enable-start.write.ts +1 -1
- package/src/auth-mfa/handlers/regenerate-recovery.write.ts +1 -1
- package/src/auth-mfa/handlers/status.query.ts +1 -1
- package/src/auth-mfa/handlers/verify.write.ts +2 -2
- package/src/billing-foundation/billing-info-query.ts +1 -1
- package/src/billing-foundation/events.ts +1 -1
- package/src/billing-foundation/handlers/create-checkout-session.write.ts +1 -1
- package/src/billing-foundation/handlers/create-portal-session.write.ts +1 -1
- package/src/billing-foundation/handlers/list-subscriptions.query.ts +1 -1
- package/src/billing-foundation/handlers/process-event.write.ts +1 -1
- package/src/billing-foundation/handlers/process-payment-event.write.ts +1 -1
- package/src/cap-counter/__tests__/cap-counter.integration.test.ts +1 -1
- package/src/cap-counter/__tests__/enforce-cap.test.ts +7 -0
- package/src/cap-counter/__tests__/stock-cap-guard.integration.test.ts +1 -1
- package/src/cap-counter/__tests__/with-cap-enforcement.integration.test.ts +1 -1
- package/src/cap-counter/book-cap-usage.ts +1 -1
- package/src/cap-counter/changes.json +5 -0
- package/src/cap-counter/enforce-cap.ts +8 -1
- package/src/cap-counter/handlers/get-counter.query.ts +1 -1
- package/src/cap-counter/handlers/increment-rolling.write.ts +1 -1
- package/src/cap-counter/handlers/increment.write.ts +1 -1
- package/src/cap-counter/handlers/mark-soft-warned.write.ts +1 -1
- package/src/cap-overview/handlers/caps-usage.query.ts +1 -1
- package/src/cap-overview/handlers/tenant-caps-list.query.ts +1 -1
- package/src/cap-overview/handlers/tenant-options.query.ts +1 -1
- package/src/channel-in-app/handlers/inbox.query.ts +1 -1
- package/src/channel-in-app/handlers/mark-all-read.write.ts +1 -1
- package/src/channel-in-app/handlers/mark-read.write.ts +1 -1
- package/src/channel-in-app/handlers/unread-count.query.ts +1 -1
- package/src/compliance-profiles/handlers/for-tenant.query.ts +1 -1
- package/src/compliance-profiles/handlers/list-profiles.query.ts +1 -1
- package/src/compliance-profiles/handlers/needs-profile.query.ts +1 -1
- package/src/compliance-profiles/handlers/set-profile.write.ts +1 -1
- package/src/compliance-profiles/handlers/sub-processors.query.ts +1 -1
- package/src/compliance-profiles-ops/handlers/tenants-missing-profile.query.ts +1 -1
- package/src/config/__tests__/backing-secrets.integration.test.ts +1 -1
- package/src/config/__tests__/config.integration.test.ts +1 -1
- package/src/config/__tests__/tz-resolution.integration.test.ts +1 -1
- package/src/config/handlers/cascade.query.ts +1 -1
- package/src/config/handlers/readiness.query.ts +1 -1
- package/src/config/handlers/reset.write.ts +1 -1
- package/src/config/handlers/schema.query.ts +1 -1
- package/src/config/handlers/set.write.ts +1 -1
- package/src/config/handlers/values.query.ts +1 -1
- package/src/crypto-shredding/handlers/forget-subject.write.ts +1 -1
- package/src/custom-fields/__tests__/audit-integration.integration.test.ts +1 -1
- package/src/custom-fields/__tests__/cross-tenant-field-delete.integration.test.ts +1 -1
- package/src/custom-fields/__tests__/cross-tenant-set-write.integration.test.ts +1 -1
- package/src/custom-fields/__tests__/custom-fields.integration.test.ts +1 -1
- package/src/custom-fields/__tests__/field-access.integration.test.ts +1 -1
- package/src/custom-fields/__tests__/quota.integration.test.ts +1 -1
- package/src/custom-fields/__tests__/retention.integration.test.ts +1 -1
- package/src/custom-fields/__tests__/user-data-rights.integration.test.ts +1 -1
- package/src/custom-fields/events.ts +1 -1
- package/src/custom-fields/feature.ts +1 -1
- package/src/custom-fields/handlers/clear-custom-field.write.ts +1 -1
- package/src/custom-fields/handlers/set-custom-field.write.ts +1 -1
- package/src/custom-fields/lib/value-schema.ts +1 -1
- package/src/custom-fields/schemas.ts +1 -1
- package/src/data-retention/handlers/policy-for.query.ts +1 -1
- package/src/data-retention/override-schema.ts +1 -1
- package/src/delivery/__tests__/delivery-pii-kms.integration.test.ts +1 -1
- package/src/delivery/__tests__/delivery.integration.test.ts +1 -1
- package/src/delivery/events.ts +1 -1
- package/src/delivery/feature.ts +1 -1
- package/src/delivery/handlers/log.query.ts +1 -1
- package/src/delivery/handlers/preferences.query.ts +1 -1
- package/src/delivery/handlers/set-preference.write.ts +1 -1
- package/src/delivery/jobs.ts +1 -1
- package/src/delivery/unsubscribe.ts +1 -1
- package/src/derivatives-sharp/__tests__/derivatives-sharp.integration.test.ts +1 -1
- package/src/document-ingest-foundation/events.ts +1 -1
- package/src/document-ingest-foundation/feature.ts +1 -1
- package/src/feature-toggles/__tests__/feature-toggles.integration.test.ts +1 -1
- package/src/feature-toggles/events.ts +1 -1
- package/src/feature-toggles/handlers/list.query.ts +1 -1
- package/src/feature-toggles/handlers/registered.query.ts +1 -1
- package/src/feature-toggles/handlers/set.write.ts +1 -1
- package/src/file-derivatives/handlers/public-variant.query.ts +1 -1
- package/src/file-foundation/__tests__/file-foundation.integration.test.ts +1 -1
- package/src/files-tenant-data/handlers/sweep-orphaned-derivatives.job.ts +1 -1
- package/src/folders/handlers/delete-folder.write.ts +1 -1
- package/src/folders/schemas.ts +1 -1
- package/src/form-draft/schemas.ts +1 -1
- package/src/inbound-mail-foundation/events.ts +1 -1
- package/src/inbound-mail-foundation/handlers/connect-account.write.ts +1 -1
- package/src/inbound-mail-foundation/handlers/disconnect-account.write.ts +1 -1
- package/src/inbound-mail-foundation/handlers/ingest-message.write.ts +1 -1
- package/src/inbound-mail-foundation/handlers/list-accounts.query.ts +1 -1
- package/src/inbound-mail-foundation/handlers/list-messages.query.ts +1 -1
- package/src/inbound-mail-foundation/handlers/update-account.write.ts +1 -1
- package/src/inbound-provider-imap/credential-document.ts +1 -1
- package/src/jobs/__tests__/jobs-catalog.integration.test.ts +1 -1
- package/src/jobs/__tests__/tenant-job-failures.integration.test.ts +1 -1
- package/src/jobs/events.ts +1 -1
- package/src/jobs/handlers/catalog.query.ts +1 -1
- package/src/jobs/handlers/detail.query.ts +1 -1
- package/src/jobs/handlers/list.query.ts +1 -1
- package/src/jobs/handlers/projection-rebuild.job.ts +1 -1
- package/src/jobs/handlers/reindex-entity.job.ts +1 -1
- package/src/jobs/handlers/retry.write.ts +1 -1
- package/src/jobs/handlers/tenant-failures.query.ts +1 -1
- package/src/jobs/handlers/trigger.write.ts +1 -1
- package/src/ledger/handlers/reports.query.ts +1 -1
- package/src/ledger/schemas.ts +1 -1
- package/src/mail-foundation/__tests__/mail-foundation.integration.test.ts +1 -1
- package/src/managed-pages/handlers/branding.query.ts +1 -1
- package/src/managed-pages/handlers/by-slug.query.ts +1 -1
- package/src/managed-pages/handlers/by-tenant-published.query.ts +1 -1
- package/src/managed-pages/handlers/set.write.ts +1 -1
- package/src/notes-history/changes.json +7 -0
- package/src/notes-history/schemas.ts +1 -1
- package/src/notes-history/web/notes-section.tsx +37 -36
- package/src/personal-access-tokens/feature.ts +10 -0
- package/src/personal-access-tokens/handlers/available-scopes.query.ts +1 -1
- package/src/personal-access-tokens/handlers/create.write.ts +1 -1
- package/src/personal-access-tokens/handlers/list.query.ts +1 -1
- package/src/personal-access-tokens/handlers/revoke.write.ts +18 -2
- package/src/personal-access-tokens/index.ts +7 -0
- package/src/personal-access-tokens/pat-revoked-event.ts +23 -0
- package/src/personal-access-tokens/revoke-for-user.ts +31 -0
- package/src/rate-limiting/__tests__/rate-limiting.integration.test.ts +1 -1
- package/src/rate-limiting/handlers/status.query.ts +1 -1
- package/src/readiness/handlers/status.query.ts +1 -1
- package/src/secrets/feature.ts +1 -1
- package/src/secrets/handlers/delete.write.ts +1 -1
- package/src/secrets/handlers/list.query.ts +1 -1
- package/src/secrets/handlers/set.write.ts +1 -1
- package/src/secrets/secrets-context.ts +1 -1
- package/src/seo/handlers/seo-config.query.ts +1 -1
- package/src/sessions/handlers/detail.query.ts +1 -1
- package/src/sessions/handlers/list.query.ts +1 -1
- package/src/sessions/handlers/mine.query.ts +1 -1
- package/src/sessions/handlers/revoke-all-for-user.write.ts +1 -1
- package/src/sessions/handlers/revoke-all-others.write.ts +2 -1
- package/src/sessions/handlers/revoke.write.ts +1 -1
- package/src/sessions/session-callbacks.ts +26 -1
- package/src/sessions/session-revoked-event.ts +9 -1
- package/src/shared/__tests__/row-bound-grant.integration.test.ts +1 -1
- package/src/step-dispatcher/mail-runner.ts +1 -1
- package/src/step-dispatcher/webhook-runner.ts +1 -1
- package/src/subscription-mollie/feature.ts +1 -1
- package/src/subscription-stripe/feature.ts +1 -1
- package/src/tags/schemas.ts +1 -1
- package/src/template-resolver/handlers/by-slug.query.ts +1 -1
- package/src/template-resolver/handlers/by-tenant.query.ts +1 -1
- package/src/template-resolver/handlers/collection-item.query.ts +1 -1
- package/src/template-resolver/handlers/collection-list.query.ts +1 -1
- package/src/template-resolver/handlers/collection-set.write.ts +1 -1
- package/src/template-resolver/handlers/find-by-id.query.ts +1 -1
- package/src/template-resolver/handlers/list.query.ts +1 -1
- package/src/template-resolver/handlers/set.write.ts +1 -1
- package/src/template-resolver/handlers/shared.ts +1 -1
- package/src/template-resolver/handlers/toggle-status.write.ts +1 -1
- package/src/template-resolver/handlers/upsert-tenant.write.ts +1 -1
- package/src/tenant/__tests__/tenant-timezone-boot.integration.test.ts +1 -1
- package/src/tenant/handlers/active-tenant-ids.query.ts +1 -1
- package/src/tenant/handlers/add-member.write.ts +1 -1
- package/src/tenant/handlers/cancel-invitation.write.ts +1 -1
- package/src/tenant/handlers/create.write.ts +1 -1
- package/src/tenant/handlers/invitations.query.ts +1 -1
- package/src/tenant/handlers/list.query.ts +1 -1
- package/src/tenant/handlers/me.query.ts +1 -1
- package/src/tenant/handlers/member-directory.query.ts +1 -1
- package/src/tenant/handlers/members.query.ts +1 -1
- package/src/tenant/handlers/memberships.query.ts +1 -1
- package/src/tenant/handlers/remove-member.write.ts +1 -1
- package/src/tenant/handlers/resolve-user-ids.query.ts +1 -1
- package/src/tenant/handlers/team-list.query.ts +1 -1
- package/src/tenant/handlers/tenant-directory.query.ts +1 -1
- package/src/tenant/handlers/toggle-enabled.write.ts +1 -1
- package/src/tenant/handlers/update-member-roles.write.ts +1 -1
- package/src/tenant/handlers/update.write.ts +1 -1
- package/src/tenant-handover/events.ts +1 -1
- package/src/tenant-handover/handlers/claim.write.ts +1 -1
- package/src/tenant-lifecycle/events.ts +1 -1
- package/src/tenant-lifecycle/handlers/cancel-destruction.write.ts +1 -1
- package/src/tenant-lifecycle/handlers/request-destruction.write.ts +1 -1
- package/src/tenant-settings/tenant-defaults.ts +1 -1
- package/src/tier-engine/__tests__/tier-resolver.integration.test.ts +1 -1
- package/src/tier-engine/feature.ts +1 -1
- package/src/tier-engine/handlers/active-tier.query.ts +1 -1
- package/src/tier-engine/handlers/get-tenant-tier.query.ts +1 -1
- package/src/tier-engine/handlers/set-tenant-tier.write.ts +1 -1
- package/src/user/__tests__/user-global-tenancy.integration.test.ts +1 -1
- package/src/user/handlers/create.write.ts +1 -1
- package/src/user/handlers/find-for-auth.query.ts +1 -1
- package/src/user/handlers/me.query.ts +1 -1
- package/src/user/handlers/update.write.ts +1 -1
- package/src/user/roles-input-schema.ts +1 -1
- package/src/user-data-rights/__tests__/boot-checks.test.ts +1 -1
- package/src/user-data-rights/changes.json +6 -0
- package/src/user-data-rights/feature.ts +1 -0
- package/src/user-data-rights/handlers/cancel-deletion.write.ts +1 -1
- package/src/user-data-rights/handlers/confirm-deletion-by-token.write.ts +1 -1
- package/src/user-data-rights/handlers/download-by-job.query.ts +1 -1
- package/src/user-data-rights/handlers/download-by-token.query.ts +1 -1
- package/src/user-data-rights/handlers/export-status.query.ts +1 -1
- package/src/user-data-rights/handlers/lift-restriction.write.ts +1 -1
- package/src/user-data-rights/handlers/list-download-attempts.query.ts +1 -1
- package/src/user-data-rights/handlers/my-audit-log.query.ts +1 -1
- package/src/user-data-rights/handlers/request-deletion-by-email.write.ts +1 -1
- package/src/user-data-rights/handlers/request-deletion.write.ts +1 -1
- package/src/user-data-rights/handlers/request-export.write.ts +1 -1
- package/src/user-data-rights/handlers/restrict-account.write.ts +1 -1
- package/src/user-data-rights/handlers/run-forget-cleanup.write.ts +1 -1
- package/src/user-profile/handlers/change-email.write.ts +1 -1
- package/src/workflow-runner/__tests__/pending-projection.integration.test.ts +1 -1
- package/src/workflow-runner/__tests__/workflow-runner.integration.test.ts +5 -0
- package/src/workflow-runner/handlers/resume-run.write.ts +1 -1
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
type TenantId,
|
|
29
29
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
30
30
|
import { fileRefsTable } from "@cosmicdrift/kumiko-framework/files";
|
|
31
|
-
import
|
|
31
|
+
import * as z from "zod";
|
|
32
32
|
|
|
33
33
|
type FileRefRow = {
|
|
34
34
|
readonly entityType: string | null;
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
createTestEnvelopeCipher,
|
|
29
29
|
type MutableMasterKeyProvider,
|
|
30
30
|
} from "@cosmicdrift/kumiko-framework/testing";
|
|
31
|
-
import
|
|
31
|
+
import * as z from "zod";
|
|
32
32
|
import { createConfigFeature } from "../../config";
|
|
33
33
|
import { ConfigHandlers } from "../../config/constants";
|
|
34
34
|
import { createConfigAccessorFactory } from "../../config/feature";
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
type FileStorageProvider,
|
|
29
29
|
fileRefsTable,
|
|
30
30
|
} from "@cosmicdrift/kumiko-framework/files";
|
|
31
|
-
import
|
|
31
|
+
import * as z from "zod";
|
|
32
32
|
import { runChunkedMigration } from "../../shared";
|
|
33
33
|
import { tenantTable } from "../../tenant";
|
|
34
34
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AccessRule, WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
2
|
import { UnprocessableError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
|
|
3
|
-
import
|
|
3
|
+
import * as z from "zod";
|
|
4
4
|
import { DEFAULT_FOLDER_ACCESS } from "../constants";
|
|
5
5
|
import { folderAssignmentExecutor, folderExecutor } from "../executor";
|
|
6
6
|
|
package/src/folders/schemas.ts
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
// eraseSubjectKeys macht Event-Log UND Projection unlesbar
|
|
20
20
|
// (crypto-shredding, Muster billing-foundation #800).
|
|
21
21
|
|
|
22
|
-
import
|
|
22
|
+
import * as z from "zod";
|
|
23
23
|
import { INBOUND_MAIL_FOUNDATION_FEATURE, InboundMailAccountStatuses } from "./constants";
|
|
24
24
|
|
|
25
25
|
// Aggregate-types für den event-store.
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
} from "@cosmicdrift/kumiko-framework/crypto";
|
|
20
20
|
import type { WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
21
21
|
import { failUnprocessable } from "@cosmicdrift/kumiko-framework/errors";
|
|
22
|
-
import
|
|
22
|
+
import * as z from "zod";
|
|
23
23
|
import { InboundMailAccountStatuses, InboundMailAuthMethods } from "../constants";
|
|
24
24
|
import { MAIL_ACCOUNT_PII_FIELDS, mailAccountEntity } from "../entities";
|
|
25
25
|
import {
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import type { WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
11
11
|
import { failNotFound } from "@cosmicdrift/kumiko-framework/errors";
|
|
12
|
-
import
|
|
12
|
+
import * as z from "zod";
|
|
13
13
|
import { InboundMailAccountStatuses } from "../constants";
|
|
14
14
|
import {
|
|
15
15
|
MAIL_ACCOUNT_AGGREGATE_TYPE,
|
|
@@ -29,7 +29,7 @@ import { acquireNamespacedAdvisoryLock } from "@cosmicdrift/kumiko-framework/db"
|
|
|
29
29
|
import type { WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
30
30
|
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
31
31
|
import { Temporal } from "temporal-polyfill";
|
|
32
|
-
import
|
|
32
|
+
import * as z from "zod";
|
|
33
33
|
import { inboundMessageAggregateId, mailThreadAggregateId } from "../aggregate-id";
|
|
34
34
|
import {
|
|
35
35
|
INBOUND_MESSAGE_PII_FIELDS,
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
decryptPiiFieldValues,
|
|
13
13
|
} from "@cosmicdrift/kumiko-framework/crypto";
|
|
14
14
|
import type { QueryHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
15
|
-
import
|
|
15
|
+
import * as z from "zod";
|
|
16
16
|
import { MAIL_ACCOUNT_PII_FIELDS } from "../entities";
|
|
17
17
|
import { mailAccountsProjectionTable } from "../projection";
|
|
18
18
|
import { isVisibleToCaller } from "./scope-visibility";
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
decryptPiiFieldValues,
|
|
14
14
|
} from "@cosmicdrift/kumiko-framework/crypto";
|
|
15
15
|
import type { QueryHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
16
|
-
import
|
|
16
|
+
import * as z from "zod";
|
|
17
17
|
import { INBOUND_MESSAGE_PII_FIELDS } from "../entities";
|
|
18
18
|
import { inboundMessagesProjectionTable } from "../projection";
|
|
19
19
|
import { isVisibleToCaller } from "./scope-visibility";
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
import type { WriteHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
7
7
|
import { failNotFound, failUnprocessable } from "@cosmicdrift/kumiko-framework/errors";
|
|
8
|
-
import
|
|
8
|
+
import * as z from "zod";
|
|
9
9
|
import { InboundMailAccountStatuses } from "../constants";
|
|
10
10
|
import {
|
|
11
11
|
MAIL_ACCOUNT_AGGREGATE_TYPE,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// (M365/Gmail, Phase 4/5); der imap-Provider konsumiert
|
|
16
16
|
// nur einen gültigen Access-Token aus dem Slot.
|
|
17
17
|
|
|
18
|
-
import
|
|
18
|
+
import * as z from "zod";
|
|
19
19
|
|
|
20
20
|
export const imapCredentialDocumentSchema = z.object({
|
|
21
21
|
host: z.string().min(1).max(255),
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
TestUsers,
|
|
10
10
|
unsafePushTables,
|
|
11
11
|
} from "@cosmicdrift/kumiko-framework/stack";
|
|
12
|
-
import
|
|
12
|
+
import * as z from "zod";
|
|
13
13
|
import { JobErrors, JobHandlers, JobQueries } from "../constants";
|
|
14
14
|
import { createJobsFeature } from "../feature";
|
|
15
15
|
import { jobRunLogsTable, jobRunsTable } from "../job-run-table";
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
} from "@cosmicdrift/kumiko-framework/stack";
|
|
32
32
|
import { sleep } from "@cosmicdrift/kumiko-framework/testing";
|
|
33
33
|
import type { Hono } from "hono";
|
|
34
|
-
import
|
|
34
|
+
import * as z from "zod";
|
|
35
35
|
import { JobQueries } from "../constants";
|
|
36
36
|
import { createJobsFeature } from "../feature";
|
|
37
37
|
import { createJobRunLogger } from "../job-run-logger";
|
package/src/jobs/events.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// jobRunsTable/jobRunLogsTable, so an out-of-dispatcher write still gets the
|
|
5
5
|
// same validation guarantee ctx.appendEvent used to give it.
|
|
6
6
|
|
|
7
|
-
import
|
|
7
|
+
import * as z from "zod";
|
|
8
8
|
|
|
9
9
|
export const jobLogEntrySchema = z.object({
|
|
10
10
|
level: z.enum(["info", "warn", "error"]),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { fetchOne, selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
2
|
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
4
|
-
import
|
|
4
|
+
import * as z from "zod";
|
|
5
5
|
import { decryptStoredPii, mapWithConcurrency } from "../../shared";
|
|
6
6
|
import { jobRunLogsTable, jobRunsTable } from "../job-run-table";
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { countWhere, selectMany, type WhereObject } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
2
|
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
4
|
-
import
|
|
4
|
+
import * as z from "zod";
|
|
5
5
|
import { decryptStoredPii, mapWithConcurrency } from "../../shared";
|
|
6
6
|
import { jobRunsTable } from "../job-run-table";
|
|
7
7
|
|
|
@@ -4,7 +4,7 @@ import type { DbConnection } from "@cosmicdrift/kumiko-framework/db";
|
|
|
4
4
|
import type { JobHandlerFn } from "@cosmicdrift/kumiko-framework/engine";
|
|
5
5
|
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
6
6
|
import { rebuildProjection } from "@cosmicdrift/kumiko-framework/pipeline";
|
|
7
|
-
import
|
|
7
|
+
import * as z from "zod";
|
|
8
8
|
|
|
9
9
|
export const projectionRebuildPayloadSchema = z.object({
|
|
10
10
|
projection: z.string().min(1),
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import type { JobHandlerFn } from "@cosmicdrift/kumiko-framework/engine";
|
|
8
8
|
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
9
9
|
import { reindexEntity } from "@cosmicdrift/kumiko-framework/search";
|
|
10
|
-
import
|
|
10
|
+
import * as z from "zod";
|
|
11
11
|
|
|
12
12
|
export const reindexEntityPayloadSchema = z.object({
|
|
13
13
|
entity: z.string().min(1),
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from "@cosmicdrift/kumiko-framework/errors";
|
|
10
10
|
import type { JobRunner } from "@cosmicdrift/kumiko-framework/jobs";
|
|
11
11
|
import { parseJsonOrThrow } from "@cosmicdrift/kumiko-framework/utils";
|
|
12
|
-
import
|
|
12
|
+
import * as z from "zod";
|
|
13
13
|
import { decryptStoredPii } from "../../shared";
|
|
14
14
|
import { JobErrors } from "../constants";
|
|
15
15
|
import { jobRunsTable } from "../job-run-table";
|
|
@@ -2,7 +2,7 @@ import { selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
|
2
2
|
import { access, defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import { InternalError } from "@cosmicdrift/kumiko-framework/errors";
|
|
4
4
|
import { parseJsonSafe } from "@cosmicdrift/kumiko-framework/utils";
|
|
5
|
-
import
|
|
5
|
+
import * as z from "zod";
|
|
6
6
|
import { tenantJobFailuresTable } from "../tenant-job-failure-table";
|
|
7
7
|
|
|
8
8
|
type TenantJobFailureRow = {
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
writeFailure,
|
|
8
8
|
} from "@cosmicdrift/kumiko-framework/errors";
|
|
9
9
|
import type { JobRunner } from "@cosmicdrift/kumiko-framework/jobs";
|
|
10
|
-
import
|
|
10
|
+
import * as z from "zod";
|
|
11
11
|
import { JobErrors } from "../constants";
|
|
12
12
|
import { isManualTrigger } from "../is-manual-trigger";
|
|
13
13
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AccessRule, QueryHandlerDef } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
-
import
|
|
2
|
+
import * as z from "zod";
|
|
3
3
|
import { DEFAULT_LEDGER_ACCESS } from "../constants";
|
|
4
4
|
import { accountTable, transactionTable } from "../executor";
|
|
5
5
|
import {
|
package/src/ledger/schemas.ts
CHANGED
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
createTestEnvelopeCipher,
|
|
27
27
|
type MutableMasterKeyProvider,
|
|
28
28
|
} from "@cosmicdrift/kumiko-framework/testing";
|
|
29
|
-
import
|
|
29
|
+
import * as z from "zod";
|
|
30
30
|
import { createConfigFeature } from "../../config";
|
|
31
31
|
import { ConfigHandlers } from "../../config/constants";
|
|
32
32
|
import { createConfigAccessorFactory } from "../../config/feature";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
2
|
-
import
|
|
2
|
+
import * as z from "zod";
|
|
3
3
|
import { MANAGED_PAGES_CSS_FEATURE, readBranding, readCustomCss } from "../branding";
|
|
4
4
|
|
|
5
5
|
// Public branding read for the server-render path. Anonymous-capable: the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { fetchOne } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
2
|
import { defineQueryHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
|
-
import
|
|
3
|
+
import * as z from "zod";
|
|
4
4
|
import { type PageRow, pagesTable } from "../table";
|
|
5
5
|
|
|
6
6
|
// Public-Read by (tenantId, slug, lang). Anonymous-capable (Landing-/
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
crossTenantOverrideDenied,
|
|
5
5
|
defineQueryHandler,
|
|
6
6
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
7
|
-
import
|
|
7
|
+
import * as z from "zod";
|
|
8
8
|
import { type PageRow, pagesTable } from "../table";
|
|
9
9
|
|
|
10
10
|
// Public-Read aller published Pages eines Tenants — Discovery-Quelle für
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
type TenantId,
|
|
7
7
|
} from "@cosmicdrift/kumiko-framework/engine";
|
|
8
8
|
import { writeFailure } from "@cosmicdrift/kumiko-framework/errors";
|
|
9
|
-
import
|
|
9
|
+
import * as z from "zod";
|
|
10
10
|
import { type PageRow, pageEntity, pagesTable } from "../table";
|
|
11
11
|
|
|
12
12
|
const slugSchema = z
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
[
|
|
2
|
+
{
|
|
3
|
+
"version": "0.308.0",
|
|
4
|
+
"type": "breaking",
|
|
5
|
+
"title": "NotesSection no longer wraps its own \"new note\" / \"history\" blocks in a Card (fw#3234)",
|
|
6
|
+
"detail": "As an extension section (its documented usage: `component: { react: { __component: NOTES_SECTION_EXTENSION_NAME } }`), NotesSection was already mounted inside the host's own section frame — its two internal Cards doubled the border/padding there. Both blocks now use a plain container with a `Heading variant=\"section\"` sub-header instead.",
|
|
7
|
+
"migration": "A standalone `<NotesSection entityName={...} entityId={id} />` mount (outside a screen-schema extension section) now renders both blocks without their own card chrome — wrap it in a `Section`/`Card` if the standalone mount needs one."
|
|
8
|
+
},
|
|
2
9
|
{
|
|
3
10
|
"version": "0.244.0",
|
|
4
11
|
"type": "improvement",
|
|
@@ -48,7 +48,7 @@ export function NotesSection({
|
|
|
48
48
|
readonly entityName: string;
|
|
49
49
|
readonly entityId: string | null;
|
|
50
50
|
}): ReactNode {
|
|
51
|
-
const { Banner, Button,
|
|
51
|
+
const { Banner, Button, Grid, Heading, Text, Input } = usePrimitives();
|
|
52
52
|
const t = useTranslation();
|
|
53
53
|
const dispatcher = useDispatcher();
|
|
54
54
|
const enabled = entityId !== null;
|
|
@@ -117,43 +117,44 @@ export function NotesSection({
|
|
|
117
117
|
})();
|
|
118
118
|
};
|
|
119
119
|
|
|
120
|
+
// No own Card/SectionCard here — the host (ExtensionSectionMount) already
|
|
121
|
+
// frames this whole component in one card; a nested card would double the
|
|
122
|
+
// border/padding. "New note" and "History" are sub-headers within that
|
|
123
|
+
// single frame instead.
|
|
120
124
|
return (
|
|
121
125
|
<Grid columns={1} testId="notes-section">
|
|
122
|
-
<
|
|
123
|
-
<
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
</Card>
|
|
126
|
+
<div className="flex flex-col gap-3" data-testid="notes-section-new">
|
|
127
|
+
<Heading variant="section">{t("notesHistory.section.newNoteTitle")}</Heading>
|
|
128
|
+
<Input
|
|
129
|
+
kind="textarea"
|
|
130
|
+
id="notes-section-draft"
|
|
131
|
+
name="draft"
|
|
132
|
+
value={draft}
|
|
133
|
+
onChange={setDraft}
|
|
134
|
+
onSubmitShortcut={() => {
|
|
135
|
+
if (!busy && draft.trim() !== "") addNote();
|
|
136
|
+
}}
|
|
137
|
+
/>
|
|
138
|
+
<div className="flex items-center justify-between gap-2">
|
|
139
|
+
<Text variant="small">{t("notesHistory.section.shortcutHint")}</Text>
|
|
140
|
+
<Button
|
|
141
|
+
variant="primary"
|
|
142
|
+
disabled={busy || draft.trim() === ""}
|
|
143
|
+
onClick={() => addNote()}
|
|
144
|
+
testId="notes-section-add"
|
|
145
|
+
>
|
|
146
|
+
{busy ? t("notesHistory.section.working") : t("notesHistory.section.add")}
|
|
147
|
+
</Button>
|
|
148
|
+
</div>
|
|
149
|
+
{errorKey !== null && (
|
|
150
|
+
<Banner variant="error" testId="notes-section-action-error">
|
|
151
|
+
<Text>{t(errorKey)}</Text>
|
|
152
|
+
</Banner>
|
|
153
|
+
)}
|
|
154
|
+
</div>
|
|
152
155
|
|
|
153
|
-
<
|
|
154
|
-
|
|
155
|
-
testId="notes-section-history"
|
|
156
|
-
>
|
|
156
|
+
<div className="flex flex-col gap-3" data-testid="notes-section-history">
|
|
157
|
+
<Heading variant="section">{t("notesHistory.section.historyTitle")}</Heading>
|
|
157
158
|
{rows.length === 0 ? (
|
|
158
159
|
<Text variant="small">{t("notesHistory.section.empty")}</Text>
|
|
159
160
|
) : (
|
|
@@ -178,7 +179,7 @@ export function NotesSection({
|
|
|
178
179
|
))}
|
|
179
180
|
</div>
|
|
180
181
|
)}
|
|
181
|
-
</
|
|
182
|
+
</div>
|
|
182
183
|
</Grid>
|
|
183
184
|
);
|
|
184
185
|
}
|
|
@@ -11,6 +11,7 @@ import { type CreatePatOptions, createPatCreateHandler } from "./handlers/create
|
|
|
11
11
|
import { listPatQuery } from "./handlers/list.query";
|
|
12
12
|
import { revokePatWrite } from "./handlers/revoke.write";
|
|
13
13
|
import { PAT_FEATURE_I18N, patScopeOptionTranslations } from "./i18n";
|
|
14
|
+
import { PAT_REVOKED_EVENT_SHORT, patRevokedSchema } from "./pat-revoked-event";
|
|
14
15
|
import { createPatResolver } from "./resolver";
|
|
15
16
|
import { apiTokenEntity } from "./schema/api-token";
|
|
16
17
|
import type { PatScopeConfig } from "./scopes";
|
|
@@ -114,6 +115,15 @@ export function createPersonalAccessTokensFeature(
|
|
|
114
115
|
piiEncryptedOnWrite: true,
|
|
115
116
|
});
|
|
116
117
|
|
|
118
|
+
// Custom domain-event for cross-instance access-invalidation,
|
|
119
|
+
// mirroring sessions' SESSION_REVOKED_EVENT_SHORT. r.defineEvent
|
|
120
|
+
// registers the schema so ctx.unsafeAppendEvent (revoke) enforces it at
|
|
121
|
+
// append time. revoke-for-user.ts appends via the low-level append()
|
|
122
|
+
// instead (needs to anchor on SYSTEM_TENANT_ID) — same guarantee via a
|
|
123
|
+
// different path. No projection: the payload IS the read, consumed
|
|
124
|
+
// directly off the event-store NOTIFY.
|
|
125
|
+
r.defineEvent(PAT_REVOKED_EVENT_SHORT, patRevokedSchema, { piiFields: "none" });
|
|
126
|
+
|
|
117
127
|
// Password-change auto-revoke — mirrors sessions' own
|
|
118
128
|
// autoRevokeOnPasswordChange postSave hook, including WHY it's a
|
|
119
129
|
// late-bind callback rather than direct ctx.db use: user:write:user:update
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import { UnprocessableError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
|
|
9
9
|
import { generateId } from "@cosmicdrift/kumiko-framework/utils";
|
|
10
10
|
import { Temporal } from "temporal-polyfill";
|
|
11
|
-
import
|
|
11
|
+
import * as z from "zod";
|
|
12
12
|
import { encryptForDirectWrite, verifyPassword } from "../../shared";
|
|
13
13
|
import { UserQueries } from "../../user";
|
|
14
14
|
import { PAT_DEFAULT_EXPIRES_IN_DAYS, PatErrors } from "../constants";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { selectMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
2
|
import { definePagedQueryHandler, MAX_LIST_LIMIT } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
|
-
import
|
|
3
|
+
import * as z from "zod";
|
|
4
4
|
import { decryptStoredPii } from "../../shared";
|
|
5
5
|
import { isExpiredAt } from "../expiry";
|
|
6
6
|
import { apiTokenTable } from "../schema/api-token";
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { updateMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
2
|
import { defineWriteHandler } from "@cosmicdrift/kumiko-framework/engine";
|
|
3
3
|
import { UnprocessableError, writeFailure } from "@cosmicdrift/kumiko-framework/errors";
|
|
4
|
+
import { generateId } from "@cosmicdrift/kumiko-framework/utils";
|
|
4
5
|
import { Temporal } from "temporal-polyfill";
|
|
5
|
-
import
|
|
6
|
+
import * as z from "zod";
|
|
6
7
|
import { PatErrors } from "../constants";
|
|
8
|
+
import { PAT_REVOKED_AGGREGATE_TYPE, PAT_REVOKED_EVENT_QN } from "../pat-revoked-event";
|
|
7
9
|
import { apiTokenTable } from "../schema/api-token";
|
|
8
10
|
|
|
9
11
|
// Revoke one of the caller's own tokens. Ownership is enforced in the WHERE
|
|
@@ -30,7 +32,21 @@ export const revokePatWrite = defineWriteHandler({
|
|
|
30
32
|
{ revokedAt: Temporal.Now.instant() },
|
|
31
33
|
{ id: event.payload.id, userId: event.user.id, revokedAt: null },
|
|
32
34
|
);
|
|
33
|
-
if (updated.length > 0)
|
|
35
|
+
if (updated.length > 0) {
|
|
36
|
+
// Lightweight append alongside the direct-write above, mirroring
|
|
37
|
+
// sessions' revoke.write.ts. NOT a lifecycle event for
|
|
38
|
+
// store_api_tokens (that table stays an unmanaged direct-write store,
|
|
39
|
+
// see feature.ts). Without this, the access-invalidation consumer
|
|
40
|
+
// never hears about the revoke and an already-open SSE stream
|
|
41
|
+
// authenticated by this exact token survives it.
|
|
42
|
+
await ctx.unsafeAppendEvent({
|
|
43
|
+
aggregateId: generateId(),
|
|
44
|
+
aggregateType: PAT_REVOKED_AGGREGATE_TYPE,
|
|
45
|
+
type: PAT_REVOKED_EVENT_QN,
|
|
46
|
+
payload: { userId: event.user.id, tokenIds: [event.payload.id] },
|
|
47
|
+
});
|
|
48
|
+
return { isSuccess: true, data: { id: event.payload.id } };
|
|
49
|
+
}
|
|
34
50
|
return writeFailure(
|
|
35
51
|
new UnprocessableError(PatErrors.ownershipDenied, {
|
|
36
52
|
i18nKey: "errors.ownershipDenied",
|
|
@@ -10,6 +10,13 @@ export {
|
|
|
10
10
|
} from "./feature";
|
|
11
11
|
export type { CreatePatOptions, PatMfaVerifyResult } from "./handlers/create.write";
|
|
12
12
|
export { hashPatToken, mintPatToken } from "./hash";
|
|
13
|
+
export {
|
|
14
|
+
PAT_REVOKED_AGGREGATE_TYPE,
|
|
15
|
+
PAT_REVOKED_EVENT_QN,
|
|
16
|
+
PAT_REVOKED_EVENT_SHORT,
|
|
17
|
+
type PatRevokedPayload,
|
|
18
|
+
patRevokedSchema,
|
|
19
|
+
} from "./pat-revoked-event";
|
|
13
20
|
export { createPatResolver } from "./resolver";
|
|
14
21
|
export { revokeAllPatTokensForUser } from "./revoke-for-user";
|
|
15
22
|
export { apiTokenEntity, apiTokenTable } from "./schema/api-token";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
|
|
3
|
+
// Lightweight custom event appended alongside the direct-write updateMany()
|
|
4
|
+
// in revoke.write.ts / revoke-for-user.ts (mirrors sessions'
|
|
5
|
+
// session-revoked-event.ts). apiTokenTable itself stays an unmanaged
|
|
6
|
+
// direct-write store (see feature.ts) — this event is NOT a CRUD/lifecycle
|
|
7
|
+
// event for that table and carries no projection. Its only job is to give
|
|
8
|
+
// the access-invalidation consumer something to LISTEN for, keyed by the
|
|
9
|
+
// affected userId, so a revoked PAT's open SSE stream closes.
|
|
10
|
+
export const PAT_REVOKED_EVENT_SHORT = "pat-revoked" as const;
|
|
11
|
+
export const PAT_REVOKED_EVENT_QN = "personal-access-tokens:event:pat-revoked" as const;
|
|
12
|
+
|
|
13
|
+
// Own aggregate type, decoupled from apiTokenEntity's implicit
|
|
14
|
+
// "api-token" — each revoke action mints a fresh aggregate id (no
|
|
15
|
+
// predecessor to satisfy, no version_conflict against concurrent revokes).
|
|
16
|
+
export const PAT_REVOKED_AGGREGATE_TYPE = "api-token-revocation" as const;
|
|
17
|
+
|
|
18
|
+
export const patRevokedSchema = z.object({
|
|
19
|
+
userId: z.string().min(1),
|
|
20
|
+
tokenIds: z.array(z.uuid()).min(1),
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export type PatRevokedPayload = z.infer<typeof patRevokedSchema>;
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import { updateMany } from "@cosmicdrift/kumiko-framework/bun-db";
|
|
2
2
|
import type { DbRunner } from "@cosmicdrift/kumiko-framework/db";
|
|
3
|
+
import { SYSTEM_TENANT_ID } from "@cosmicdrift/kumiko-framework/engine";
|
|
4
|
+
import { append } from "@cosmicdrift/kumiko-framework/event-store";
|
|
5
|
+
import { generateId } from "@cosmicdrift/kumiko-framework/utils";
|
|
3
6
|
import { Temporal } from "temporal-polyfill";
|
|
7
|
+
import {
|
|
8
|
+
PAT_REVOKED_AGGREGATE_TYPE,
|
|
9
|
+
PAT_REVOKED_EVENT_QN,
|
|
10
|
+
patRevokedSchema,
|
|
11
|
+
} from "./pat-revoked-event";
|
|
4
12
|
import { apiTokenTable } from "./schema/api-token";
|
|
5
13
|
|
|
6
14
|
// Cross-tenant revoke: password-change and MFA-enable/disable are account-
|
|
@@ -14,5 +22,28 @@ export async function revokeAllPatTokensForUser(db: DbRunner, userId: string): P
|
|
|
14
22
|
{ revokedAt: Temporal.Now.instant() },
|
|
15
23
|
{ userId, revokedAt: null },
|
|
16
24
|
);
|
|
25
|
+
|
|
26
|
+
// Same reasoning as sessionMassRevoker's append — this raw
|
|
27
|
+
// callback has no dispatcher ctx to call unsafeAppendEvent from, so it
|
|
28
|
+
// uses the low-level append() directly, anchored on SYSTEM_TENANT_ID like
|
|
29
|
+
// sessions' cross-tenant writes. Without it, the access-invalidation
|
|
30
|
+
// consumer never hears about a password-change/MFA-toggle/forget-subject
|
|
31
|
+
// PAT revoke and any already-open SSE stream on those tokens survives it.
|
|
32
|
+
if (updated.length > 0) {
|
|
33
|
+
const payload = patRevokedSchema.parse({
|
|
34
|
+
userId,
|
|
35
|
+
tokenIds: updated.map((row) => row.id),
|
|
36
|
+
});
|
|
37
|
+
await append(db, {
|
|
38
|
+
aggregateId: generateId(),
|
|
39
|
+
aggregateType: PAT_REVOKED_AGGREGATE_TYPE,
|
|
40
|
+
tenantId: SYSTEM_TENANT_ID,
|
|
41
|
+
expectedVersion: 0,
|
|
42
|
+
type: PAT_REVOKED_EVENT_QN,
|
|
43
|
+
payload,
|
|
44
|
+
metadata: { userId },
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
17
48
|
return updated.length;
|
|
18
49
|
}
|