@critical-path/core 0.26.0 → 0.27.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/CHANGELOG.md +28 -0
- package/README.md +13 -0
- package/dist/domain/events.d.ts +5 -0
- package/dist/domain/events.d.ts.map +1 -1
- package/dist/domain/events.js +34 -0
- package/dist/domain/events.js.map +1 -1
- package/dist/engine/index.d.ts +29 -2
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +102 -56
- package/dist/engine/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/schemas/index.d.ts +91 -48
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +13 -0
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/schemas.test.js +1 -0
- package/dist/schemas/schemas.test.js.map +1 -1
- package/dist/store/firebase.d.ts +3 -0
- package/dist/store/firebase.d.ts.map +1 -1
- package/dist/store/firebase.js +21 -0
- package/dist/store/firebase.js.map +1 -1
- package/dist/store/firebase.test.js +17 -0
- package/dist/store/firebase.test.js.map +1 -1
- package/dist/store/index.d.ts +6 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +14 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite.d.ts +4 -0
- package/dist/store/sqlite.d.ts.map +1 -1
- package/dist/store/sqlite.js +42 -8
- package/dist/store/sqlite.js.map +1 -1
- package/dist/types/index.d.ts +16 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/webhooks/dispatcher.d.ts +80 -0
- package/dist/webhooks/dispatcher.d.ts.map +1 -0
- package/dist/webhooks/dispatcher.js +133 -0
- package/dist/webhooks/dispatcher.js.map +1 -0
- package/dist/webhooks/index.d.ts +3 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +3 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/signature.d.ts +28 -0
- package/dist/webhooks/signature.d.ts.map +1 -0
- package/dist/webhooks/signature.js +42 -0
- package/dist/webhooks/signature.js.map +1 -0
- package/dist/webhooks/webhooks.test.d.ts +2 -0
- package/dist/webhooks/webhooks.test.d.ts.map +1 -0
- package/dist/webhooks/webhooks.test.js +153 -0
- package/dist/webhooks/webhooks.test.js.map +1 -0
- package/package.json +1 -1
- package/src/domain/events.ts +42 -3
- package/src/engine/index.ts +124 -59
- package/src/index.ts +1 -0
- package/src/schemas/index.ts +17 -0
- package/src/schemas/schemas.test.ts +6 -3
- package/src/store/firebase.test.ts +20 -0
- package/src/store/firebase.ts +22 -0
- package/src/store/index.ts +19 -0
- package/src/store/sqlite.ts +54 -7
- package/src/types/index.ts +15 -28
- package/src/webhooks/dispatcher.ts +190 -0
- package/src/webhooks/index.ts +2 -0
- package/src/webhooks/signature.ts +57 -0
- package/src/webhooks/webhooks.test.ts +200 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @critical-path/core
|
|
2
2
|
|
|
3
|
+
## 0.27.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 1a516bd: Signed, retried webhooks driven by domain events.
|
|
8
|
+
|
|
9
|
+
**@critical-path/core**
|
|
10
|
+
- **BREAKING:** webhooks are delivered from the domain event bus instead of ad-hoc calls, so every published event is deliverable, including `task.updated`, `time.logged` and `dependency.added`.
|
|
11
|
+
- The payload is now `{ id, event, occurredAt, tenantId?, data }`, where `data` is the domain event payload.
|
|
12
|
+
- A status change delivers both `task.status_changed` and `task.updated` to webhooks subscribed to both.
|
|
13
|
+
- Deliveries carry `X-CriticalPath-Event`, `X-CriticalPath-Delivery` (stable across retries), `X-CriticalPath-Timestamp` and `X-CriticalPath-Signature` (HMAC-SHA256). New exports: `verifyWebhookSignature`, `signWebhookPayload`, `generateWebhookSecret`.
|
|
14
|
+
- New `webhookDelivery` engine option:
|
|
15
|
+
- `timeoutMs` (default 10s), `maxAttempts` (default 5) and exponential `retryBaseDelayMs`.
|
|
16
|
+
- A pluggable `queue`; the default is in-process.
|
|
17
|
+
- `allowPrivateUrls` (default `false`).
|
|
18
|
+
- `onDelivered` and `onDeliveryFailed` callbacks.
|
|
19
|
+
- `engine.webhooks` exposes `deliver(job)` for custom queues and `idle()` for tests.
|
|
20
|
+
- `config.webhooks` are now honoured as static webhooks.
|
|
21
|
+
- New engine methods `getWebhooks`, `getWebhook`, `createWebhook` and `updateWebhook`/`deleteWebhook`. They require `workspace.manage` and are tenant-scoped. Secrets are generated when omitted, returned only on creation, and redacted afterwards (`PublicWebhook.hasSecret`).
|
|
22
|
+
- **BREAKING:** `WebhookRepository` gains `getWebhook`, `updateWebhook` and `deleteWebhook`; custom storage adapters must implement them. `Webhook` gains `tenantId`, and `WebhookEvent` is now any domain event name or `'*'`. SQLite now persists the webhook `name` and `tenantId`.
|
|
23
|
+
- New `DOMAIN_EVENT_NAMES`. The `project.deleted` and `workflow.deleted` payloads include `tenantId`; `attachment.deleted` includes `projectId`.
|
|
24
|
+
|
|
25
|
+
**@critical-path/server**
|
|
26
|
+
- New `GET/POST /webhooks` and `GET/PATCH/DELETE /webhooks/:id` routes. Event names are validated.
|
|
27
|
+
|
|
28
|
+
**@critical-path/client**
|
|
29
|
+
- New `getWebhooks`, `createWebhook`, `updateWebhook` and `deleteWebhook`.
|
|
30
|
+
|
|
3
31
|
## 0.26.0
|
|
4
32
|
|
|
5
33
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -145,6 +145,19 @@ await asVic.createTask({ projectId, title: 'x' }); // ForbiddenError if vic is o
|
|
|
145
145
|
|
|
146
146
|
Checks run on `withActor` views (the base engine is trusted). Roles come from `project.members` (`{ userId, role }`, roles `viewer` < `contributor` < `project_manager` < `admin`), and project creators become `admin`. Actors with `roles: ['admin']` are superusers. Projects the actor cannot read, or that belong to another tenant, behave as if they do not exist (`NotFoundError`). Lists are filtered. Records created through a view are stamped with the actor's `tenantId`. See the docs site's Authorization page for the full permission matrix and custom policies.
|
|
147
147
|
|
|
148
|
+
#### Webhooks
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
const { webhook, secret } = await engine.createWebhook({
|
|
152
|
+
name: 'CI',
|
|
153
|
+
url: 'https://ci.example.com/hooks',
|
|
154
|
+
events: ['task.created', 'task.status_changed'] // or ['*']
|
|
155
|
+
});
|
|
156
|
+
// Receivers: verifyWebhookSignature({ secret, body, timestamp, signature })
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Every domain event can be delivered. Deliveries carry `X-CriticalPath-Signature` (HMAC-SHA256 over `"<timestamp>.<body>"`), time out after 10s, and retry with exponential backoff (`webhookDelivery` options). The default queue is in-process; pass `webhookDelivery.queue` for durable delivery and call `engine.webhooks.deliver(job)` from your worker. Secrets are only returned on creation.
|
|
160
|
+
|
|
148
161
|
#### Attributing Mutations to a User (`withActor`)
|
|
149
162
|
|
|
150
163
|
```ts
|
package/dist/domain/events.d.ts
CHANGED
|
@@ -136,6 +136,7 @@ export interface AttachmentDeletedEvent extends DomainEvent<{
|
|
|
136
136
|
attachmentId: string;
|
|
137
137
|
storageKey?: string;
|
|
138
138
|
url: string;
|
|
139
|
+
projectId?: string;
|
|
139
140
|
}> {
|
|
140
141
|
readonly name: 'attachment.deleted';
|
|
141
142
|
readonly aggregateType: 'Attachment';
|
|
@@ -163,6 +164,7 @@ export interface ProjectDeletedEvent extends DomainEvent<{
|
|
|
163
164
|
projectId: string;
|
|
164
165
|
name: string;
|
|
165
166
|
deletedTaskIds: string[];
|
|
167
|
+
tenantId?: string;
|
|
166
168
|
}> {
|
|
167
169
|
readonly name: 'project.deleted';
|
|
168
170
|
readonly aggregateType: 'Project';
|
|
@@ -183,6 +185,7 @@ export interface WorkflowUpdatedEvent extends DomainEvent<{
|
|
|
183
185
|
export interface WorkflowDeletedEvent extends DomainEvent<{
|
|
184
186
|
workflowId: string;
|
|
185
187
|
name: string;
|
|
188
|
+
tenantId?: string;
|
|
186
189
|
}> {
|
|
187
190
|
readonly name: 'workflow.deleted';
|
|
188
191
|
readonly aggregateType: 'Workflow';
|
|
@@ -248,4 +251,6 @@ export declare class DomainEventBus {
|
|
|
248
251
|
publishAll(events: DomainEvent[]): Promise<void>;
|
|
249
252
|
clear(): void;
|
|
250
253
|
}
|
|
254
|
+
/** Every domain event name, e.g. for validating webhook subscriptions at runtime. */
|
|
255
|
+
export declare const DOMAIN_EVENT_NAMES: readonly ["attachment.created", "attachment.deleted", "comment.created", "comment.deleted", "comment.reaction.added", "comment.reaction.removed", "comment.updated", "container.created", "deliverable.created", "deliverable.deleted", "deliverable.status_changed", "deliverable.updated", "dependency.added", "iteration.completed", "iteration.started", "project.created", "project.deleted", "project.updated", "task.blocked", "task.created", "task.deleted", "task.status_changed", "task.unblocked", "task.updated", "team.created", "time.logged", "workflow.created", "workflow.deleted", "workflow.updated"];
|
|
251
256
|
//# sourceMappingURL=events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/domain/events.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/domain/events.ts"],"names":[],"mappings":"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"}
|
package/dist/domain/events.js
CHANGED
|
@@ -32,4 +32,38 @@ export class DomainEventBus {
|
|
|
32
32
|
this.handlers.clear();
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
/** Every domain event name, e.g. for validating webhook subscriptions at runtime. */
|
|
36
|
+
export const DOMAIN_EVENT_NAMES = [
|
|
37
|
+
'attachment.created',
|
|
38
|
+
'attachment.deleted',
|
|
39
|
+
'comment.created',
|
|
40
|
+
'comment.deleted',
|
|
41
|
+
'comment.reaction.added',
|
|
42
|
+
'comment.reaction.removed',
|
|
43
|
+
'comment.updated',
|
|
44
|
+
'container.created',
|
|
45
|
+
'deliverable.created',
|
|
46
|
+
'deliverable.deleted',
|
|
47
|
+
'deliverable.status_changed',
|
|
48
|
+
'deliverable.updated',
|
|
49
|
+
'dependency.added',
|
|
50
|
+
'iteration.completed',
|
|
51
|
+
'iteration.started',
|
|
52
|
+
'project.created',
|
|
53
|
+
'project.deleted',
|
|
54
|
+
'project.updated',
|
|
55
|
+
'task.blocked',
|
|
56
|
+
'task.created',
|
|
57
|
+
'task.deleted',
|
|
58
|
+
'task.status_changed',
|
|
59
|
+
'task.unblocked',
|
|
60
|
+
'task.updated',
|
|
61
|
+
'team.created',
|
|
62
|
+
'time.logged',
|
|
63
|
+
'workflow.created',
|
|
64
|
+
'workflow.deleted',
|
|
65
|
+
'workflow.updated'
|
|
66
|
+
];
|
|
67
|
+
const _allDomainEventsListed = true;
|
|
68
|
+
void _allDomainEventsListed;
|
|
35
69
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/domain/events.ts"],"names":[],"mappings":"AAqOA,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAG,IAAI,GAAG,EAA0C,CAAC;IAErE,SAAS,CACP,SAA0B,EAC1B,OAA8B;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAEnC,OAAO,GAAG,EAAE;YACV,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,SAAS,EACT,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CACzC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAkB;QAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,gBAAgB,CAAC,CAAC;QAE7D,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,2DAA2D;gBAC3D,OAAO,CAAC,KAAK,CAAC,4CAA4C,KAAK,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAqB;QACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/domain/events.ts"],"names":[],"mappings":"AAqOA,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAG,IAAI,GAAG,EAA0C,CAAC;IAErE,SAAS,CACP,SAA0B,EAC1B,OAA8B;QAE9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAEnC,OAAO,GAAG,EAAE;YACV,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,SAAS,EACT,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CACzC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAkB;QAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,WAAW,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,gBAAgB,CAAC,CAAC;QAE7D,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,2DAA2D;gBAC3D,OAAO,CAAC,KAAK,CAAC,4CAA4C,KAAK,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAqB;QACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,oBAAoB;IACpB,oBAAoB;IACpB,iBAAiB;IACjB,iBAAiB;IACjB,wBAAwB;IACxB,0BAA0B;IAC1B,iBAAiB;IACjB,mBAAmB;IACnB,qBAAqB;IACrB,qBAAqB;IACrB,4BAA4B;IAC5B,qBAAqB;IACrB,kBAAkB;IAClB,qBAAqB;IACrB,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,cAAc;IACd,cAAc;IACd,cAAc;IACd,qBAAqB;IACrB,gBAAgB;IAChB,cAAc;IACd,cAAc;IACd,aAAa;IACb,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;CAC2C,CAAC;AAIhE,MAAM,sBAAsB,GAAuE,IAAI,CAAC;AACxG,KAAK,sBAAsB,CAAC"}
|
package/dist/engine/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { Activity, Actor, CriticalPathConfig, Project, Task, TaskDependency, TaskDependencyGraph, Team, TaskContainer, Iteration, Comment, Attachment, FileStorageAdapter, UploadFileInput, PresignedUrlOptions, PresignedUploadResult, TimeEntry, Workflow, CreateTaskInput, Deliverable, DeliverableSummary, CreateDeliverableInput, TaskLifecycleState, CriticalPathAnalysis, TimelineLadder, TimelineLadderOptions, TaskLadderView, TaskMetrics, TaskProgressHistory, WorkloadDistribution, WorkloadDistributionOptions } from '../types/index.js';
|
|
1
|
+
import type { Activity, Actor, CriticalPathConfig, Project, Task, TaskDependency, TaskDependencyGraph, Team, TaskContainer, Iteration, Comment, Attachment, FileStorageAdapter, UploadFileInput, PresignedUrlOptions, PresignedUploadResult, TimeEntry, Webhook, PublicWebhook, Workflow, CreateTaskInput, Deliverable, DeliverableSummary, CreateDeliverableInput, TaskLifecycleState, CriticalPathAnalysis, TimelineLadder, TimelineLadderOptions, TaskLadderView, TaskMetrics, TaskProgressHistory, WorkloadDistribution, WorkloadDistributionOptions } from '../types/index.js';
|
|
2
2
|
import { StorageAdapter } from '../store/index.js';
|
|
3
3
|
import { PluginRegistry } from '../plugins/index.js';
|
|
4
4
|
import { DomainEventBus } from '../domain/events.js';
|
|
5
|
+
import { WebhookDispatcher } from '../webhooks/dispatcher.js';
|
|
5
6
|
import { type CPMOptions } from '../domain/cpm.js';
|
|
6
7
|
import { type MetricOptions } from '../domain/metrics.js';
|
|
7
8
|
export declare class CriticalPathEngine {
|
|
@@ -10,6 +11,8 @@ export declare class CriticalPathEngine {
|
|
|
10
11
|
readonly fileStorage?: FileStorageAdapter;
|
|
11
12
|
readonly plugins: PluginRegistry;
|
|
12
13
|
readonly events: DomainEventBus;
|
|
14
|
+
/** Delivers domain events to registered webhooks. Exposed for custom queues (`deliver`) and tests (`idle`). */
|
|
15
|
+
readonly webhooks: WebhookDispatcher;
|
|
13
16
|
readonly ready: Promise<void>;
|
|
14
17
|
/** The identity mutations are attributed to. Set only on views returned by `withActor`. */
|
|
15
18
|
readonly actor?: Actor;
|
|
@@ -172,6 +175,30 @@ export declare class CriticalPathEngine {
|
|
|
172
175
|
getTaskMetrics(taskId: string, options?: MetricOptions): Promise<TaskMetrics | null>;
|
|
173
176
|
getTaskProgressHistory(taskId: string, options?: MetricOptions): Promise<TaskProgressHistory | null>;
|
|
174
177
|
getWorkloadDistribution(projectId?: string, options?: WorkloadDistributionOptions): Promise<WorkloadDistribution>;
|
|
175
|
-
|
|
178
|
+
/** Webhooks from `config.webhooks` (static, not editable) plus those in the store. */
|
|
179
|
+
private listAllWebhooks;
|
|
180
|
+
private toPublicWebhook;
|
|
181
|
+
/** Webhooks in the actor's tenant, with secrets redacted. Requires `workspace.manage` on views. */
|
|
182
|
+
getWebhooks(): Promise<PublicWebhook[]>;
|
|
183
|
+
getWebhook(id: string): Promise<PublicWebhook | null>;
|
|
184
|
+
/**
|
|
185
|
+
* Registers a webhook. The signing secret is returned only here; generate one by omitting
|
|
186
|
+
* `secret`. Deliveries carry `X-CriticalPath-Signature` (see `verifyWebhookSignature`).
|
|
187
|
+
*/
|
|
188
|
+
createWebhook(input: {
|
|
189
|
+
name: string;
|
|
190
|
+
url: string;
|
|
191
|
+
events: Webhook['events'];
|
|
192
|
+
secret?: string;
|
|
193
|
+
active?: boolean;
|
|
194
|
+
}): Promise<{
|
|
195
|
+
webhook: PublicWebhook;
|
|
196
|
+
secret: string;
|
|
197
|
+
}>;
|
|
198
|
+
updateWebhook(id: string, updates: Partial<Pick<Webhook, 'name' | 'url' | 'events' | 'active' | 'secret'>>): Promise<PublicWebhook | null>;
|
|
199
|
+
deleteWebhook(id: string): Promise<boolean>;
|
|
200
|
+
private validateWebhookUrl;
|
|
201
|
+
/** Finds the tenant an event belongs to, from the entity in its payload or its project. */
|
|
202
|
+
private resolveEventTenant;
|
|
176
203
|
}
|
|
177
204
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,KAAK,EAEL,kBAAkB,EAClB,OAAO,EACP,IAAI,EACJ,cAAc,EACd,mBAAmB,EACnB,IAAI,EACJ,aAAa,EACb,SAAS,EACT,OAAO,EACP,UAAU,EACV,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/index.js
CHANGED
|
@@ -8,6 +8,8 @@ import { validateAttachmentUrl } from '../domain/entities.js';
|
|
|
8
8
|
import { validateCustomFieldValues } from '../domain/custom-fields.js';
|
|
9
9
|
import { detectDependencyCycle, CircularDependencyError } from '../domain/graph.js';
|
|
10
10
|
import { ValidationError, NotFoundError, ForbiddenError } from '../domain/errors.js';
|
|
11
|
+
import { WebhookDispatcher, assertWebhookUrl } from '../webhooks/dispatcher.js';
|
|
12
|
+
import { generateWebhookSecret } from '../webhooks/signature.js';
|
|
11
13
|
import { calculateCPM } from '../domain/cpm.js';
|
|
12
14
|
import { buildTimelineLadder, aggregateConcreteEvidenceForTask } from '../domain/ladder.js';
|
|
13
15
|
import { calculateTaskMetrics, reconstructTaskProgressHistory } from '../domain/metrics.js';
|
|
@@ -18,6 +20,8 @@ export class CriticalPathEngine {
|
|
|
18
20
|
fileStorage;
|
|
19
21
|
plugins;
|
|
20
22
|
events;
|
|
23
|
+
/** Delivers domain events to registered webhooks. Exposed for custom queues (`deliver`) and tests (`idle`). */
|
|
24
|
+
webhooks;
|
|
21
25
|
ready = Promise.resolve();
|
|
22
26
|
/** The identity mutations are attributed to. Set only on views returned by `withActor`. */
|
|
23
27
|
actor;
|
|
@@ -31,6 +35,11 @@ export class CriticalPathEngine {
|
|
|
31
35
|
this.fileStorage = config.fileStorage;
|
|
32
36
|
this.plugins = new PluginRegistry();
|
|
33
37
|
this.events = new DomainEventBus();
|
|
38
|
+
this.webhooks = new WebhookDispatcher({
|
|
39
|
+
listWebhooks: () => this.listAllWebhooks(),
|
|
40
|
+
resolveTenant: (event) => this.resolveEventTenant(event)
|
|
41
|
+
}, config.webhookDelivery);
|
|
42
|
+
this.events.subscribe('*', (event) => this.webhooks.handle(event));
|
|
34
43
|
if (config.plugins) {
|
|
35
44
|
for (const plugin of config.plugins) {
|
|
36
45
|
this.plugins.register(plugin);
|
|
@@ -215,7 +224,6 @@ export class CriticalPathEngine {
|
|
|
215
224
|
action: 'workflow.created',
|
|
216
225
|
details: { name: created.name }
|
|
217
226
|
});
|
|
218
|
-
this.dispatchWebhook('workflow.created', { workflow: created });
|
|
219
227
|
return created;
|
|
220
228
|
}
|
|
221
229
|
async updateWorkflow(id, updates) {
|
|
@@ -241,7 +249,6 @@ export class CriticalPathEngine {
|
|
|
241
249
|
action: 'workflow.updated',
|
|
242
250
|
details: { name: updated.name }
|
|
243
251
|
});
|
|
244
|
-
this.dispatchWebhook('workflow.updated', { workflow: updated, previous: existing });
|
|
245
252
|
}
|
|
246
253
|
return updated;
|
|
247
254
|
}
|
|
@@ -259,7 +266,7 @@ export class CriticalPathEngine {
|
|
|
259
266
|
aggregateId: id,
|
|
260
267
|
aggregateType: 'Workflow',
|
|
261
268
|
occurredAt: now,
|
|
262
|
-
payload: { workflowId: id, name: existing.name }
|
|
269
|
+
payload: { workflowId: id, name: existing.name, tenantId: existing.tenantId }
|
|
263
270
|
};
|
|
264
271
|
await this.events.publish(event);
|
|
265
272
|
await this.store.logActivity({
|
|
@@ -267,7 +274,6 @@ export class CriticalPathEngine {
|
|
|
267
274
|
action: 'workflow.deleted',
|
|
268
275
|
details: { name: existing.name }
|
|
269
276
|
});
|
|
270
|
-
this.dispatchWebhook('workflow.deleted', { workflowId: id, name: existing.name });
|
|
271
277
|
}
|
|
272
278
|
return deleted;
|
|
273
279
|
}
|
|
@@ -345,7 +351,6 @@ export class CriticalPathEngine {
|
|
|
345
351
|
action: 'project.created',
|
|
346
352
|
details: { name: created.name, key: created.key }
|
|
347
353
|
});
|
|
348
|
-
this.dispatchWebhook('project.created', { project: created });
|
|
349
354
|
return created;
|
|
350
355
|
}
|
|
351
356
|
async updateProject(id, updates) {
|
|
@@ -374,7 +379,6 @@ export class CriticalPathEngine {
|
|
|
374
379
|
action: 'project.updated',
|
|
375
380
|
details: { name: updated.name }
|
|
376
381
|
});
|
|
377
|
-
this.dispatchWebhook('project.updated', { project: updated });
|
|
378
382
|
}
|
|
379
383
|
return updated;
|
|
380
384
|
}
|
|
@@ -405,7 +409,7 @@ export class CriticalPathEngine {
|
|
|
405
409
|
aggregateId: id,
|
|
406
410
|
aggregateType: 'Project',
|
|
407
411
|
occurredAt: now,
|
|
408
|
-
payload: { projectId: id, name: existing.name, deletedTaskIds }
|
|
412
|
+
payload: { projectId: id, name: existing.name, deletedTaskIds, tenantId: existing.tenantId }
|
|
409
413
|
};
|
|
410
414
|
await this.events.publish(event);
|
|
411
415
|
await this.store.logActivity({
|
|
@@ -414,7 +418,6 @@ export class CriticalPathEngine {
|
|
|
414
418
|
action: 'project.deleted',
|
|
415
419
|
details: { name: existing.name, deletedTaskCount: deletedTaskIds.length }
|
|
416
420
|
});
|
|
417
|
-
this.dispatchWebhook('project.deleted', { projectId: id, name: existing.name, deletedTaskIds });
|
|
418
421
|
}
|
|
419
422
|
return deleted;
|
|
420
423
|
}
|
|
@@ -514,7 +517,6 @@ export class CriticalPathEngine {
|
|
|
514
517
|
action: 'task.created',
|
|
515
518
|
details: { title: created.title, status: created.status }
|
|
516
519
|
});
|
|
517
|
-
this.dispatchWebhook('task.created', { task: created });
|
|
518
520
|
return created;
|
|
519
521
|
}
|
|
520
522
|
async updateTask(id, updates, options) {
|
|
@@ -759,10 +761,6 @@ export class CriticalPathEngine {
|
|
|
759
761
|
action: 'task.blocked',
|
|
760
762
|
details: { reason: blockedReason, ...(actorName ? { actorName } : {}) }
|
|
761
763
|
});
|
|
762
|
-
this.dispatchWebhook('task.blocked', {
|
|
763
|
-
task: updated,
|
|
764
|
-
reason: blockedReason
|
|
765
|
-
});
|
|
766
764
|
}
|
|
767
765
|
else if (wasBlocked && !isNowBlocked) {
|
|
768
766
|
const unblockedEvent = {
|
|
@@ -786,9 +784,6 @@ export class CriticalPathEngine {
|
|
|
786
784
|
action: 'task.unblocked',
|
|
787
785
|
details: { ...(actorName ? { actorName } : {}) }
|
|
788
786
|
});
|
|
789
|
-
this.dispatchWebhook('task.unblocked', {
|
|
790
|
-
task: updated
|
|
791
|
-
});
|
|
792
787
|
}
|
|
793
788
|
await this.store.logActivity({
|
|
794
789
|
projectId: updated.projectId,
|
|
@@ -801,10 +796,6 @@ export class CriticalPathEngine {
|
|
|
801
796
|
...(actorName ? { actorName } : {})
|
|
802
797
|
}
|
|
803
798
|
});
|
|
804
|
-
this.dispatchWebhook(isStatusChange ? 'task.status_changed' : 'task.updated', {
|
|
805
|
-
task: updated,
|
|
806
|
-
previous: existing
|
|
807
|
-
});
|
|
808
799
|
return updated;
|
|
809
800
|
}
|
|
810
801
|
async checkAndUnblockDownstreamTasks(completedTask) {
|
|
@@ -866,10 +857,6 @@ export class CriticalPathEngine {
|
|
|
866
857
|
action: 'task.unblocked',
|
|
867
858
|
details: { unblockedByTaskId: completedTask.id }
|
|
868
859
|
});
|
|
869
|
-
this.dispatchWebhook('task.unblocked', {
|
|
870
|
-
task: updatedDownstream,
|
|
871
|
-
upstreamTaskId: completedTask.id
|
|
872
|
-
});
|
|
873
860
|
}
|
|
874
861
|
}
|
|
875
862
|
}
|
|
@@ -907,7 +894,6 @@ export class CriticalPathEngine {
|
|
|
907
894
|
action: 'task.deleted',
|
|
908
895
|
details: { title: existing.title }
|
|
909
896
|
});
|
|
910
|
-
this.dispatchWebhook('task.deleted', { taskId: id, title: existing.title });
|
|
911
897
|
}
|
|
912
898
|
return deleted;
|
|
913
899
|
}
|
|
@@ -1090,7 +1076,6 @@ export class CriticalPathEngine {
|
|
|
1090
1076
|
payload: { taskId: comment.taskId, comment: created }
|
|
1091
1077
|
};
|
|
1092
1078
|
await this.events.publish(event);
|
|
1093
|
-
this.dispatchWebhook('comment.created', { comment: created });
|
|
1094
1079
|
return created;
|
|
1095
1080
|
}
|
|
1096
1081
|
async updateComment(id, updates) {
|
|
@@ -1116,7 +1101,6 @@ export class CriticalPathEngine {
|
|
|
1116
1101
|
payload: { comment: updated, previous: existing }
|
|
1117
1102
|
};
|
|
1118
1103
|
await this.events.publish(event);
|
|
1119
|
-
this.dispatchWebhook('comment.updated', { comment: updated });
|
|
1120
1104
|
return updated;
|
|
1121
1105
|
}
|
|
1122
1106
|
async deleteComment(id) {
|
|
@@ -1139,7 +1123,6 @@ export class CriticalPathEngine {
|
|
|
1139
1123
|
payload: { taskId: existing.taskId, commentId: id }
|
|
1140
1124
|
};
|
|
1141
1125
|
await this.events.publish(event);
|
|
1142
|
-
this.dispatchWebhook('comment.deleted', { commentId: id, taskId: existing.taskId });
|
|
1143
1126
|
}
|
|
1144
1127
|
return deleted;
|
|
1145
1128
|
}
|
|
@@ -1185,7 +1168,6 @@ export class CriticalPathEngine {
|
|
|
1185
1168
|
}
|
|
1186
1169
|
};
|
|
1187
1170
|
await this.events.publish(event);
|
|
1188
|
-
this.dispatchWebhook('comment.reaction.added', { comment: updated, reaction });
|
|
1189
1171
|
return updated;
|
|
1190
1172
|
}
|
|
1191
1173
|
async removeCommentReaction(commentId, input) {
|
|
@@ -1214,7 +1196,6 @@ export class CriticalPathEngine {
|
|
|
1214
1196
|
payload: { commentId, reaction, comment: updated }
|
|
1215
1197
|
};
|
|
1216
1198
|
await this.events.publish(event);
|
|
1217
|
-
this.dispatchWebhook('comment.reaction.removed', { comment: updated, reaction });
|
|
1218
1199
|
return updated;
|
|
1219
1200
|
}
|
|
1220
1201
|
// --- Attachments ---
|
|
@@ -1256,7 +1237,6 @@ export class CriticalPathEngine {
|
|
|
1256
1237
|
payload: { attachment: created }
|
|
1257
1238
|
};
|
|
1258
1239
|
await this.events.publish(event);
|
|
1259
|
-
this.dispatchWebhook('attachment.created', { attachment: created });
|
|
1260
1240
|
return created;
|
|
1261
1241
|
}
|
|
1262
1242
|
async deleteAttachment(id) {
|
|
@@ -1284,10 +1264,14 @@ export class CriticalPathEngine {
|
|
|
1284
1264
|
aggregateId: id,
|
|
1285
1265
|
aggregateType: 'Attachment',
|
|
1286
1266
|
occurredAt: now,
|
|
1287
|
-
payload: {
|
|
1267
|
+
payload: {
|
|
1268
|
+
attachmentId: id,
|
|
1269
|
+
storageKey: existing.storageKey,
|
|
1270
|
+
url: existing.url,
|
|
1271
|
+
projectId: await this.projectIdOfAttachment(existing)
|
|
1272
|
+
}
|
|
1288
1273
|
};
|
|
1289
1274
|
await this.events.publish(event);
|
|
1290
|
-
this.dispatchWebhook('attachment.deleted', { attachmentId: id, taskId: existing.taskId, projectId: existing.projectId });
|
|
1291
1275
|
}
|
|
1292
1276
|
return deleted;
|
|
1293
1277
|
}
|
|
@@ -1387,7 +1371,6 @@ export class CriticalPathEngine {
|
|
|
1387
1371
|
payload: { team: created }
|
|
1388
1372
|
};
|
|
1389
1373
|
await this.events.publish(event);
|
|
1390
|
-
this.dispatchWebhook('team.created', { team: created });
|
|
1391
1374
|
return created;
|
|
1392
1375
|
}
|
|
1393
1376
|
async updateTeam(id, updates) {
|
|
@@ -1427,7 +1410,6 @@ export class CriticalPathEngine {
|
|
|
1427
1410
|
payload: { container: created }
|
|
1428
1411
|
};
|
|
1429
1412
|
await this.events.publish(event);
|
|
1430
|
-
this.dispatchWebhook('container.created', { container: created });
|
|
1431
1413
|
return created;
|
|
1432
1414
|
}
|
|
1433
1415
|
async updateContainer(id, updates) {
|
|
@@ -1484,7 +1466,6 @@ export class CriticalPathEngine {
|
|
|
1484
1466
|
action: 'deliverable.created',
|
|
1485
1467
|
details: { title: created.title, format: created.format }
|
|
1486
1468
|
});
|
|
1487
|
-
this.dispatchWebhook('deliverable.created', { deliverable: created });
|
|
1488
1469
|
return created;
|
|
1489
1470
|
}
|
|
1490
1471
|
async updateDeliverable(id, updates) {
|
|
@@ -1512,11 +1493,6 @@ export class CriticalPathEngine {
|
|
|
1512
1493
|
}
|
|
1513
1494
|
};
|
|
1514
1495
|
await this.events.publish(statusEvent);
|
|
1515
|
-
this.dispatchWebhook('deliverable.status_changed', {
|
|
1516
|
-
deliverable: updated,
|
|
1517
|
-
previousStatus: existing.status,
|
|
1518
|
-
newStatus: updated.status
|
|
1519
|
-
});
|
|
1520
1496
|
}
|
|
1521
1497
|
const updateEvent = {
|
|
1522
1498
|
id: `evt_${Math.random().toString(36).substring(2, 9)}`,
|
|
@@ -1533,7 +1509,6 @@ export class CriticalPathEngine {
|
|
|
1533
1509
|
action: 'deliverable.updated',
|
|
1534
1510
|
details: { title: updated.title, status: updated.status }
|
|
1535
1511
|
});
|
|
1536
|
-
this.dispatchWebhook('deliverable.updated', { deliverable: updated });
|
|
1537
1512
|
}
|
|
1538
1513
|
return updated;
|
|
1539
1514
|
}
|
|
@@ -1560,7 +1535,6 @@ export class CriticalPathEngine {
|
|
|
1560
1535
|
action: 'deliverable.deleted',
|
|
1561
1536
|
details: { title: existing.title }
|
|
1562
1537
|
});
|
|
1563
|
-
this.dispatchWebhook('deliverable.deleted', { deliverableId: id, projectId: existing.projectId });
|
|
1564
1538
|
}
|
|
1565
1539
|
return deleted;
|
|
1566
1540
|
}
|
|
@@ -1634,7 +1608,6 @@ export class CriticalPathEngine {
|
|
|
1634
1608
|
payload: { iteration: created }
|
|
1635
1609
|
};
|
|
1636
1610
|
await this.events.publish(event);
|
|
1637
|
-
this.dispatchWebhook('iteration.started', { iteration: created });
|
|
1638
1611
|
}
|
|
1639
1612
|
return created;
|
|
1640
1613
|
}
|
|
@@ -1656,7 +1629,6 @@ export class CriticalPathEngine {
|
|
|
1656
1629
|
payload: { iteration: updated }
|
|
1657
1630
|
};
|
|
1658
1631
|
await this.events.publish(event);
|
|
1659
|
-
this.dispatchWebhook('iteration.started', { iteration: updated });
|
|
1660
1632
|
}
|
|
1661
1633
|
else if (existing.status !== 'completed' && updated.status === 'completed') {
|
|
1662
1634
|
const event = {
|
|
@@ -1668,7 +1640,6 @@ export class CriticalPathEngine {
|
|
|
1668
1640
|
payload: { iteration: updated }
|
|
1669
1641
|
};
|
|
1670
1642
|
await this.events.publish(event);
|
|
1671
|
-
this.dispatchWebhook('iteration.completed', { iteration: updated });
|
|
1672
1643
|
}
|
|
1673
1644
|
}
|
|
1674
1645
|
return updated;
|
|
@@ -1819,18 +1790,93 @@ export class CriticalPathEngine {
|
|
|
1819
1790
|
schedule
|
|
1820
1791
|
});
|
|
1821
1792
|
}
|
|
1822
|
-
|
|
1793
|
+
// --- Webhooks ---
|
|
1794
|
+
/** Webhooks from `config.webhooks` (static, not editable) plus those in the store. */
|
|
1795
|
+
async listAllWebhooks() {
|
|
1796
|
+
const fromConfig = (this.config.webhooks ?? []).map((w, i) => ({
|
|
1797
|
+
...w,
|
|
1798
|
+
id: `config_${i}`,
|
|
1799
|
+
createdAt: new Date(0).toISOString()
|
|
1800
|
+
}));
|
|
1801
|
+
return [...fromConfig, ...(await this.store.getWebhooks())];
|
|
1802
|
+
}
|
|
1803
|
+
toPublicWebhook({ secret, ...webhook }) {
|
|
1804
|
+
return { ...webhook, hasSecret: !!secret };
|
|
1805
|
+
}
|
|
1806
|
+
/** Webhooks in the actor's tenant, with secrets redacted. Requires `workspace.manage` on views. */
|
|
1807
|
+
async getWebhooks() {
|
|
1808
|
+
await this.requireWorkspaceAccess('workspace.manage');
|
|
1823
1809
|
const webhooks = await this.store.getWebhooks();
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1810
|
+
return webhooks.filter((w) => this.inActorTenant(w)).map((w) => this.toPublicWebhook(w));
|
|
1811
|
+
}
|
|
1812
|
+
async getWebhook(id) {
|
|
1813
|
+
await this.requireWorkspaceAccess('workspace.manage');
|
|
1814
|
+
const webhook = await this.store.getWebhook(id);
|
|
1815
|
+
return webhook && this.inActorTenant(webhook) ? this.toPublicWebhook(webhook) : null;
|
|
1816
|
+
}
|
|
1817
|
+
/**
|
|
1818
|
+
* Registers a webhook. The signing secret is returned only here; generate one by omitting
|
|
1819
|
+
* `secret`. Deliveries carry `X-CriticalPath-Signature` (see `verifyWebhookSignature`).
|
|
1820
|
+
*/
|
|
1821
|
+
async createWebhook(input) {
|
|
1822
|
+
await this.requireWorkspaceAccess('workspace.manage');
|
|
1823
|
+
this.validateWebhookUrl(input.url);
|
|
1824
|
+
const secret = input.secret ?? generateWebhookSecret();
|
|
1825
|
+
const created = await this.store.addWebhook({
|
|
1826
|
+
name: input.name,
|
|
1827
|
+
url: input.url,
|
|
1828
|
+
events: input.events,
|
|
1829
|
+
secret,
|
|
1830
|
+
active: input.active ?? true,
|
|
1831
|
+
tenantId: this.actor?.tenantId
|
|
1832
|
+
});
|
|
1833
|
+
this.webhooks.invalidate();
|
|
1834
|
+
return { webhook: this.toPublicWebhook(created), secret };
|
|
1835
|
+
}
|
|
1836
|
+
async updateWebhook(id, updates) {
|
|
1837
|
+
if (!(await this.getWebhook(id)))
|
|
1838
|
+
return null;
|
|
1839
|
+
if (updates.url)
|
|
1840
|
+
this.validateWebhookUrl(updates.url);
|
|
1841
|
+
const { name, url, events, active, secret } = updates;
|
|
1842
|
+
const updated = await this.store.updateWebhook(id, Object.fromEntries(Object.entries({ name, url, events, active, secret }).filter(([, v]) => v !== undefined)));
|
|
1843
|
+
this.webhooks.invalidate();
|
|
1844
|
+
return updated ? this.toPublicWebhook(updated) : null;
|
|
1845
|
+
}
|
|
1846
|
+
async deleteWebhook(id) {
|
|
1847
|
+
if (!(await this.getWebhook(id)))
|
|
1848
|
+
return false;
|
|
1849
|
+
const deleted = await this.store.deleteWebhook(id);
|
|
1850
|
+
this.webhooks.invalidate();
|
|
1851
|
+
return deleted;
|
|
1852
|
+
}
|
|
1853
|
+
validateWebhookUrl(url) {
|
|
1854
|
+
try {
|
|
1855
|
+
assertWebhookUrl(url, this.config.webhookDelivery?.allowPrivateUrls);
|
|
1833
1856
|
}
|
|
1857
|
+
catch (err) {
|
|
1858
|
+
throw new ValidationError(err.message);
|
|
1859
|
+
}
|
|
1860
|
+
}
|
|
1861
|
+
/** Finds the tenant an event belongs to, from the entity in its payload or its project. */
|
|
1862
|
+
async resolveEventTenant(event) {
|
|
1863
|
+
const p = event.payload;
|
|
1864
|
+
const owner = p.project ?? p.workflow ?? p.team;
|
|
1865
|
+
if (owner)
|
|
1866
|
+
return owner.tenantId ?? undefined;
|
|
1867
|
+
// Deleted projects and workflows carry their tenant in the payload.
|
|
1868
|
+
if ('tenantId' in p)
|
|
1869
|
+
return p.tenantId ?? undefined;
|
|
1870
|
+
const projectId = p.projectId ??
|
|
1871
|
+
p.task?.projectId ??
|
|
1872
|
+
p.deliverable?.projectId ??
|
|
1873
|
+
p.iteration?.projectId ??
|
|
1874
|
+
p.container?.projectId ??
|
|
1875
|
+
p.attachment?.projectId ??
|
|
1876
|
+
(await this.projectIdOfTask(p.taskId ?? p.comment?.taskId ?? p.attachment?.taskId ?? p.dependency?.taskId ?? p.timeEntry?.taskId));
|
|
1877
|
+
if (!projectId)
|
|
1878
|
+
return undefined;
|
|
1879
|
+
return (await this.store.getProject(projectId))?.tenantId ?? undefined;
|
|
1834
1880
|
}
|
|
1835
1881
|
}
|
|
1836
1882
|
//# sourceMappingURL=index.js.map
|