@shipfox/api-triggers 13.1.0 → 14.0.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.
Files changed (129) hide show
  1. package/.turbo/turbo-build.log +4 -4
  2. package/CHANGELOG.md +27 -0
  3. package/README.md +14 -10
  4. package/dist/core/entities/decision.d.ts +3 -2
  5. package/dist/core/entities/decision.d.ts.map +1 -1
  6. package/dist/core/entities/decision.js.map +1 -1
  7. package/dist/core/entities/job-listener-subscription.d.ts +2 -1
  8. package/dist/core/entities/job-listener-subscription.d.ts.map +1 -1
  9. package/dist/core/entities/job-listener-subscription.js.map +1 -1
  10. package/dist/core/entities/received-event.d.ts +14 -1
  11. package/dist/core/entities/received-event.d.ts.map +1 -1
  12. package/dist/core/entities/received-event.js +2 -1
  13. package/dist/core/entities/received-event.js.map +1 -1
  14. package/dist/core/entities/subscription.d.ts +2 -1
  15. package/dist/core/entities/subscription.d.ts.map +1 -1
  16. package/dist/core/entities/subscription.js.map +1 -1
  17. package/dist/core/fire-cron.d.ts.map +1 -1
  18. package/dist/core/fire-cron.js +3 -1
  19. package/dist/core/fire-cron.js.map +1 -1
  20. package/dist/core/fire-manual.d.ts.map +1 -1
  21. package/dist/core/fire-manual.js +3 -1
  22. package/dist/core/fire-manual.js.map +1 -1
  23. package/dist/core/record-trigger-history.d.ts +2 -0
  24. package/dist/core/record-trigger-history.d.ts.map +1 -1
  25. package/dist/core/record-trigger-history.js +13 -1
  26. package/dist/core/record-trigger-history.js.map +1 -1
  27. package/dist/core/route-event-to-job-listeners.js +2 -0
  28. package/dist/core/route-event-to-job-listeners.js.map +1 -1
  29. package/dist/db/db.d.ts +48 -14
  30. package/dist/db/db.d.ts.map +1 -1
  31. package/dist/db/event-history.d.ts +17 -0
  32. package/dist/db/event-history.d.ts.map +1 -1
  33. package/dist/db/event-history.js +45 -1
  34. package/dist/db/event-history.js.map +1 -1
  35. package/dist/db/event-queries.d.ts +5 -1
  36. package/dist/db/event-queries.d.ts.map +1 -1
  37. package/dist/db/event-queries.js +30 -4
  38. package/dist/db/event-queries.js.map +1 -1
  39. package/dist/db/index.d.ts +1 -1
  40. package/dist/db/index.d.ts.map +1 -1
  41. package/dist/db/index.js +1 -1
  42. package/dist/db/index.js.map +1 -1
  43. package/dist/db/job-listener-subscriptions.d.ts +1 -1
  44. package/dist/db/job-listener-subscriptions.d.ts.map +1 -1
  45. package/dist/db/job-listener-subscriptions.js +10 -3
  46. package/dist/db/job-listener-subscriptions.js.map +1 -1
  47. package/dist/db/schema/decisions.d.ts +3 -3
  48. package/dist/db/schema/decisions.d.ts.map +1 -1
  49. package/dist/db/schema/decisions.js +8 -3
  50. package/dist/db/schema/decisions.js.map +1 -1
  51. package/dist/db/schema/job-listener-subscriptions.d.ts +1 -1
  52. package/dist/db/schema/job-listener-subscriptions.d.ts.map +1 -1
  53. package/dist/db/schema/job-listener-subscriptions.js +2 -1
  54. package/dist/db/schema/job-listener-subscriptions.js.map +1 -1
  55. package/dist/db/schema/received-events.d.ts +38 -4
  56. package/dist/db/schema/received-events.d.ts.map +1 -1
  57. package/dist/db/schema/received-events.js +11 -2
  58. package/dist/db/schema/received-events.js.map +1 -1
  59. package/dist/db/schema/subscriptions.d.ts +1 -1
  60. package/dist/db/schema/subscriptions.d.ts.map +1 -1
  61. package/dist/db/schema/subscriptions.js +2 -1
  62. package/dist/db/schema/subscriptions.js.map +1 -1
  63. package/dist/db/subscription-event.d.ts +7 -0
  64. package/dist/db/subscription-event.d.ts.map +1 -0
  65. package/dist/db/subscription-event.js +19 -0
  66. package/dist/db/subscription-event.js.map +1 -0
  67. package/dist/db/subscriptions.d.ts +5 -1
  68. package/dist/db/subscriptions.d.ts.map +1 -1
  69. package/dist/db/subscriptions.js +10 -3
  70. package/dist/db/subscriptions.js.map +1 -1
  71. package/dist/presentation/dto/trigger-events.d.ts +3 -2
  72. package/dist/presentation/dto/trigger-events.d.ts.map +1 -1
  73. package/dist/presentation/dto/trigger-events.js +9 -0
  74. package/dist/presentation/dto/trigger-events.js.map +1 -1
  75. package/dist/presentation/routes/get-trigger-event.d.ts.map +1 -1
  76. package/dist/presentation/routes/get-trigger-event.js +8 -4
  77. package/dist/presentation/routes/get-trigger-event.js.map +1 -1
  78. package/dist/presentation/routes/list-trigger-event-facets.js +1 -1
  79. package/dist/presentation/routes/list-trigger-event-facets.js.map +1 -1
  80. package/dist/presentation/routes/list-trigger-events.d.ts.map +1 -1
  81. package/dist/presentation/routes/list-trigger-events.js +3 -1
  82. package/dist/presentation/routes/list-trigger-events.js.map +1 -1
  83. package/dist/tsconfig.test.tsbuildinfo +1 -1
  84. package/drizzle/0001_nullable_subscription_events.sql +2 -0
  85. package/drizzle/0002_dev_trigger_journal.sql +7 -0
  86. package/drizzle/0003_add_origin_facet_index.sql +1 -0
  87. package/drizzle/meta/0001_snapshot.json +905 -0
  88. package/drizzle/meta/0002_snapshot.json +947 -0
  89. package/drizzle/meta/0003_snapshot.json +968 -0
  90. package/drizzle/meta/_journal.json +21 -0
  91. package/package.json +7 -7
  92. package/src/core/dispatch-integration-event.test.ts +88 -0
  93. package/src/core/entities/decision.ts +3 -2
  94. package/src/core/entities/job-listener-subscription.ts +2 -1
  95. package/src/core/entities/received-event.ts +15 -1
  96. package/src/core/entities/subscription.ts +2 -1
  97. package/src/core/fire-cron.test.ts +20 -0
  98. package/src/core/fire-cron.ts +3 -1
  99. package/src/core/fire-manual.test.ts +25 -0
  100. package/src/core/fire-manual.ts +3 -1
  101. package/src/core/record-trigger-history.test.ts +78 -0
  102. package/src/core/record-trigger-history.ts +19 -0
  103. package/src/core/route-event-to-job-listeners.test.ts +47 -0
  104. package/src/core/route-event-to-job-listeners.ts +2 -0
  105. package/src/db/event-history.test.ts +123 -0
  106. package/src/db/event-history.ts +84 -1
  107. package/src/db/event-queries.ts +56 -3
  108. package/src/db/index.ts +1 -0
  109. package/src/db/job-listener-subscriptions.test.ts +133 -1
  110. package/src/db/job-listener-subscriptions.ts +5 -4
  111. package/src/db/schema/decisions.test.ts +93 -4
  112. package/src/db/schema/decisions.ts +12 -3
  113. package/src/db/schema/job-listener-subscriptions.ts +2 -1
  114. package/src/db/schema/received-events.test.ts +45 -0
  115. package/src/db/schema/received-events.ts +12 -1
  116. package/src/db/schema/subscriptions.ts +2 -1
  117. package/src/db/subscription-event.ts +24 -0
  118. package/src/db/subscriptions.test.ts +137 -0
  119. package/src/db/subscriptions.ts +9 -4
  120. package/src/presentation/dto/trigger-events.test.ts +193 -0
  121. package/src/presentation/dto/trigger-events.ts +12 -0
  122. package/src/presentation/routes/get-trigger-event.test.ts +179 -0
  123. package/src/presentation/routes/get-trigger-event.ts +15 -3
  124. package/src/presentation/routes/list-trigger-event-facets.test.ts +39 -2
  125. package/src/presentation/routes/list-trigger-event-facets.ts +1 -1
  126. package/src/presentation/routes/list-trigger-events.test.ts +99 -0
  127. package/src/presentation/routes/list-trigger-events.ts +4 -0
  128. package/test/factories/received-event.ts +2 -0
  129. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/db/subscriptions.ts"],"sourcesContent":["import type {TriggerDto} from '@shipfox/api-definitions-dto';\nimport {and, eq, inArray, notInArray} from 'drizzle-orm';\nimport type {TriggerSubscription} from '#core/entities/subscription.js';\nimport {deleteCronScheduleForSubscription, syncCronSchedule} from './cron-schedules.js';\nimport {db, type Executor, type Tx} from './db.js';\nimport {toTriggerSubscription, triggerSubscriptions} from './schema/subscriptions.js';\n\nexport interface ProjectDefinitionTriggersParams {\n tx?: Tx | undefined;\n workspaceId: string;\n projectId: string;\n workflowDefinitionId: string;\n triggers: Record<string, TriggerDto>;\n}\n\nexport async function projectDefinitionTriggers(\n params: ProjectDefinitionTriggersParams,\n): Promise<void> {\n const work = async (tx: Tx): Promise<void> => {\n const entries = Object.entries(params.triggers);\n const keepNames = entries.map(([name]) => name);\n\n if (keepNames.length === 0) {\n await tx\n .delete(triggerSubscriptions)\n .where(eq(triggerSubscriptions.workflowDefinitionId, params.workflowDefinitionId));\n return;\n }\n\n await tx\n .delete(triggerSubscriptions)\n .where(\n and(\n eq(triggerSubscriptions.workflowDefinitionId, params.workflowDefinitionId),\n notInArray(triggerSubscriptions.name, keepNames),\n ),\n );\n\n for (const [name, trigger] of entries) {\n const config: Record<string, unknown> = {};\n if (trigger.with !== undefined) config.with = trigger.with;\n if (trigger.filter !== undefined) config.filter = trigger.filter;\n\n const [upserted] = await tx\n .insert(triggerSubscriptions)\n .values({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n workflowDefinitionId: params.workflowDefinitionId,\n name,\n source: trigger.source,\n event: trigger.event,\n config,\n })\n .onConflictDoUpdate({\n target: [triggerSubscriptions.workflowDefinitionId, triggerSubscriptions.name],\n set: {\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n source: trigger.source,\n event: trigger.event,\n config,\n updatedAt: new Date(),\n },\n })\n .returning({id: triggerSubscriptions.id});\n if (!upserted) throw new Error('Trigger subscription upsert returned no rows');\n\n if (trigger.source === 'cron') {\n await syncCronSchedule({\n tx,\n subscriptionId: upserted.id,\n workspaceId: params.workspaceId,\n triggerConfig: trigger.config,\n });\n } else {\n await deleteCronScheduleForSubscription({tx, subscriptionId: upserted.id});\n }\n }\n };\n\n if (params.tx) {\n await work(params.tx);\n return;\n }\n await db().transaction(work);\n}\n\nexport interface DeleteSubscriptionsForDefinitionParams {\n tx?: Tx | undefined;\n workflowDefinitionId: string;\n}\n\nexport async function deleteSubscriptionsForDefinition(\n params: DeleteSubscriptionsForDefinitionParams,\n): Promise<number> {\n const work = async (executor: Executor): Promise<number> => {\n const rows = await executor\n .delete(triggerSubscriptions)\n .where(eq(triggerSubscriptions.workflowDefinitionId, params.workflowDefinitionId))\n .returning({id: triggerSubscriptions.id});\n return rows.length;\n };\n if (params.tx) return await work(params.tx);\n return await db().transaction(work);\n}\n\nexport async function getTriggerSubscriptionById(\n id: string,\n): Promise<TriggerSubscription | undefined> {\n const rows = await db()\n .select()\n .from(triggerSubscriptions)\n .where(eq(triggerSubscriptions.id, id))\n .limit(1);\n const row = rows[0];\n if (!row) return undefined;\n return toTriggerSubscription(row);\n}\n\nexport async function getManualSubscriptionByDefinitionId(\n workflowDefinitionId: string,\n): Promise<TriggerSubscription | undefined> {\n // limit(2) catches a broken parser invariant (>1 manual per definition) loudly instead of silently picking one.\n const rows = await db()\n .select()\n .from(triggerSubscriptions)\n .where(\n and(\n eq(triggerSubscriptions.workflowDefinitionId, workflowDefinitionId),\n eq(triggerSubscriptions.source, 'manual'),\n ),\n )\n .limit(2);\n if (rows.length > 1) {\n throw new Error(\n `Workflow definition ${workflowDefinitionId} has ${rows.length} manual triggers; expected at most 1`,\n );\n }\n const row = rows[0];\n if (!row) return undefined;\n return toTriggerSubscription(row);\n}\n\nexport interface FindMatchingSubscriptionsParams {\n workspaceId: string;\n source: string;\n event: string;\n}\n\n// Matches at workspace scope: an inbound integration event is a workspace-level\n// fact, not addressed to a project. Narrowing to a repo/project/branch is left to\n// user-defined per-workflow filters, not inferred here.\nexport async function findMatchingSubscriptions(\n params: FindMatchingSubscriptionsParams,\n): Promise<TriggerSubscription[]> {\n const rows = await db()\n .select()\n .from(triggerSubscriptions)\n .where(\n and(\n eq(triggerSubscriptions.workspaceId, params.workspaceId),\n eq(triggerSubscriptions.source, params.source),\n eq(triggerSubscriptions.event, params.event),\n ),\n );\n return rows.map(toTriggerSubscription);\n}\n\nexport async function listSubscriptionsByWorkflowDefinitionIds(\n workflowDefinitionIds: string[],\n): Promise<TriggerSubscription[]> {\n if (workflowDefinitionIds.length === 0) return [];\n const rows = await db()\n .select()\n .from(triggerSubscriptions)\n .where(inArray(triggerSubscriptions.workflowDefinitionId, workflowDefinitionIds));\n return rows.map(toTriggerSubscription);\n}\n"],"names":["and","eq","inArray","notInArray","deleteCronScheduleForSubscription","syncCronSchedule","db","toTriggerSubscription","triggerSubscriptions","projectDefinitionTriggers","params","work","tx","entries","Object","triggers","keepNames","map","name","length","delete","where","workflowDefinitionId","trigger","config","with","undefined","filter","upserted","insert","values","workspaceId","projectId","source","event","onConflictDoUpdate","target","set","updatedAt","Date","returning","id","Error","subscriptionId","triggerConfig","transaction","deleteSubscriptionsForDefinition","executor","rows","getTriggerSubscriptionById","select","from","limit","row","getManualSubscriptionByDefinitionId","findMatchingSubscriptions","listSubscriptionsByWorkflowDefinitionIds","workflowDefinitionIds"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/db/subscriptions.ts"],"sourcesContent":["import type {TriggerDto} from '@shipfox/api-definitions-dto';\nimport {and, eq, inArray, notInArray} from 'drizzle-orm';\nimport type {TriggerSubscription} from '#core/entities/subscription.js';\nimport {deleteCronScheduleForSubscription, syncCronSchedule} from './cron-schedules.js';\nimport {db, type Executor, type Tx} from './db.js';\nimport {toTriggerSubscription, triggerSubscriptions} from './schema/subscriptions.js';\nimport {normalizeSubscriptionEvent, subscriptionEventCondition} from './subscription-event.js';\n\ninterface ProjectDefinitionTrigger extends Omit<TriggerDto, 'event'> {\n event?: string | undefined;\n}\n\nexport interface ProjectDefinitionTriggersParams {\n tx?: Tx | undefined;\n workspaceId: string;\n projectId: string;\n workflowDefinitionId: string;\n triggers: Record<string, ProjectDefinitionTrigger>;\n}\n\nexport async function projectDefinitionTriggers(\n params: ProjectDefinitionTriggersParams,\n): Promise<void> {\n const work = async (tx: Tx): Promise<void> => {\n const entries = Object.entries(params.triggers);\n const keepNames = entries.map(([name]) => name);\n\n if (keepNames.length === 0) {\n await tx\n .delete(triggerSubscriptions)\n .where(eq(triggerSubscriptions.workflowDefinitionId, params.workflowDefinitionId));\n return;\n }\n\n await tx\n .delete(triggerSubscriptions)\n .where(\n and(\n eq(triggerSubscriptions.workflowDefinitionId, params.workflowDefinitionId),\n notInArray(triggerSubscriptions.name, keepNames),\n ),\n );\n\n for (const [name, trigger] of entries) {\n const config: Record<string, unknown> = {};\n if (trigger.with !== undefined) config.with = trigger.with;\n if (trigger.filter !== undefined) config.filter = trigger.filter;\n\n const [upserted] = await tx\n .insert(triggerSubscriptions)\n .values({\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n workflowDefinitionId: params.workflowDefinitionId,\n name,\n source: trigger.source,\n event: normalizeSubscriptionEvent({source: trigger.source, event: trigger.event}),\n config,\n })\n .onConflictDoUpdate({\n target: [triggerSubscriptions.workflowDefinitionId, triggerSubscriptions.name],\n set: {\n workspaceId: params.workspaceId,\n projectId: params.projectId,\n source: trigger.source,\n event: normalizeSubscriptionEvent({source: trigger.source, event: trigger.event}),\n config,\n updatedAt: new Date(),\n },\n })\n .returning({id: triggerSubscriptions.id});\n if (!upserted) throw new Error('Trigger subscription upsert returned no rows');\n\n if (trigger.source === 'cron') {\n await syncCronSchedule({\n tx,\n subscriptionId: upserted.id,\n workspaceId: params.workspaceId,\n triggerConfig: trigger.config,\n });\n } else {\n await deleteCronScheduleForSubscription({tx, subscriptionId: upserted.id});\n }\n }\n };\n\n if (params.tx) {\n await work(params.tx);\n return;\n }\n await db().transaction(work);\n}\n\nexport interface DeleteSubscriptionsForDefinitionParams {\n tx?: Tx | undefined;\n workflowDefinitionId: string;\n}\n\nexport async function deleteSubscriptionsForDefinition(\n params: DeleteSubscriptionsForDefinitionParams,\n): Promise<number> {\n const work = async (executor: Executor): Promise<number> => {\n const rows = await executor\n .delete(triggerSubscriptions)\n .where(eq(triggerSubscriptions.workflowDefinitionId, params.workflowDefinitionId))\n .returning({id: triggerSubscriptions.id});\n return rows.length;\n };\n if (params.tx) return await work(params.tx);\n return await db().transaction(work);\n}\n\nexport async function getTriggerSubscriptionById(\n id: string,\n): Promise<TriggerSubscription | undefined> {\n const rows = await db()\n .select()\n .from(triggerSubscriptions)\n .where(eq(triggerSubscriptions.id, id))\n .limit(1);\n const row = rows[0];\n if (!row) return undefined;\n return toTriggerSubscription(row);\n}\n\nexport async function getManualSubscriptionByDefinitionId(\n workflowDefinitionId: string,\n): Promise<TriggerSubscription | undefined> {\n // limit(2) catches a broken parser invariant (>1 manual per definition) loudly instead of silently picking one.\n const rows = await db()\n .select()\n .from(triggerSubscriptions)\n .where(\n and(\n eq(triggerSubscriptions.workflowDefinitionId, workflowDefinitionId),\n eq(triggerSubscriptions.source, 'manual'),\n ),\n )\n .limit(2);\n if (rows.length > 1) {\n throw new Error(\n `Workflow definition ${workflowDefinitionId} has ${rows.length} manual triggers; expected at most 1`,\n );\n }\n const row = rows[0];\n if (!row) return undefined;\n return toTriggerSubscription(row);\n}\n\nexport interface FindMatchingSubscriptionsParams {\n workspaceId: string;\n source: string;\n event: string;\n}\n\n// Matches at workspace scope: an inbound integration event is a workspace-level\n// fact, not addressed to a project. Narrowing to a repo/project/branch is left to\n// user-defined per-workflow filters, not inferred here.\nexport async function findMatchingSubscriptions(\n params: FindMatchingSubscriptionsParams,\n): Promise<TriggerSubscription[]> {\n const rows = await db()\n .select()\n .from(triggerSubscriptions)\n .where(\n and(\n eq(triggerSubscriptions.workspaceId, params.workspaceId),\n eq(triggerSubscriptions.source, params.source),\n subscriptionEventCondition(triggerSubscriptions.event, params.event),\n ),\n );\n return rows.map(toTriggerSubscription);\n}\n\nexport async function listSubscriptionsByWorkflowDefinitionIds(\n workflowDefinitionIds: string[],\n): Promise<TriggerSubscription[]> {\n if (workflowDefinitionIds.length === 0) return [];\n const rows = await db()\n .select()\n .from(triggerSubscriptions)\n .where(inArray(triggerSubscriptions.workflowDefinitionId, workflowDefinitionIds));\n return rows.map(toTriggerSubscription);\n}\n"],"names":["and","eq","inArray","notInArray","deleteCronScheduleForSubscription","syncCronSchedule","db","toTriggerSubscription","triggerSubscriptions","normalizeSubscriptionEvent","subscriptionEventCondition","projectDefinitionTriggers","params","work","tx","entries","Object","triggers","keepNames","map","name","length","delete","where","workflowDefinitionId","trigger","config","with","undefined","filter","upserted","insert","values","workspaceId","projectId","source","event","onConflictDoUpdate","target","set","updatedAt","Date","returning","id","Error","subscriptionId","triggerConfig","transaction","deleteSubscriptionsForDefinition","executor","rows","getTriggerSubscriptionById","select","from","limit","row","getManualSubscriptionByDefinitionId","findMatchingSubscriptions","listSubscriptionsByWorkflowDefinitionIds","workflowDefinitionIds"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import type { TriggerDecisionDto, TriggerEventDto, TriggerEventListItemDto } from '@shipfox/api-triggers-dto';
1
+ import type { TriggerDecisionDto, TriggerEventDto, TriggerEventListItemDto, TriggerEventReplayDto } from '@shipfox/api-triggers-dto';
2
2
  import type { TriggerDecision } from '#core/entities/decision.js';
3
- import type { TriggerReceivedEvent, TriggerReceivedEventSummary } from '#core/entities/received-event.js';
3
+ import type { TriggerEventReplay, TriggerReceivedEvent, TriggerReceivedEventSummary } from '#core/entities/received-event.js';
4
4
  export declare function toTriggerEventListItemDto(event: TriggerReceivedEventSummary): TriggerEventListItemDto;
5
5
  export declare function toTriggerEventDto(event: TriggerReceivedEvent): TriggerEventDto;
6
+ export declare function toTriggerEventReplayDto(replay: TriggerEventReplay): TriggerEventReplayDto;
6
7
  export declare function toTriggerDecisionDto(decision: TriggerDecision): TriggerDecisionDto;
7
8
  //# sourceMappingURL=trigger-events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"trigger-events.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/trigger-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EACV,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,kCAAkC,CAAC;AAE1C,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,2BAA2B,GACjC,uBAAuB,CAiBzB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,CAM9E;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,kBAAkB,CAmBlF"}
1
+ {"version":3,"file":"trigger-events.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/trigger-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,kCAAkC,CAAC;AAE1C,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,2BAA2B,GACjC,uBAAuB,CAkBzB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe,CAM9E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,qBAAqB,CAOzF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,kBAAkB,CAmBlF"}
@@ -7,6 +7,7 @@ export function toTriggerEventListItemDto(event) {
7
7
  provider: event.provider,
8
8
  source: event.source,
9
9
  event: event.event,
10
+ replay_of_event_id: event.replayOfEventId,
10
11
  delivery_id: event.deliveryId,
11
12
  connection_id: event.connectionId,
12
13
  outcome: event.outcome,
@@ -23,6 +24,14 @@ export function toTriggerEventDto(event) {
23
24
  payload: event.payload
24
25
  };
25
26
  }
27
+ export function toTriggerEventReplayDto(replay) {
28
+ return {
29
+ id: replay.id,
30
+ received_at: replay.receivedAt.toISOString(),
31
+ outcome: replay.outcome,
32
+ run_id: replay.runId
33
+ };
34
+ }
26
35
  export function toTriggerDecisionDto(decision) {
27
36
  return {
28
37
  id: decision.id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/dto/trigger-events.ts"],"sourcesContent":["import type {\n TriggerDecisionDto,\n TriggerEventDto,\n TriggerEventListItemDto,\n} from '@shipfox/api-triggers-dto';\nimport type {TriggerDecision} from '#core/entities/decision.js';\nimport type {\n TriggerReceivedEvent,\n TriggerReceivedEventSummary,\n} from '#core/entities/received-event.js';\n\nexport function toTriggerEventListItemDto(\n event: TriggerReceivedEventSummary,\n): TriggerEventListItemDto {\n return {\n id: event.id,\n event_ref: event.eventRef,\n origin: event.origin,\n workspace_id: event.workspaceId,\n provider: event.provider,\n source: event.source,\n event: event.event,\n delivery_id: event.deliveryId,\n connection_id: event.connectionId,\n outcome: event.outcome,\n matched_count: event.matchedCount,\n received_at: event.receivedAt.toISOString(),\n processed_at: event.processedAt?.toISOString() ?? null,\n created_at: event.createdAt.toISOString(),\n };\n}\n\nexport function toTriggerEventDto(event: TriggerReceivedEvent): TriggerEventDto {\n return {\n ...toTriggerEventListItemDto(event),\n connection_name: event.connectionName,\n payload: event.payload,\n };\n}\n\nexport function toTriggerDecisionDto(decision: TriggerDecision): TriggerDecisionDto {\n return {\n id: decision.id,\n received_event_id: decision.receivedEventId,\n subscription_kind: decision.subscriptionKind,\n subscription_id: decision.subscriptionId,\n subscription_name: decision.subscriptionName,\n workflow_definition_id: decision.workflowDefinitionId,\n project_id: decision.projectId,\n workflow_run_id: decision.workflowRunId,\n job_id: decision.jobId,\n matcher_kind: decision.matcherKind,\n matcher_ordinal: decision.matcherOrdinal,\n decision: decision.decision,\n run_id: decision.runId,\n run_name: decision.runName,\n reason: decision.reason,\n created_at: decision.createdAt.toISOString(),\n };\n}\n"],"names":["toTriggerEventListItemDto","event","id","event_ref","eventRef","origin","workspace_id","workspaceId","provider","source","delivery_id","deliveryId","connection_id","connectionId","outcome","matched_count","matchedCount","received_at","receivedAt","toISOString","processed_at","processedAt","created_at","createdAt","toTriggerEventDto","connection_name","connectionName","payload","toTriggerDecisionDto","decision","received_event_id","receivedEventId","subscription_kind","subscriptionKind","subscription_id","subscriptionId","subscription_name","subscriptionName","workflow_definition_id","workflowDefinitionId","project_id","projectId","workflow_run_id","workflowRunId","job_id","jobId","matcher_kind","matcherKind","matcher_ordinal","matcherOrdinal","run_id","runId","run_name","runName","reason"],"mappings":"AAWA,OAAO,SAASA,0BACdC,KAAkC;IAElC,OAAO;QACLC,IAAID,MAAMC,EAAE;QACZC,WAAWF,MAAMG,QAAQ;QACzBC,QAAQJ,MAAMI,MAAM;QACpBC,cAAcL,MAAMM,WAAW;QAC/BC,UAAUP,MAAMO,QAAQ;QACxBC,QAAQR,MAAMQ,MAAM;QACpBR,OAAOA,MAAMA,KAAK;QAClBS,aAAaT,MAAMU,UAAU;QAC7BC,eAAeX,MAAMY,YAAY;QACjCC,SAASb,MAAMa,OAAO;QACtBC,eAAed,MAAMe,YAAY;QACjCC,aAAahB,MAAMiB,UAAU,CAACC,WAAW;QACzCC,cAAcnB,MAAMoB,WAAW,EAAEF,iBAAiB;QAClDG,YAAYrB,MAAMsB,SAAS,CAACJ,WAAW;IACzC;AACF;AAEA,OAAO,SAASK,kBAAkBvB,KAA2B;IAC3D,OAAO;QACL,GAAGD,0BAA0BC,MAAM;QACnCwB,iBAAiBxB,MAAMyB,cAAc;QACrCC,SAAS1B,MAAM0B,OAAO;IACxB;AACF;AAEA,OAAO,SAASC,qBAAqBC,QAAyB;IAC5D,OAAO;QACL3B,IAAI2B,SAAS3B,EAAE;QACf4B,mBAAmBD,SAASE,eAAe;QAC3CC,mBAAmBH,SAASI,gBAAgB;QAC5CC,iBAAiBL,SAASM,cAAc;QACxCC,mBAAmBP,SAASQ,gBAAgB;QAC5CC,wBAAwBT,SAASU,oBAAoB;QACrDC,YAAYX,SAASY,SAAS;QAC9BC,iBAAiBb,SAASc,aAAa;QACvCC,QAAQf,SAASgB,KAAK;QACtBC,cAAcjB,SAASkB,WAAW;QAClCC,iBAAiBnB,SAASoB,cAAc;QACxCpB,UAAUA,SAASA,QAAQ;QAC3BqB,QAAQrB,SAASsB,KAAK;QACtBC,UAAUvB,SAASwB,OAAO;QAC1BC,QAAQzB,SAASyB,MAAM;QACvBhC,YAAYO,SAASN,SAAS,CAACJ,WAAW;IAC5C;AACF"}
1
+ {"version":3,"sources":["../../../src/presentation/dto/trigger-events.ts"],"sourcesContent":["import type {\n TriggerDecisionDto,\n TriggerEventDto,\n TriggerEventListItemDto,\n TriggerEventReplayDto,\n} from '@shipfox/api-triggers-dto';\nimport type {TriggerDecision} from '#core/entities/decision.js';\nimport type {\n TriggerEventReplay,\n TriggerReceivedEvent,\n TriggerReceivedEventSummary,\n} from '#core/entities/received-event.js';\n\nexport function toTriggerEventListItemDto(\n event: TriggerReceivedEventSummary,\n): TriggerEventListItemDto {\n return {\n id: event.id,\n event_ref: event.eventRef,\n origin: event.origin,\n workspace_id: event.workspaceId,\n provider: event.provider,\n source: event.source,\n event: event.event,\n replay_of_event_id: event.replayOfEventId,\n delivery_id: event.deliveryId,\n connection_id: event.connectionId,\n outcome: event.outcome,\n matched_count: event.matchedCount,\n received_at: event.receivedAt.toISOString(),\n processed_at: event.processedAt?.toISOString() ?? null,\n created_at: event.createdAt.toISOString(),\n };\n}\n\nexport function toTriggerEventDto(event: TriggerReceivedEvent): TriggerEventDto {\n return {\n ...toTriggerEventListItemDto(event),\n connection_name: event.connectionName,\n payload: event.payload,\n };\n}\n\nexport function toTriggerEventReplayDto(replay: TriggerEventReplay): TriggerEventReplayDto {\n return {\n id: replay.id,\n received_at: replay.receivedAt.toISOString(),\n outcome: replay.outcome,\n run_id: replay.runId,\n };\n}\n\nexport function toTriggerDecisionDto(decision: TriggerDecision): TriggerDecisionDto {\n return {\n id: decision.id,\n received_event_id: decision.receivedEventId,\n subscription_kind: decision.subscriptionKind,\n subscription_id: decision.subscriptionId,\n subscription_name: decision.subscriptionName,\n workflow_definition_id: decision.workflowDefinitionId,\n project_id: decision.projectId,\n workflow_run_id: decision.workflowRunId,\n job_id: decision.jobId,\n matcher_kind: decision.matcherKind,\n matcher_ordinal: decision.matcherOrdinal,\n decision: decision.decision,\n run_id: decision.runId,\n run_name: decision.runName,\n reason: decision.reason,\n created_at: decision.createdAt.toISOString(),\n };\n}\n"],"names":["toTriggerEventListItemDto","event","id","event_ref","eventRef","origin","workspace_id","workspaceId","provider","source","replay_of_event_id","replayOfEventId","delivery_id","deliveryId","connection_id","connectionId","outcome","matched_count","matchedCount","received_at","receivedAt","toISOString","processed_at","processedAt","created_at","createdAt","toTriggerEventDto","connection_name","connectionName","payload","toTriggerEventReplayDto","replay","run_id","runId","toTriggerDecisionDto","decision","received_event_id","receivedEventId","subscription_kind","subscriptionKind","subscription_id","subscriptionId","subscription_name","subscriptionName","workflow_definition_id","workflowDefinitionId","project_id","projectId","workflow_run_id","workflowRunId","job_id","jobId","matcher_kind","matcherKind","matcher_ordinal","matcherOrdinal","run_name","runName","reason"],"mappings":"AAaA,OAAO,SAASA,0BACdC,KAAkC;IAElC,OAAO;QACLC,IAAID,MAAMC,EAAE;QACZC,WAAWF,MAAMG,QAAQ;QACzBC,QAAQJ,MAAMI,MAAM;QACpBC,cAAcL,MAAMM,WAAW;QAC/BC,UAAUP,MAAMO,QAAQ;QACxBC,QAAQR,MAAMQ,MAAM;QACpBR,OAAOA,MAAMA,KAAK;QAClBS,oBAAoBT,MAAMU,eAAe;QACzCC,aAAaX,MAAMY,UAAU;QAC7BC,eAAeb,MAAMc,YAAY;QACjCC,SAASf,MAAMe,OAAO;QACtBC,eAAehB,MAAMiB,YAAY;QACjCC,aAAalB,MAAMmB,UAAU,CAACC,WAAW;QACzCC,cAAcrB,MAAMsB,WAAW,EAAEF,iBAAiB;QAClDG,YAAYvB,MAAMwB,SAAS,CAACJ,WAAW;IACzC;AACF;AAEA,OAAO,SAASK,kBAAkBzB,KAA2B;IAC3D,OAAO;QACL,GAAGD,0BAA0BC,MAAM;QACnC0B,iBAAiB1B,MAAM2B,cAAc;QACrCC,SAAS5B,MAAM4B,OAAO;IACxB;AACF;AAEA,OAAO,SAASC,wBAAwBC,MAA0B;IAChE,OAAO;QACL7B,IAAI6B,OAAO7B,EAAE;QACbiB,aAAaY,OAAOX,UAAU,CAACC,WAAW;QAC1CL,SAASe,OAAOf,OAAO;QACvBgB,QAAQD,OAAOE,KAAK;IACtB;AACF;AAEA,OAAO,SAASC,qBAAqBC,QAAyB;IAC5D,OAAO;QACLjC,IAAIiC,SAASjC,EAAE;QACfkC,mBAAmBD,SAASE,eAAe;QAC3CC,mBAAmBH,SAASI,gBAAgB;QAC5CC,iBAAiBL,SAASM,cAAc;QACxCC,mBAAmBP,SAASQ,gBAAgB;QAC5CC,wBAAwBT,SAASU,oBAAoB;QACrDC,YAAYX,SAASY,SAAS;QAC9BC,iBAAiBb,SAASc,aAAa;QACvCC,QAAQf,SAASgB,KAAK;QACtBC,cAAcjB,SAASkB,WAAW;QAClCC,iBAAiBnB,SAASoB,cAAc;QACxCpB,UAAUA,SAASA,QAAQ;QAC3BH,QAAQG,SAASF,KAAK;QACtBuB,UAAUrB,SAASsB,OAAO;QAC1BC,QAAQvB,SAASuB,MAAM;QACvBlC,YAAYW,SAASV,SAAS,CAACJ,WAAW;IAC5C;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"get-trigger-event.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/get-trigger-event.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,oBAAoB,iDAkC/B,CAAC"}
1
+ {"version":3,"file":"get-trigger-event.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/get-trigger-event.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,oBAAoB,iDAsC/B,CAAC"}
@@ -2,8 +2,8 @@ import { requireWorkspaceResourceAccess } from '@shipfox/api-auth-context';
2
2
  import { triggerEventDetailResponseSchema } from '@shipfox/api-triggers-dto';
3
3
  import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
4
  import { z } from 'zod';
5
- import { getTriggerEventById, listDecisionsByReceivedEventId } from '#db/index.js';
6
- import { toTriggerDecisionDto, toTriggerEventDto } from '#presentation/dto/trigger-events.js';
5
+ import { getTriggerEventById, listDecisionsByReceivedEventId, listReplaysOfTriggerEvent } from '#db/index.js';
6
+ import { toTriggerDecisionDto, toTriggerEventDto, toTriggerEventReplayDto } from '#presentation/dto/trigger-events.js';
7
7
  export const getTriggerEventRoute = defineRoute({
8
8
  method: 'GET',
9
9
  path: '/:id',
@@ -33,10 +33,14 @@ export const getTriggerEventRoute = defineRoute({
33
33
  status: 404
34
34
  })
35
35
  });
36
- const decisions = await listDecisionsByReceivedEventId(event.id);
36
+ const [decisions, replays] = await Promise.all([
37
+ listDecisionsByReceivedEventId(event.id),
38
+ listReplaysOfTriggerEvent(event.id, event.workspaceId)
39
+ ]);
37
40
  return {
38
41
  ...toTriggerEventDto(event),
39
- decisions: decisions.map(toTriggerDecisionDto)
42
+ decisions: decisions.map(toTriggerDecisionDto),
43
+ replays: replays.map(toTriggerEventReplayDto)
40
44
  };
41
45
  }
42
46
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/get-trigger-event.ts"],"sourcesContent":["import {requireWorkspaceResourceAccess} from '@shipfox/api-auth-context';\nimport {triggerEventDetailResponseSchema} from '@shipfox/api-triggers-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {getTriggerEventById, listDecisionsByReceivedEventId} from '#db/index.js';\nimport {toTriggerDecisionDto, toTriggerEventDto} from '#presentation/dto/trigger-events.js';\n\nexport const getTriggerEventRoute = defineRoute({\n method: 'GET',\n path: '/:id',\n description: 'Get a trigger event by ID with its routing decisions.',\n schema: {\n params: z.object({\n id: z.string().uuid(),\n }),\n response: {\n 200: triggerEventDetailResponseSchema,\n },\n },\n handler: async (request) => {\n const {id} = request.params;\n\n const event = await getTriggerEventById(id);\n // Missing events and memberships remain 404 to avoid leaking existence; lifecycle claims\n // propagate their stable access errors.\n if (!event) {\n throw new ClientError('Trigger event not found', 'not-found', {status: 404});\n }\n requireWorkspaceResourceAccess({\n request,\n workspaceId: event.workspaceId,\n notFoundError: new ClientError('Trigger event not found', 'not-found', {status: 404}),\n });\n\n const decisions = await listDecisionsByReceivedEventId(event.id);\n\n return {\n ...toTriggerEventDto(event),\n decisions: decisions.map(toTriggerDecisionDto),\n };\n },\n});\n"],"names":["requireWorkspaceResourceAccess","triggerEventDetailResponseSchema","ClientError","defineRoute","z","getTriggerEventById","listDecisionsByReceivedEventId","toTriggerDecisionDto","toTriggerEventDto","getTriggerEventRoute","method","path","description","schema","params","object","id","string","uuid","response","handler","request","event","status","workspaceId","notFoundError","decisions","map"],"mappings":"AAAA,SAAQA,8BAA8B,QAAO,4BAA4B;AACzE,SAAQC,gCAAgC,QAAO,4BAA4B;AAC3E,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,mBAAmB,EAAEC,8BAA8B,QAAO,eAAe;AACjF,SAAQC,oBAAoB,EAAEC,iBAAiB,QAAO,sCAAsC;AAE5F,OAAO,MAAMC,uBAAuBN,YAAY;IAC9CO,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,QAAQV,EAAEW,MAAM,CAAC;YACfC,IAAIZ,EAAEa,MAAM,GAAGC,IAAI;QACrB;QACAC,UAAU;YACR,KAAKlB;QACP;IACF;IACAmB,SAAS,OAAOC;QACd,MAAM,EAACL,EAAE,EAAC,GAAGK,QAAQP,MAAM;QAE3B,MAAMQ,QAAQ,MAAMjB,oBAAoBW;QACxC,yFAAyF;QACzF,wCAAwC;QACxC,IAAI,CAACM,OAAO;YACV,MAAM,IAAIpB,YAAY,2BAA2B,aAAa;gBAACqB,QAAQ;YAAG;QAC5E;QACAvB,+BAA+B;YAC7BqB;YACAG,aAAaF,MAAME,WAAW;YAC9BC,eAAe,IAAIvB,YAAY,2BAA2B,aAAa;gBAACqB,QAAQ;YAAG;QACrF;QAEA,MAAMG,YAAY,MAAMpB,+BAA+BgB,MAAMN,EAAE;QAE/D,OAAO;YACL,GAAGR,kBAAkBc,MAAM;YAC3BI,WAAWA,UAAUC,GAAG,CAACpB;QAC3B;IACF;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/get-trigger-event.ts"],"sourcesContent":["import {requireWorkspaceResourceAccess} from '@shipfox/api-auth-context';\nimport {triggerEventDetailResponseSchema} from '@shipfox/api-triggers-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {\n getTriggerEventById,\n listDecisionsByReceivedEventId,\n listReplaysOfTriggerEvent,\n} from '#db/index.js';\nimport {\n toTriggerDecisionDto,\n toTriggerEventDto,\n toTriggerEventReplayDto,\n} from '#presentation/dto/trigger-events.js';\n\nexport const getTriggerEventRoute = defineRoute({\n method: 'GET',\n path: '/:id',\n description: 'Get a trigger event by ID with its routing decisions.',\n schema: {\n params: z.object({\n id: z.string().uuid(),\n }),\n response: {\n 200: triggerEventDetailResponseSchema,\n },\n },\n handler: async (request) => {\n const {id} = request.params;\n\n const event = await getTriggerEventById(id);\n // Missing events and memberships remain 404 to avoid leaking existence; lifecycle claims\n // propagate their stable access errors.\n if (!event) {\n throw new ClientError('Trigger event not found', 'not-found', {status: 404});\n }\n requireWorkspaceResourceAccess({\n request,\n workspaceId: event.workspaceId,\n notFoundError: new ClientError('Trigger event not found', 'not-found', {status: 404}),\n });\n\n const [decisions, replays] = await Promise.all([\n listDecisionsByReceivedEventId(event.id),\n listReplaysOfTriggerEvent(event.id, event.workspaceId),\n ]);\n\n return {\n ...toTriggerEventDto(event),\n decisions: decisions.map(toTriggerDecisionDto),\n replays: replays.map(toTriggerEventReplayDto),\n };\n },\n});\n"],"names":["requireWorkspaceResourceAccess","triggerEventDetailResponseSchema","ClientError","defineRoute","z","getTriggerEventById","listDecisionsByReceivedEventId","listReplaysOfTriggerEvent","toTriggerDecisionDto","toTriggerEventDto","toTriggerEventReplayDto","getTriggerEventRoute","method","path","description","schema","params","object","id","string","uuid","response","handler","request","event","status","workspaceId","notFoundError","decisions","replays","Promise","all","map"],"mappings":"AAAA,SAAQA,8BAA8B,QAAO,4BAA4B;AACzE,SAAQC,gCAAgC,QAAO,4BAA4B;AAC3E,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,CAAC,QAAO,MAAM;AACtB,SACEC,mBAAmB,EACnBC,8BAA8B,EAC9BC,yBAAyB,QACpB,eAAe;AACtB,SACEC,oBAAoB,EACpBC,iBAAiB,EACjBC,uBAAuB,QAClB,sCAAsC;AAE7C,OAAO,MAAMC,uBAAuBR,YAAY;IAC9CS,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,QAAQZ,EAAEa,MAAM,CAAC;YACfC,IAAId,EAAEe,MAAM,GAAGC,IAAI;QACrB;QACAC,UAAU;YACR,KAAKpB;QACP;IACF;IACAqB,SAAS,OAAOC;QACd,MAAM,EAACL,EAAE,EAAC,GAAGK,QAAQP,MAAM;QAE3B,MAAMQ,QAAQ,MAAMnB,oBAAoBa;QACxC,yFAAyF;QACzF,wCAAwC;QACxC,IAAI,CAACM,OAAO;YACV,MAAM,IAAItB,YAAY,2BAA2B,aAAa;gBAACuB,QAAQ;YAAG;QAC5E;QACAzB,+BAA+B;YAC7BuB;YACAG,aAAaF,MAAME,WAAW;YAC9BC,eAAe,IAAIzB,YAAY,2BAA2B,aAAa;gBAACuB,QAAQ;YAAG;QACrF;QAEA,MAAM,CAACG,WAAWC,QAAQ,GAAG,MAAMC,QAAQC,GAAG,CAAC;YAC7CzB,+BAA+BkB,MAAMN,EAAE;YACvCX,0BAA0BiB,MAAMN,EAAE,EAAEM,MAAME,WAAW;SACtD;QAED,OAAO;YACL,GAAGjB,kBAAkBe,MAAM;YAC3BI,WAAWA,UAAUI,GAAG,CAACxB;YACzBqB,SAASA,QAAQG,GAAG,CAACtB;QACvB;IACF;AACF,GAAG"}
@@ -5,7 +5,7 @@ import { listTriggerEventFacets } from '#db/index.js';
5
5
  export const listTriggerEventFacetsRoute = defineRoute({
6
6
  method: 'GET',
7
7
  path: '/facets',
8
- description: 'Distinct source and event filter values (with counts) for a workspace.',
8
+ description: 'Distinct source, event, and origin filter values (with counts) for a workspace.',
9
9
  schema: {
10
10
  querystring: triggerEventFacetsQuerySchema,
11
11
  response: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/list-trigger-event-facets.ts"],"sourcesContent":["import {requireWorkspaceAccess} from '@shipfox/api-auth-context';\nimport {\n triggerEventFacetsQuerySchema,\n triggerEventFacetsResponseSchema,\n} from '@shipfox/api-triggers-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {listTriggerEventFacets} from '#db/index.js';\n\nexport const listTriggerEventFacetsRoute = defineRoute({\n method: 'GET',\n path: '/facets',\n description: 'Distinct source and event filter values (with counts) for a workspace.',\n schema: {\n querystring: triggerEventFacetsQuerySchema,\n response: {\n 200: triggerEventFacetsResponseSchema,\n },\n },\n handler: async (request) => {\n const {workspace_id: workspaceId} = request.query;\n\n requireWorkspaceAccess({request, workspaceId});\n\n return await listTriggerEventFacets({workspaceId});\n },\n});\n"],"names":["requireWorkspaceAccess","triggerEventFacetsQuerySchema","triggerEventFacetsResponseSchema","defineRoute","listTriggerEventFacets","listTriggerEventFacetsRoute","method","path","description","schema","querystring","response","handler","request","workspace_id","workspaceId","query"],"mappings":"AAAA,SAAQA,sBAAsB,QAAO,4BAA4B;AACjE,SACEC,6BAA6B,EAC7BC,gCAAgC,QAC3B,4BAA4B;AACnC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,sBAAsB,QAAO,eAAe;AAEpD,OAAO,MAAMC,8BAA8BF,YAAY;IACrDG,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,aAAaT;QACbU,UAAU;YACR,KAAKT;QACP;IACF;IACAU,SAAS,OAAOC;QACd,MAAM,EAACC,cAAcC,WAAW,EAAC,GAAGF,QAAQG,KAAK;QAEjDhB,uBAAuB;YAACa;YAASE;QAAW;QAE5C,OAAO,MAAMX,uBAAuB;YAACW;QAAW;IAClD;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/list-trigger-event-facets.ts"],"sourcesContent":["import {requireWorkspaceAccess} from '@shipfox/api-auth-context';\nimport {\n triggerEventFacetsQuerySchema,\n triggerEventFacetsResponseSchema,\n} from '@shipfox/api-triggers-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {listTriggerEventFacets} from '#db/index.js';\n\nexport const listTriggerEventFacetsRoute = defineRoute({\n method: 'GET',\n path: '/facets',\n description: 'Distinct source, event, and origin filter values (with counts) for a workspace.',\n schema: {\n querystring: triggerEventFacetsQuerySchema,\n response: {\n 200: triggerEventFacetsResponseSchema,\n },\n },\n handler: async (request) => {\n const {workspace_id: workspaceId} = request.query;\n\n requireWorkspaceAccess({request, workspaceId});\n\n return await listTriggerEventFacets({workspaceId});\n },\n});\n"],"names":["requireWorkspaceAccess","triggerEventFacetsQuerySchema","triggerEventFacetsResponseSchema","defineRoute","listTriggerEventFacets","listTriggerEventFacetsRoute","method","path","description","schema","querystring","response","handler","request","workspace_id","workspaceId","query"],"mappings":"AAAA,SAAQA,sBAAsB,QAAO,4BAA4B;AACjE,SACEC,6BAA6B,EAC7BC,gCAAgC,QAC3B,4BAA4B;AACnC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,sBAAsB,QAAO,eAAe;AAEpD,OAAO,MAAMC,8BAA8BF,YAAY;IACrDG,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,aAAaT;QACbU,UAAU;YACR,KAAKT;QACP;IACF;IACAU,SAAS,OAAOC;QACd,MAAM,EAACC,cAAcC,WAAW,EAAC,GAAGF,QAAQG,KAAK;QAEjDhB,uBAAuB;YAACa;YAASE;QAAW;QAE5C,OAAO,MAAMX,uBAAuB;YAACW;QAAW;IAClD;AACF,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-trigger-events.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/list-trigger-events.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,sBAAsB,iDAsDjC,CAAC"}
1
+ {"version":3,"file":"list-trigger-events.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/list-trigger-events.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,sBAAsB,iDA0DjC,CAAC"}
@@ -15,7 +15,7 @@ export const listTriggerEventsRoute = defineRoute({
15
15
  }
16
16
  },
17
17
  handler: async (request)=>{
18
- const { workspace_id: workspaceId, source, event, outcome: outcomes, from, to, limit, cursor } = request.query;
18
+ const { workspace_id: workspaceId, source, event, origin: origins, outcome: outcomes, replayable, from, to, limit, cursor } = request.query;
19
19
  requireWorkspaceAccess({
20
20
  request,
21
21
  workspaceId
@@ -36,7 +36,9 @@ export const listTriggerEventsRoute = defineRoute({
36
36
  filters: {
37
37
  source,
38
38
  event,
39
+ origins,
39
40
  outcomes,
41
+ replayable,
40
42
  from: from ? new Date(from) : undefined,
41
43
  to: to ? new Date(to) : undefined
42
44
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/routes/list-trigger-events.ts"],"sourcesContent":["import {requireWorkspaceAccess} from '@shipfox/api-auth-context';\nimport {\n triggerEventListQuerySchema,\n triggerEventListResponseSchema,\n} from '@shipfox/api-triggers-dto';\nimport {decodeTimestampIdCursor, encodeTimestampIdCursor} from '@shipfox/node-drizzle';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {listTriggerEvents} from '#db/index.js';\nimport {toTriggerEventListItemDto} from '#presentation/dto/trigger-events.js';\n\nexport const listTriggerEventsRoute = defineRoute({\n method: 'GET',\n path: '/',\n description: 'List trigger events for a workspace, newest first.',\n schema: {\n querystring: triggerEventListQuerySchema,\n response: {\n 200: triggerEventListResponseSchema,\n },\n },\n handler: async (request) => {\n const {\n workspace_id: workspaceId,\n source,\n event,\n outcome: outcomes,\n from,\n to,\n limit,\n cursor,\n } = request.query;\n\n requireWorkspaceAccess({request, workspaceId});\n\n const decodedCursor = decodeTimestampIdCursor(cursor);\n if (cursor && !decodedCursor) {\n throw new ClientError('Invalid cursor', 'invalid-cursor', {status: 400});\n }\n\n const result = await listTriggerEvents({\n workspaceId,\n limit,\n cursor: decodedCursor\n ? {receivedAt: decodedCursor.createdAt, id: decodedCursor.id}\n : undefined,\n filters: {\n source,\n event,\n outcomes,\n from: from ? new Date(from) : undefined,\n to: to ? new Date(to) : undefined,\n },\n });\n\n return {\n trigger_events: result.events.map(toTriggerEventListItemDto),\n next_cursor: result.nextCursor\n ? encodeTimestampIdCursor({\n createdAt: result.nextCursor.receivedAt,\n id: result.nextCursor.id,\n })\n : null,\n };\n },\n});\n"],"names":["requireWorkspaceAccess","triggerEventListQuerySchema","triggerEventListResponseSchema","decodeTimestampIdCursor","encodeTimestampIdCursor","ClientError","defineRoute","listTriggerEvents","toTriggerEventListItemDto","listTriggerEventsRoute","method","path","description","schema","querystring","response","handler","request","workspace_id","workspaceId","source","event","outcome","outcomes","from","to","limit","cursor","query","decodedCursor","status","result","receivedAt","createdAt","id","undefined","filters","Date","trigger_events","events","map","next_cursor","nextCursor"],"mappings":"AAAA,SAAQA,sBAAsB,QAAO,4BAA4B;AACjE,SACEC,2BAA2B,EAC3BC,8BAA8B,QACzB,4BAA4B;AACnC,SAAQC,uBAAuB,EAAEC,uBAAuB,QAAO,wBAAwB;AACvF,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,iBAAiB,QAAO,eAAe;AAC/C,SAAQC,yBAAyB,QAAO,sCAAsC;AAE9E,OAAO,MAAMC,yBAAyBH,YAAY;IAChDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,aAAab;QACbc,UAAU;YACR,KAAKb;QACP;IACF;IACAc,SAAS,OAAOC;QACd,MAAM,EACJC,cAAcC,WAAW,EACzBC,MAAM,EACNC,KAAK,EACLC,SAASC,QAAQ,EACjBC,IAAI,EACJC,EAAE,EACFC,KAAK,EACLC,MAAM,EACP,GAAGV,QAAQW,KAAK;QAEjB5B,uBAAuB;YAACiB;YAASE;QAAW;QAE5C,MAAMU,gBAAgB1B,wBAAwBwB;QAC9C,IAAIA,UAAU,CAACE,eAAe;YAC5B,MAAM,IAAIxB,YAAY,kBAAkB,kBAAkB;gBAACyB,QAAQ;YAAG;QACxE;QAEA,MAAMC,SAAS,MAAMxB,kBAAkB;YACrCY;YACAO;YACAC,QAAQE,gBACJ;gBAACG,YAAYH,cAAcI,SAAS;gBAAEC,IAAIL,cAAcK,EAAE;YAAA,IAC1DC;YACJC,SAAS;gBACPhB;gBACAC;gBACAE;gBACAC,MAAMA,OAAO,IAAIa,KAAKb,QAAQW;gBAC9BV,IAAIA,KAAK,IAAIY,KAAKZ,MAAMU;YAC1B;QACF;QAEA,OAAO;YACLG,gBAAgBP,OAAOQ,MAAM,CAACC,GAAG,CAAChC;YAClCiC,aAAaV,OAAOW,UAAU,GAC1BtC,wBAAwB;gBACtB6B,WAAWF,OAAOW,UAAU,CAACV,UAAU;gBACvCE,IAAIH,OAAOW,UAAU,CAACR,EAAE;YAC1B,KACA;QACN;IACF;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/presentation/routes/list-trigger-events.ts"],"sourcesContent":["import {requireWorkspaceAccess} from '@shipfox/api-auth-context';\nimport {\n triggerEventListQuerySchema,\n triggerEventListResponseSchema,\n} from '@shipfox/api-triggers-dto';\nimport {decodeTimestampIdCursor, encodeTimestampIdCursor} from '@shipfox/node-drizzle';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {listTriggerEvents} from '#db/index.js';\nimport {toTriggerEventListItemDto} from '#presentation/dto/trigger-events.js';\n\nexport const listTriggerEventsRoute = defineRoute({\n method: 'GET',\n path: '/',\n description: 'List trigger events for a workspace, newest first.',\n schema: {\n querystring: triggerEventListQuerySchema,\n response: {\n 200: triggerEventListResponseSchema,\n },\n },\n handler: async (request) => {\n const {\n workspace_id: workspaceId,\n source,\n event,\n origin: origins,\n outcome: outcomes,\n replayable,\n from,\n to,\n limit,\n cursor,\n } = request.query;\n\n requireWorkspaceAccess({request, workspaceId});\n\n const decodedCursor = decodeTimestampIdCursor(cursor);\n if (cursor && !decodedCursor) {\n throw new ClientError('Invalid cursor', 'invalid-cursor', {status: 400});\n }\n\n const result = await listTriggerEvents({\n workspaceId,\n limit,\n cursor: decodedCursor\n ? {receivedAt: decodedCursor.createdAt, id: decodedCursor.id}\n : undefined,\n filters: {\n source,\n event,\n origins,\n outcomes,\n replayable,\n from: from ? new Date(from) : undefined,\n to: to ? new Date(to) : undefined,\n },\n });\n\n return {\n trigger_events: result.events.map(toTriggerEventListItemDto),\n next_cursor: result.nextCursor\n ? encodeTimestampIdCursor({\n createdAt: result.nextCursor.receivedAt,\n id: result.nextCursor.id,\n })\n : null,\n };\n },\n});\n"],"names":["requireWorkspaceAccess","triggerEventListQuerySchema","triggerEventListResponseSchema","decodeTimestampIdCursor","encodeTimestampIdCursor","ClientError","defineRoute","listTriggerEvents","toTriggerEventListItemDto","listTriggerEventsRoute","method","path","description","schema","querystring","response","handler","request","workspace_id","workspaceId","source","event","origin","origins","outcome","outcomes","replayable","from","to","limit","cursor","query","decodedCursor","status","result","receivedAt","createdAt","id","undefined","filters","Date","trigger_events","events","map","next_cursor","nextCursor"],"mappings":"AAAA,SAAQA,sBAAsB,QAAO,4BAA4B;AACjE,SACEC,2BAA2B,EAC3BC,8BAA8B,QACzB,4BAA4B;AACnC,SAAQC,uBAAuB,EAAEC,uBAAuB,QAAO,wBAAwB;AACvF,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,iBAAiB,QAAO,eAAe;AAC/C,SAAQC,yBAAyB,QAAO,sCAAsC;AAE9E,OAAO,MAAMC,yBAAyBH,YAAY;IAChDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,aAAab;QACbc,UAAU;YACR,KAAKb;QACP;IACF;IACAc,SAAS,OAAOC;QACd,MAAM,EACJC,cAAcC,WAAW,EACzBC,MAAM,EACNC,KAAK,EACLC,QAAQC,OAAO,EACfC,SAASC,QAAQ,EACjBC,UAAU,EACVC,IAAI,EACJC,EAAE,EACFC,KAAK,EACLC,MAAM,EACP,GAAGb,QAAQc,KAAK;QAEjB/B,uBAAuB;YAACiB;YAASE;QAAW;QAE5C,MAAMa,gBAAgB7B,wBAAwB2B;QAC9C,IAAIA,UAAU,CAACE,eAAe;YAC5B,MAAM,IAAI3B,YAAY,kBAAkB,kBAAkB;gBAAC4B,QAAQ;YAAG;QACxE;QAEA,MAAMC,SAAS,MAAM3B,kBAAkB;YACrCY;YACAU;YACAC,QAAQE,gBACJ;gBAACG,YAAYH,cAAcI,SAAS;gBAAEC,IAAIL,cAAcK,EAAE;YAAA,IAC1DC;YACJC,SAAS;gBACPnB;gBACAC;gBACAE;gBACAE;gBACAC;gBACAC,MAAMA,OAAO,IAAIa,KAAKb,QAAQW;gBAC9BV,IAAIA,KAAK,IAAIY,KAAKZ,MAAMU;YAC1B;QACF;QAEA,OAAO;YACLG,gBAAgBP,OAAOQ,MAAM,CAACC,GAAG,CAACnC;YAClCoC,aAAaV,OAAOW,UAAU,GAC1BzC,wBAAwB;gBACtBgC,WAAWF,OAAOW,UAAU,CAACV,UAAU;gBACvCE,IAAIH,OAAOW,UAAU,CAACR,EAAE;YAC1B,KACA;QACN;IACF;AACF,GAAG"}