@shipfox/api-projects 2.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 (202) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/.turbo/turbo-type$colon$emit.log +1 -0
  3. package/.turbo/turbo-type.log +1 -0
  4. package/CHANGELOG.md +117 -0
  5. package/LICENSE +21 -0
  6. package/dist/core/entities/index.d.ts +2 -0
  7. package/dist/core/entities/index.d.ts.map +1 -0
  8. package/dist/core/entities/index.js +3 -0
  9. package/dist/core/entities/index.js.map +1 -0
  10. package/dist/core/entities/project.d.ts +10 -0
  11. package/dist/core/entities/project.d.ts.map +1 -0
  12. package/dist/core/entities/project.js +3 -0
  13. package/dist/core/entities/project.js.map +1 -0
  14. package/dist/core/errors.d.ts +13 -0
  15. package/dist/core/errors.d.ts.map +1 -0
  16. package/dist/core/errors.js +20 -0
  17. package/dist/core/errors.js.map +1 -0
  18. package/dist/core/index.d.ts +5 -0
  19. package/dist/core/index.d.ts.map +1 -0
  20. package/dist/core/index.js +4 -0
  21. package/dist/core/index.js.map +1 -0
  22. package/dist/core/projects.d.ts +12 -0
  23. package/dist/core/projects.d.ts.map +1 -0
  24. package/dist/core/projects.js +62 -0
  25. package/dist/core/projects.js.map +1 -0
  26. package/dist/db/db.d.ts +763 -0
  27. package/dist/db/db.d.ts.map +1 -0
  28. package/dist/db/db.js +22 -0
  29. package/dist/db/db.js.map +1 -0
  30. package/dist/db/index.d.ts +8 -0
  31. package/dist/db/index.d.ts.map +1 -0
  32. package/dist/db/index.js +10 -0
  33. package/dist/db/index.js.map +1 -0
  34. package/dist/db/integration-event-dedup.d.ts +17 -0
  35. package/dist/db/integration-event-dedup.d.ts.map +1 -0
  36. package/dist/db/integration-event-dedup.js +27 -0
  37. package/dist/db/integration-event-dedup.js.map +1 -0
  38. package/dist/db/projects.d.ts +36 -0
  39. package/dist/db/projects.d.ts.map +1 -0
  40. package/dist/db/projects.js +84 -0
  41. package/dist/db/projects.js.map +1 -0
  42. package/dist/db/schema/common.d.ts +2 -0
  43. package/dist/db/schema/common.d.ts.map +1 -0
  44. package/dist/db/schema/common.js +4 -0
  45. package/dist/db/schema/common.js.map +1 -0
  46. package/dist/db/schema/integration-event-dedup.d.ts +59 -0
  47. package/dist/db/schema/integration-event-dedup.d.ts.map +1 -0
  48. package/dist/db/schema/integration-event-dedup.js +19 -0
  49. package/dist/db/schema/integration-event-dedup.js.map +1 -0
  50. package/dist/db/schema/outbox.d.ts +195 -0
  51. package/dist/db/schema/outbox.d.ts.map +1 -0
  52. package/dist/db/schema/outbox.js +5 -0
  53. package/dist/db/schema/outbox.js.map +1 -0
  54. package/dist/db/schema/projects.d.ts +131 -0
  55. package/dist/db/schema/projects.d.ts.map +1 -0
  56. package/dist/db/schema/projects.js +32 -0
  57. package/dist/db/schema/projects.js.map +1 -0
  58. package/dist/index.d.ts +12 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +59 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/metrics/index.d.ts +3 -0
  63. package/dist/metrics/index.d.ts.map +1 -0
  64. package/dist/metrics/index.js +4 -0
  65. package/dist/metrics/index.js.map +1 -0
  66. package/dist/metrics/instance.d.ts +4 -0
  67. package/dist/metrics/instance.d.ts.map +1 -0
  68. package/dist/metrics/instance.js +25 -0
  69. package/dist/metrics/instance.js.map +1 -0
  70. package/dist/metrics/service.d.ts +2 -0
  71. package/dist/metrics/service.d.ts.map +1 -0
  72. package/dist/metrics/service.js +15 -0
  73. package/dist/metrics/service.js.map +1 -0
  74. package/dist/presentation/auth/require-project-access.d.ts +12 -0
  75. package/dist/presentation/auth/require-project-access.d.ts.map +1 -0
  76. package/dist/presentation/auth/require-project-access.js +25 -0
  77. package/dist/presentation/auth/require-project-access.js.map +1 -0
  78. package/dist/presentation/dto/index.d.ts +2 -0
  79. package/dist/presentation/dto/index.d.ts.map +1 -0
  80. package/dist/presentation/dto/index.js +3 -0
  81. package/dist/presentation/dto/index.js.map +1 -0
  82. package/dist/presentation/dto/project.d.ts +13 -0
  83. package/dist/presentation/dto/project.d.ts.map +1 -0
  84. package/dist/presentation/dto/project.js +15 -0
  85. package/dist/presentation/dto/project.js.map +1 -0
  86. package/dist/presentation/e2eRoutes/create-project.d.ts +2 -0
  87. package/dist/presentation/e2eRoutes/create-project.d.ts.map +1 -0
  88. package/dist/presentation/e2eRoutes/create-project.js +45 -0
  89. package/dist/presentation/e2eRoutes/create-project.js.map +1 -0
  90. package/dist/presentation/e2eRoutes/index.d.ts +3 -0
  91. package/dist/presentation/e2eRoutes/index.d.ts.map +1 -0
  92. package/dist/presentation/e2eRoutes/index.js +9 -0
  93. package/dist/presentation/e2eRoutes/index.js.map +1 -0
  94. package/dist/presentation/index.d.ts +3 -0
  95. package/dist/presentation/index.d.ts.map +1 -0
  96. package/dist/presentation/index.js +4 -0
  97. package/dist/presentation/index.js.map +1 -0
  98. package/dist/presentation/routes/create-project.d.ts +3 -0
  99. package/dist/presentation/routes/create-project.d.ts.map +1 -0
  100. package/dist/presentation/routes/create-project.js +94 -0
  101. package/dist/presentation/routes/create-project.js.map +1 -0
  102. package/dist/presentation/routes/cursor.d.ts +2 -0
  103. package/dist/presentation/routes/cursor.d.ts.map +1 -0
  104. package/dist/presentation/routes/cursor.js +3 -0
  105. package/dist/presentation/routes/cursor.js.map +1 -0
  106. package/dist/presentation/routes/get-project.d.ts +2 -0
  107. package/dist/presentation/routes/get-project.d.ts.map +1 -0
  108. package/dist/presentation/routes/get-project.js +30 -0
  109. package/dist/presentation/routes/get-project.js.map +1 -0
  110. package/dist/presentation/routes/index.d.ts +4 -0
  111. package/dist/presentation/routes/index.d.ts.map +1 -0
  112. package/dist/presentation/routes/index.js +17 -0
  113. package/dist/presentation/routes/index.js.map +1 -0
  114. package/dist/presentation/routes/list-projects.d.ts +2 -0
  115. package/dist/presentation/routes/list-projects.d.ts.map +1 -0
  116. package/dist/presentation/routes/list-projects.js +43 -0
  117. package/dist/presentation/routes/list-projects.js.map +1 -0
  118. package/dist/presentation/subscribers/index.d.ts +2 -0
  119. package/dist/presentation/subscribers/index.d.ts.map +1 -0
  120. package/dist/presentation/subscribers/index.js +3 -0
  121. package/dist/presentation/subscribers/index.js.map +1 -0
  122. package/dist/presentation/subscribers/on-source-commit-pushed.d.ts +4 -0
  123. package/dist/presentation/subscribers/on-source-commit-pushed.d.ts.map +1 -0
  124. package/dist/presentation/subscribers/on-source-commit-pushed.js +54 -0
  125. package/dist/presentation/subscribers/on-source-commit-pushed.js.map +1 -0
  126. package/dist/temporal/activities/index.d.ts +5 -0
  127. package/dist/temporal/activities/index.d.ts.map +1 -0
  128. package/dist/temporal/activities/index.js +8 -0
  129. package/dist/temporal/activities/index.js.map +1 -0
  130. package/dist/temporal/activities/prune-integration-event-dedup.d.ts +4 -0
  131. package/dist/temporal/activities/prune-integration-event-dedup.d.ts.map +1 -0
  132. package/dist/temporal/activities/prune-integration-event-dedup.js +11 -0
  133. package/dist/temporal/activities/prune-integration-event-dedup.js.map +1 -0
  134. package/dist/temporal/constants.d.ts +3 -0
  135. package/dist/temporal/constants.d.ts.map +1 -0
  136. package/dist/temporal/constants.js +4 -0
  137. package/dist/temporal/constants.js.map +1 -0
  138. package/dist/temporal/workflows/index.d.ts +2 -0
  139. package/dist/temporal/workflows/index.d.ts.map +1 -0
  140. package/dist/temporal/workflows/index.js +3 -0
  141. package/dist/temporal/workflows/index.js.map +1 -0
  142. package/dist/temporal/workflows/prune-integration-event-dedup-cron.d.ts +2 -0
  143. package/dist/temporal/workflows/prune-integration-event-dedup-cron.d.ts.map +1 -0
  144. package/dist/temporal/workflows/prune-integration-event-dedup-cron.js +14 -0
  145. package/dist/temporal/workflows/prune-integration-event-dedup-cron.js.map +1 -0
  146. package/dist/tsconfig.test.tsbuildinfo +1 -0
  147. package/drizzle/0000_initial.sql +37 -0
  148. package/drizzle/meta/0000_snapshot.json +307 -0
  149. package/drizzle/meta/_journal.json +13 -0
  150. package/drizzle.config.ts +7 -0
  151. package/package.json +76 -0
  152. package/src/core/entities/index.ts +1 -0
  153. package/src/core/entities/project.ts +9 -0
  154. package/src/core/errors.ts +26 -0
  155. package/src/core/index.ts +8 -0
  156. package/src/core/projects.test.ts +142 -0
  157. package/src/core/projects.ts +97 -0
  158. package/src/db/db.ts +22 -0
  159. package/src/db/index.ts +26 -0
  160. package/src/db/integration-event-dedup.ts +45 -0
  161. package/src/db/projects.test.ts +22 -0
  162. package/src/db/projects.ts +158 -0
  163. package/src/db/schema/common.ts +3 -0
  164. package/src/db/schema/integration-event-dedup.ts +15 -0
  165. package/src/db/schema/outbox.ts +4 -0
  166. package/src/db/schema/projects.ts +39 -0
  167. package/src/index.ts +71 -0
  168. package/src/metrics/index.ts +2 -0
  169. package/src/metrics/instance.ts +34 -0
  170. package/src/metrics/service.ts +17 -0
  171. package/src/presentation/auth/require-project-access.ts +29 -0
  172. package/src/presentation/dto/index.ts +1 -0
  173. package/src/presentation/dto/project.ts +15 -0
  174. package/src/presentation/e2eRoutes/create-project.test.ts +119 -0
  175. package/src/presentation/e2eRoutes/create-project.ts +50 -0
  176. package/src/presentation/e2eRoutes/index.ts +7 -0
  177. package/src/presentation/index.ts +2 -0
  178. package/src/presentation/routes/create-project.ts +102 -0
  179. package/src/presentation/routes/cursor.ts +5 -0
  180. package/src/presentation/routes/get-project.ts +24 -0
  181. package/src/presentation/routes/index.ts +14 -0
  182. package/src/presentation/routes/list-projects.ts +34 -0
  183. package/src/presentation/routes/projects.test.ts +266 -0
  184. package/src/presentation/subscribers/index.ts +1 -0
  185. package/src/presentation/subscribers/on-source-commit-pushed.test.ts +149 -0
  186. package/src/presentation/subscribers/on-source-commit-pushed.ts +64 -0
  187. package/src/temporal/activities/index.ts +7 -0
  188. package/src/temporal/activities/prune-integration-event-dedup.test.ts +50 -0
  189. package/src/temporal/activities/prune-integration-event-dedup.ts +9 -0
  190. package/src/temporal/constants.ts +3 -0
  191. package/src/temporal/workflows/index.ts +1 -0
  192. package/src/temporal/workflows/prune-integration-event-dedup-cron.ts +15 -0
  193. package/test/env.ts +14 -0
  194. package/test/factories/project.ts +24 -0
  195. package/test/globalSetup.ts +17 -0
  196. package/test/index.ts +1 -0
  197. package/test/setup.ts +17 -0
  198. package/tsconfig.build.json +9 -0
  199. package/tsconfig.build.tsbuildinfo +1 -0
  200. package/tsconfig.json +3 -0
  201. package/tsconfig.test.json +8 -0
  202. package/vitest.config.ts +12 -0
@@ -0,0 +1,131 @@
1
+ import type { Project } from '#core/entities/project.js';
2
+ export declare const projects: import("drizzle-orm/pg-core").PgTableWithColumns<{
3
+ name: "projects";
4
+ schema: undefined;
5
+ columns: {
6
+ id: import("drizzle-orm/pg-core").PgColumn<{
7
+ name: "id";
8
+ tableName: "projects";
9
+ dataType: "string";
10
+ columnType: "PgUUID";
11
+ data: string;
12
+ driverParam: string;
13
+ notNull: true;
14
+ hasDefault: true;
15
+ isPrimaryKey: true;
16
+ isAutoincrement: false;
17
+ hasRuntimeDefault: false;
18
+ enumValues: undefined;
19
+ baseColumn: never;
20
+ identity: undefined;
21
+ generated: undefined;
22
+ }, {}, {}>;
23
+ workspaceId: import("drizzle-orm/pg-core").PgColumn<{
24
+ name: "workspace_id";
25
+ tableName: "projects";
26
+ dataType: "string";
27
+ columnType: "PgUUID";
28
+ data: string;
29
+ driverParam: string;
30
+ notNull: true;
31
+ hasDefault: false;
32
+ isPrimaryKey: false;
33
+ isAutoincrement: false;
34
+ hasRuntimeDefault: false;
35
+ enumValues: undefined;
36
+ baseColumn: never;
37
+ identity: undefined;
38
+ generated: undefined;
39
+ }, {}, {}>;
40
+ sourceConnectionId: import("drizzle-orm/pg-core").PgColumn<{
41
+ name: "source_connection_id";
42
+ tableName: "projects";
43
+ dataType: "string";
44
+ columnType: "PgUUID";
45
+ data: string;
46
+ driverParam: string;
47
+ notNull: true;
48
+ hasDefault: false;
49
+ isPrimaryKey: false;
50
+ isAutoincrement: false;
51
+ hasRuntimeDefault: false;
52
+ enumValues: undefined;
53
+ baseColumn: never;
54
+ identity: undefined;
55
+ generated: undefined;
56
+ }, {}, {}>;
57
+ sourceExternalRepositoryId: import("drizzle-orm/pg-core").PgColumn<{
58
+ name: "source_external_repository_id";
59
+ tableName: "projects";
60
+ dataType: "string";
61
+ columnType: "PgText";
62
+ data: string;
63
+ driverParam: string;
64
+ notNull: true;
65
+ hasDefault: false;
66
+ isPrimaryKey: false;
67
+ isAutoincrement: false;
68
+ hasRuntimeDefault: false;
69
+ enumValues: [string, ...string[]];
70
+ baseColumn: never;
71
+ identity: undefined;
72
+ generated: undefined;
73
+ }, {}, {}>;
74
+ name: import("drizzle-orm/pg-core").PgColumn<{
75
+ name: "name";
76
+ tableName: "projects";
77
+ dataType: "string";
78
+ columnType: "PgText";
79
+ data: string;
80
+ driverParam: string;
81
+ notNull: true;
82
+ hasDefault: false;
83
+ isPrimaryKey: false;
84
+ isAutoincrement: false;
85
+ hasRuntimeDefault: false;
86
+ enumValues: [string, ...string[]];
87
+ baseColumn: never;
88
+ identity: undefined;
89
+ generated: undefined;
90
+ }, {}, {}>;
91
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
92
+ name: "created_at";
93
+ tableName: "projects";
94
+ dataType: "date";
95
+ columnType: "PgTimestamp";
96
+ data: Date;
97
+ driverParam: string;
98
+ notNull: true;
99
+ hasDefault: true;
100
+ isPrimaryKey: false;
101
+ isAutoincrement: false;
102
+ hasRuntimeDefault: false;
103
+ enumValues: undefined;
104
+ baseColumn: never;
105
+ identity: undefined;
106
+ generated: undefined;
107
+ }, {}, {}>;
108
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
109
+ name: "updated_at";
110
+ tableName: "projects";
111
+ dataType: "date";
112
+ columnType: "PgTimestamp";
113
+ data: Date;
114
+ driverParam: string;
115
+ notNull: true;
116
+ hasDefault: true;
117
+ isPrimaryKey: false;
118
+ isAutoincrement: false;
119
+ hasRuntimeDefault: false;
120
+ enumValues: undefined;
121
+ baseColumn: never;
122
+ identity: undefined;
123
+ generated: undefined;
124
+ }, {}, {}>;
125
+ };
126
+ dialect: "pg";
127
+ }>;
128
+ export type ProjectDb = typeof projects.$inferSelect;
129
+ export type ProjectCreateDb = typeof projects.$inferInsert;
130
+ export declare function toProject(row: ProjectDb): Project;
131
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/db/schema/projects.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,2BAA2B,CAAC;AAGvD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBpB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAC;AACrD,MAAM,MAAM,eAAe,GAAG,OAAO,QAAQ,CAAC,YAAY,CAAC;AAE3D,wBAAgB,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAUjD"}
@@ -0,0 +1,32 @@
1
+ import { uuidv7PrimaryKey } from '@shipfox/node-drizzle';
2
+ import { index, text, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
3
+ import { pgTable } from './common.js';
4
+ export const projects = pgTable('projects', {
5
+ id: uuidv7PrimaryKey(),
6
+ workspaceId: uuid('workspace_id').notNull(),
7
+ sourceConnectionId: uuid('source_connection_id').notNull(),
8
+ sourceExternalRepositoryId: text('source_external_repository_id').notNull(),
9
+ name: text('name').notNull(),
10
+ createdAt: timestamp('created_at', {
11
+ withTimezone: true
12
+ }).notNull().defaultNow(),
13
+ updatedAt: timestamp('updated_at', {
14
+ withTimezone: true
15
+ }).notNull().defaultNow()
16
+ }, (table)=>[
17
+ uniqueIndex('projects_source_unique').on(table.sourceConnectionId, table.sourceExternalRepositoryId),
18
+ index('projects_workspace_created_id_idx').on(table.workspaceId, table.createdAt, table.id)
19
+ ]);
20
+ export function toProject(row) {
21
+ return {
22
+ id: row.id,
23
+ workspaceId: row.workspaceId,
24
+ sourceConnectionId: row.sourceConnectionId,
25
+ sourceExternalRepositoryId: row.sourceExternalRepositoryId,
26
+ name: row.name,
27
+ createdAt: row.createdAt,
28
+ updatedAt: row.updatedAt
29
+ };
30
+ }
31
+
32
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/db/schema/projects.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {index, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {Project} from '#core/entities/project.js';\nimport {pgTable} from './common.js';\n\nexport const projects = pgTable(\n 'projects',\n {\n id: uuidv7PrimaryKey(),\n workspaceId: uuid('workspace_id').notNull(),\n sourceConnectionId: uuid('source_connection_id').notNull(),\n sourceExternalRepositoryId: text('source_external_repository_id').notNull(),\n name: text('name').notNull(),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('projects_source_unique').on(\n table.sourceConnectionId,\n table.sourceExternalRepositoryId,\n ),\n index('projects_workspace_created_id_idx').on(table.workspaceId, table.createdAt, table.id),\n ],\n);\n\nexport type ProjectDb = typeof projects.$inferSelect;\nexport type ProjectCreateDb = typeof projects.$inferInsert;\n\nexport function toProject(row: ProjectDb): Project {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n sourceConnectionId: row.sourceConnectionId,\n sourceExternalRepositoryId: row.sourceExternalRepositoryId,\n name: row.name,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","index","text","timestamp","uniqueIndex","uuid","pgTable","projects","id","workspaceId","notNull","sourceConnectionId","sourceExternalRepositoryId","name","createdAt","withTimezone","defaultNow","updatedAt","table","on","toProject","row"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,KAAK,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AAE9E,SAAQC,OAAO,QAAO,cAAc;AAEpC,OAAO,MAAMC,WAAWD,QACtB,YACA;IACEE,IAAIR;IACJS,aAAaJ,KAAK,gBAAgBK,OAAO;IACzCC,oBAAoBN,KAAK,wBAAwBK,OAAO;IACxDE,4BAA4BV,KAAK,iCAAiCQ,OAAO;IACzEG,MAAMX,KAAK,QAAQQ,OAAO;IAC1BI,WAAWX,UAAU,cAAc;QAACY,cAAc;IAAI,GAAGL,OAAO,GAAGM,UAAU;IAC7EC,WAAWd,UAAU,cAAc;QAACY,cAAc;IAAI,GAAGL,OAAO,GAAGM,UAAU;AAC/E,GACA,CAACE,QAAU;QACTd,YAAY,0BAA0Be,EAAE,CACtCD,MAAMP,kBAAkB,EACxBO,MAAMN,0BAA0B;QAElCX,MAAM,qCAAqCkB,EAAE,CAACD,MAAMT,WAAW,EAAES,MAAMJ,SAAS,EAAEI,MAAMV,EAAE;KAC3F,EACD;AAKF,OAAO,SAASY,UAAUC,GAAc;IACtC,OAAO;QACLb,IAAIa,IAAIb,EAAE;QACVC,aAAaY,IAAIZ,WAAW;QAC5BE,oBAAoBU,IAAIV,kBAAkB;QAC1CC,4BAA4BS,IAAIT,0BAA0B;QAC1DC,MAAMQ,IAAIR,IAAI;QACdC,WAAWO,IAAIP,SAAS;QACxBG,WAAWI,IAAIJ,SAAS;IAC1B;AACF"}
@@ -0,0 +1,12 @@
1
+ import type { IntegrationSourceControlService } from '@shipfox/api-integration-core';
2
+ import { type ShipfoxModule } from '@shipfox/node-module';
3
+ export type { Project } from '#core/index.js';
4
+ export { createProjectFromSource, ProjectAccessDeniedError, ProjectAlreadyExistsError, ProjectNotFoundError, } from '#core/index.js';
5
+ export type { GetProjectBySourceParams } from '#db/index.js';
6
+ export { createProject, db, getProjectById, getProjectBySource, listProjects, migrationsPath, projectsOutbox, requireProjectForWorkspace, } from '#db/index.js';
7
+ export { createProjectRoutes, requireProjectAccess } from '#presentation/index.js';
8
+ export interface CreateProjectsModuleOptions {
9
+ sourceControl: IntegrationSourceControlService;
10
+ }
11
+ export declare function createProjectsModule({ sourceControl }: CreateProjectsModuleOptions): ShipfoxModule;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,+BAA+B,EAAC,MAAM,+BAA+B,CAAC;AAMnF,OAAO,EAAC,KAAK,aAAa,EAAoB,MAAM,sBAAsB,CAAC;AAc3E,YAAY,EAAC,OAAO,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAC,wBAAwB,EAAC,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,EAAE,EACF,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,mBAAmB,EAAE,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAEjF,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,+BAA+B,CAAC;CAChD;AAED,wBAAgB,oBAAoB,CAAC,EAAC,aAAa,EAAC,EAAE,2BAA2B,GAAG,aAAa,CAwBhG"}
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { INTEGRATION_SOURCE_COMMIT_PUSHED } from '@shipfox/api-integration-core-dto';
4
+ import { projectsEventSchemas } from '@shipfox/api-projects-dto';
5
+ import { subscriberFactory } from '@shipfox/node-module';
6
+ import { db, migrationsPath, projectsOutbox } from '#db/index.js';
7
+ import { registerProjectsServiceMetrics } from '#metrics/index.js';
8
+ import { projectsE2eRoutes } from '#presentation/e2eRoutes/index.js';
9
+ import { createProjectRoutes } from '#presentation/index.js';
10
+ import { onSourceCommitPushed } from '#presentation/subscribers/index.js';
11
+ import { createProjectsMaintenanceActivities } from '#temporal/activities/index.js';
12
+ import { PROJECTS_MAINTENANCE_TASK_QUEUE } from '#temporal/constants.js';
13
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
14
+ const maintenanceWorkflowsPath = resolve(packageRoot, 'dist/temporal/workflows/index.js');
15
+ const subscriber = subscriberFactory();
16
+ export { createProjectFromSource, ProjectAccessDeniedError, ProjectAlreadyExistsError, ProjectNotFoundError } from '#core/index.js';
17
+ export { createProject, db, getProjectById, getProjectBySource, listProjects, migrationsPath, projectsOutbox, requireProjectForWorkspace } from '#db/index.js';
18
+ export { createProjectRoutes, requireProjectAccess } from '#presentation/index.js';
19
+ export function createProjectsModule({ sourceControl }) {
20
+ return {
21
+ name: 'projects',
22
+ database: {
23
+ db,
24
+ migrationsPath
25
+ },
26
+ routes: createProjectRoutes(sourceControl),
27
+ e2eRoutes: [
28
+ projectsE2eRoutes
29
+ ],
30
+ metrics: registerProjectsServiceMetrics,
31
+ publishers: [
32
+ {
33
+ name: 'projects',
34
+ table: projectsOutbox,
35
+ db,
36
+ eventSchemas: projectsEventSchemas
37
+ }
38
+ ],
39
+ subscribers: [
40
+ subscriber(INTEGRATION_SOURCE_COMMIT_PUSHED, onSourceCommitPushed)
41
+ ],
42
+ workers: [
43
+ {
44
+ taskQueue: PROJECTS_MAINTENANCE_TASK_QUEUE,
45
+ workflowsPath: maintenanceWorkflowsPath,
46
+ activities: createProjectsMaintenanceActivities,
47
+ workflows: [
48
+ {
49
+ name: 'pruneIntegrationEventDedupCron',
50
+ id: 'projects-prune-integration-event-dedup',
51
+ cronSchedule: '0 3 * * *'
52
+ }
53
+ ]
54
+ }
55
+ ]
56
+ };
57
+ }
58
+
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport type {IntegrationSourceControlService} from '@shipfox/api-integration-core';\nimport {\n INTEGRATION_SOURCE_COMMIT_PUSHED,\n type IntegrationsEventMap,\n} from '@shipfox/api-integration-core-dto';\nimport {projectsEventSchemas} from '@shipfox/api-projects-dto';\nimport {type ShipfoxModule, subscriberFactory} from '@shipfox/node-module';\nimport {db, migrationsPath, projectsOutbox} from '#db/index.js';\nimport {registerProjectsServiceMetrics} from '#metrics/index.js';\nimport {projectsE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {createProjectRoutes} from '#presentation/index.js';\nimport {onSourceCommitPushed} from '#presentation/subscribers/index.js';\nimport {createProjectsMaintenanceActivities} from '#temporal/activities/index.js';\nimport {PROJECTS_MAINTENANCE_TASK_QUEUE} from '#temporal/constants.js';\n\nconst packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');\nconst maintenanceWorkflowsPath = resolve(packageRoot, 'dist/temporal/workflows/index.js');\n\nconst subscriber = subscriberFactory<IntegrationsEventMap>();\n\nexport type {Project} from '#core/index.js';\nexport {\n createProjectFromSource,\n ProjectAccessDeniedError,\n ProjectAlreadyExistsError,\n ProjectNotFoundError,\n} from '#core/index.js';\nexport type {GetProjectBySourceParams} from '#db/index.js';\nexport {\n createProject,\n db,\n getProjectById,\n getProjectBySource,\n listProjects,\n migrationsPath,\n projectsOutbox,\n requireProjectForWorkspace,\n} from '#db/index.js';\nexport {createProjectRoutes, requireProjectAccess} from '#presentation/index.js';\n\nexport interface CreateProjectsModuleOptions {\n sourceControl: IntegrationSourceControlService;\n}\n\nexport function createProjectsModule({sourceControl}: CreateProjectsModuleOptions): ShipfoxModule {\n return {\n name: 'projects',\n database: {db, migrationsPath},\n routes: createProjectRoutes(sourceControl),\n e2eRoutes: [projectsE2eRoutes],\n metrics: registerProjectsServiceMetrics,\n publishers: [{name: 'projects', table: projectsOutbox, db, eventSchemas: projectsEventSchemas}],\n subscribers: [subscriber(INTEGRATION_SOURCE_COMMIT_PUSHED, onSourceCommitPushed)],\n workers: [\n {\n taskQueue: PROJECTS_MAINTENANCE_TASK_QUEUE,\n workflowsPath: maintenanceWorkflowsPath,\n activities: createProjectsMaintenanceActivities,\n workflows: [\n {\n name: 'pruneIntegrationEventDedupCron',\n id: 'projects-prune-integration-event-dedup',\n cronSchedule: '0 3 * * *',\n },\n ],\n },\n ],\n };\n}\n"],"names":["dirname","resolve","fileURLToPath","INTEGRATION_SOURCE_COMMIT_PUSHED","projectsEventSchemas","subscriberFactory","db","migrationsPath","projectsOutbox","registerProjectsServiceMetrics","projectsE2eRoutes","createProjectRoutes","onSourceCommitPushed","createProjectsMaintenanceActivities","PROJECTS_MAINTENANCE_TASK_QUEUE","packageRoot","url","maintenanceWorkflowsPath","subscriber","createProjectFromSource","ProjectAccessDeniedError","ProjectAlreadyExistsError","ProjectNotFoundError","createProject","getProjectById","getProjectBySource","listProjects","requireProjectForWorkspace","requireProjectAccess","createProjectsModule","sourceControl","name","database","routes","e2eRoutes","metrics","publishers","table","eventSchemas","subscribers","workers","taskQueue","workflowsPath","activities","workflows","id","cronSchedule"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SACEC,gCAAgC,QAE3B,oCAAoC;AAC3C,SAAQC,oBAAoB,QAAO,4BAA4B;AAC/D,SAA4BC,iBAAiB,QAAO,uBAAuB;AAC3E,SAAQC,EAAE,EAAEC,cAAc,EAAEC,cAAc,QAAO,eAAe;AAChE,SAAQC,8BAA8B,QAAO,oBAAoB;AACjE,SAAQC,iBAAiB,QAAO,mCAAmC;AACnE,SAAQC,mBAAmB,QAAO,yBAAyB;AAC3D,SAAQC,oBAAoB,QAAO,qCAAqC;AACxE,SAAQC,mCAAmC,QAAO,gCAAgC;AAClF,SAAQC,+BAA+B,QAAO,yBAAyB;AAEvE,MAAMC,cAAcd,QAAQD,QAAQE,cAAc,YAAYc,GAAG,IAAI;AACrE,MAAMC,2BAA2BhB,QAAQc,aAAa;AAEtD,MAAMG,aAAab;AAGnB,SACEc,uBAAuB,EACvBC,wBAAwB,EACxBC,yBAAyB,EACzBC,oBAAoB,QACf,iBAAiB;AAExB,SACEC,aAAa,EACbjB,EAAE,EACFkB,cAAc,EACdC,kBAAkB,EAClBC,YAAY,EACZnB,cAAc,EACdC,cAAc,EACdmB,0BAA0B,QACrB,eAAe;AACtB,SAAQhB,mBAAmB,EAAEiB,oBAAoB,QAAO,yBAAyB;AAMjF,OAAO,SAASC,qBAAqB,EAACC,aAAa,EAA8B;IAC/E,OAAO;QACLC,MAAM;QACNC,UAAU;YAAC1B;YAAIC;QAAc;QAC7B0B,QAAQtB,oBAAoBmB;QAC5BI,WAAW;YAACxB;SAAkB;QAC9ByB,SAAS1B;QACT2B,YAAY;YAAC;gBAACL,MAAM;gBAAYM,OAAO7B;gBAAgBF;gBAAIgC,cAAclC;YAAoB;SAAE;QAC/FmC,aAAa;YAACrB,WAAWf,kCAAkCS;SAAsB;QACjF4B,SAAS;YACP;gBACEC,WAAW3B;gBACX4B,eAAezB;gBACf0B,YAAY9B;gBACZ+B,WAAW;oBACT;wBACEb,MAAM;wBACNc,IAAI;wBACJC,cAAc;oBAChB;iBACD;YACH;SACD;IACH;AACF"}
@@ -0,0 +1,3 @@
1
+ export { recordProjectCreated, recordSourceCommitPushed } from './instance.js';
2
+ export { registerProjectsServiceMetrics } from './service.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAE,wBAAwB,EAAC,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAC,8BAA8B,EAAC,MAAM,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { recordProjectCreated, recordSourceCommitPushed } from './instance.js';
2
+ export { registerProjectsServiceMetrics } from './service.js';
3
+
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["export {recordProjectCreated, recordSourceCommitPushed} from './instance.js';\nexport {registerProjectsServiceMetrics} from './service.js';\n"],"names":["recordProjectCreated","recordSourceCommitPushed","registerProjectsServiceMetrics"],"mappings":"AAAA,SAAQA,oBAAoB,EAAEC,wBAAwB,QAAO,gBAAgB;AAC7E,SAAQC,8BAA8B,QAAO,eAAe"}
@@ -0,0 +1,4 @@
1
+ export type SourceCommitPushedOutcome = 'duplicate' | 'non_default_branch' | 'observed' | 'unbound_source';
2
+ export declare function recordProjectCreated(): void;
3
+ export declare function recordSourceCommitPushed(outcome: SourceCommitPushedOutcome): void;
4
+ //# sourceMappingURL=instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/metrics/instance.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,yBAAyB,GACjC,WAAW,GACX,oBAAoB,GACpB,UAAU,GACV,gBAAgB,CAAC;AAerB,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAEjF"}
@@ -0,0 +1,25 @@
1
+ import { instanceMetrics } from '@shipfox/node-opentelemetry';
2
+ const meter = instanceMetrics.getMeter('projects');
3
+ const projectsCreatedCount = meter.createCounter('projects_created', {
4
+ description: 'Projects created'
5
+ });
6
+ const sourceCommitPushedCount = meter.createCounter('projects_source_commit_pushed', {
7
+ description: 'Source commit pushed events handled by outcome'
8
+ });
9
+ function recordMetric(record) {
10
+ try {
11
+ record();
12
+ } catch {
13
+ // Metrics must not affect project writes or subscriber acknowledgements.
14
+ }
15
+ }
16
+ export function recordProjectCreated() {
17
+ recordMetric(()=>projectsCreatedCount.add(1));
18
+ }
19
+ export function recordSourceCommitPushed(outcome) {
20
+ recordMetric(()=>sourceCommitPushedCount.add(1, {
21
+ outcome
22
+ }));
23
+ }
24
+
25
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/instance.ts"],"sourcesContent":["import {instanceMetrics} from '@shipfox/node-opentelemetry';\n\nconst meter = instanceMetrics.getMeter('projects');\n\nconst projectsCreatedCount = meter.createCounter<Record<string, never>>('projects_created', {\n description: 'Projects created',\n});\n\nexport type SourceCommitPushedOutcome =\n | 'duplicate'\n | 'non_default_branch'\n | 'observed'\n | 'unbound_source';\n\nconst sourceCommitPushedCount = meter.createCounter<{outcome: SourceCommitPushedOutcome}>(\n 'projects_source_commit_pushed',\n {description: 'Source commit pushed events handled by outcome'},\n);\n\nfunction recordMetric(record: () => void): void {\n try {\n record();\n } catch {\n // Metrics must not affect project writes or subscriber acknowledgements.\n }\n}\n\nexport function recordProjectCreated(): void {\n recordMetric(() => projectsCreatedCount.add(1));\n}\n\nexport function recordSourceCommitPushed(outcome: SourceCommitPushedOutcome): void {\n recordMetric(() => sourceCommitPushedCount.add(1, {outcome}));\n}\n"],"names":["instanceMetrics","meter","getMeter","projectsCreatedCount","createCounter","description","sourceCommitPushedCount","recordMetric","record","recordProjectCreated","add","recordSourceCommitPushed","outcome"],"mappings":"AAAA,SAAQA,eAAe,QAAO,8BAA8B;AAE5D,MAAMC,QAAQD,gBAAgBE,QAAQ,CAAC;AAEvC,MAAMC,uBAAuBF,MAAMG,aAAa,CAAwB,oBAAoB;IAC1FC,aAAa;AACf;AAQA,MAAMC,0BAA0BL,MAAMG,aAAa,CACjD,iCACA;IAACC,aAAa;AAAgD;AAGhE,SAASE,aAAaC,MAAkB;IACtC,IAAI;QACFA;IACF,EAAE,OAAM;IACN,yEAAyE;IAC3E;AACF;AAEA,OAAO,SAASC;IACdF,aAAa,IAAMJ,qBAAqBO,GAAG,CAAC;AAC9C;AAEA,OAAO,SAASC,yBAAyBC,OAAkC;IACzEL,aAAa,IAAMD,wBAAwBI,GAAG,CAAC,GAAG;YAACE;QAAO;AAC5D"}
@@ -0,0 +1,2 @@
1
+ export declare function registerProjectsServiceMetrics(): void;
2
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/metrics/service.ts"],"names":[],"mappings":"AAGA,wBAAgB,8BAA8B,IAAI,IAAI,CAarD"}
@@ -0,0 +1,15 @@
1
+ import { getServiceMetricsProvider } from '@shipfox/node-opentelemetry';
2
+ import { getProjectCount } from '#db/projects.js';
3
+ export function registerProjectsServiceMetrics() {
4
+ const meter = getServiceMetricsProvider().getMeter('projects');
5
+ const projectCount = meter.createObservableGauge('projects_project_count', {
6
+ description: 'Projects currently stored'
7
+ });
8
+ meter.addBatchObservableCallback(async (observer)=>{
9
+ observer.observe(projectCount, await getProjectCount());
10
+ }, [
11
+ projectCount
12
+ ]);
13
+ }
14
+
15
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/metrics/service.ts"],"sourcesContent":["import {getServiceMetricsProvider} from '@shipfox/node-opentelemetry';\nimport {getProjectCount} from '#db/projects.js';\n\nexport function registerProjectsServiceMetrics(): void {\n const meter = getServiceMetricsProvider().getMeter('projects');\n\n const projectCount = meter.createObservableGauge('projects_project_count', {\n description: 'Projects currently stored',\n });\n\n meter.addBatchObservableCallback(\n async (observer) => {\n observer.observe(projectCount, await getProjectCount());\n },\n [projectCount],\n );\n}\n"],"names":["getServiceMetricsProvider","getProjectCount","registerProjectsServiceMetrics","meter","getMeter","projectCount","createObservableGauge","description","addBatchObservableCallback","observer","observe"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,8BAA8B;AACtE,SAAQC,eAAe,QAAO,kBAAkB;AAEhD,OAAO,SAASC;IACd,MAAMC,QAAQH,4BAA4BI,QAAQ,CAAC;IAEnD,MAAMC,eAAeF,MAAMG,qBAAqB,CAAC,0BAA0B;QACzEC,aAAa;IACf;IAEAJ,MAAMK,0BAA0B,CAC9B,OAAOC;QACLA,SAASC,OAAO,CAACL,cAAc,MAAMJ;IACvC,GACA;QAACI;KAAa;AAElB"}
@@ -0,0 +1,12 @@
1
+ import type { FastifyRequest } from 'fastify';
2
+ import type { Project } from '#core/entities/index.js';
3
+ export interface RequireProjectAccessParams {
4
+ request: FastifyRequest;
5
+ projectId: string;
6
+ }
7
+ export interface RequireProjectAccessResult {
8
+ project: Project;
9
+ workspaceId: string;
10
+ }
11
+ export declare function requireProjectAccess(params: RequireProjectAccessParams): Promise<RequireProjectAccessResult>;
12
+ //# sourceMappingURL=require-project-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-project-access.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/require-project-access.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,yBAAyB,CAAC;AAGrD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,0BAA0B,CAAC,CAUrC"}
@@ -0,0 +1,25 @@
1
+ import { getUserContext, requireWorkspaceAccess } from '@shipfox/api-auth-context';
2
+ import { ClientError } from '@shipfox/node-fastify';
3
+ import { getProjectById } from '#db/index.js';
4
+ export async function requireProjectAccess(params) {
5
+ const userContext = getUserContext(params.request);
6
+ if (!userContext) {
7
+ throw new ClientError('Authentication required', 'unauthorized', {
8
+ status: 401
9
+ });
10
+ }
11
+ const project = await getProjectById(params.projectId);
12
+ if (!project) throw new ClientError('Project not found', 'project-not-found', {
13
+ status: 404
14
+ });
15
+ requireWorkspaceAccess({
16
+ request: params.request,
17
+ workspaceId: project.workspaceId
18
+ });
19
+ return {
20
+ project,
21
+ workspaceId: project.workspaceId
22
+ };
23
+ }
24
+
25
+ //# sourceMappingURL=require-project-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/auth/require-project-access.ts"],"sourcesContent":["import {getUserContext, requireWorkspaceAccess} from '@shipfox/api-auth-context';\nimport {ClientError} from '@shipfox/node-fastify';\nimport type {FastifyRequest} from 'fastify';\nimport type {Project} from '#core/entities/index.js';\nimport {getProjectById} from '#db/index.js';\n\nexport interface RequireProjectAccessParams {\n request: FastifyRequest;\n projectId: string;\n}\n\nexport interface RequireProjectAccessResult {\n project: Project;\n workspaceId: string;\n}\n\nexport async function requireProjectAccess(\n params: RequireProjectAccessParams,\n): Promise<RequireProjectAccessResult> {\n const userContext = getUserContext(params.request);\n if (!userContext) {\n throw new ClientError('Authentication required', 'unauthorized', {status: 401});\n }\n\n const project = await getProjectById(params.projectId);\n if (!project) throw new ClientError('Project not found', 'project-not-found', {status: 404});\n requireWorkspaceAccess({request: params.request, workspaceId: project.workspaceId});\n return {project, workspaceId: project.workspaceId};\n}\n"],"names":["getUserContext","requireWorkspaceAccess","ClientError","getProjectById","requireProjectAccess","params","userContext","request","status","project","projectId","workspaceId"],"mappings":"AAAA,SAAQA,cAAc,EAAEC,sBAAsB,QAAO,4BAA4B;AACjF,SAAQC,WAAW,QAAO,wBAAwB;AAGlD,SAAQC,cAAc,QAAO,eAAe;AAY5C,OAAO,eAAeC,qBACpBC,MAAkC;IAElC,MAAMC,cAAcN,eAAeK,OAAOE,OAAO;IACjD,IAAI,CAACD,aAAa;QAChB,MAAM,IAAIJ,YAAY,2BAA2B,gBAAgB;YAACM,QAAQ;QAAG;IAC/E;IAEA,MAAMC,UAAU,MAAMN,eAAeE,OAAOK,SAAS;IACrD,IAAI,CAACD,SAAS,MAAM,IAAIP,YAAY,qBAAqB,qBAAqB;QAACM,QAAQ;IAAG;IAC1FP,uBAAuB;QAACM,SAASF,OAAOE,OAAO;QAAEI,aAAaF,QAAQE,WAAW;IAAA;IACjF,OAAO;QAACF;QAASE,aAAaF,QAAQE,WAAW;IAAA;AACnD"}
@@ -0,0 +1,2 @@
1
+ export { toProjectDto } from './project.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { toProjectDto } from './project.js';
2
+
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/dto/index.ts"],"sourcesContent":["export {toProjectDto} from './project.js';\n"],"names":["toProjectDto"],"mappings":"AAAA,SAAQA,YAAY,QAAO,eAAe"}
@@ -0,0 +1,13 @@
1
+ import type { Project } from '#core/entities/index.js';
2
+ export declare function toProjectDto(project: Project): {
3
+ id: string;
4
+ workspace_id: string;
5
+ name: string;
6
+ source: {
7
+ connection_id: string;
8
+ external_repository_id: string;
9
+ };
10
+ created_at: string;
11
+ updated_at: string;
12
+ };
13
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,yBAAyB,CAAC;AAErD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;EAY5C"}
@@ -0,0 +1,15 @@
1
+ export function toProjectDto(project) {
2
+ return {
3
+ id: project.id,
4
+ workspace_id: project.workspaceId,
5
+ name: project.name,
6
+ source: {
7
+ connection_id: project.sourceConnectionId,
8
+ external_repository_id: project.sourceExternalRepositoryId
9
+ },
10
+ created_at: project.createdAt.toISOString(),
11
+ updated_at: project.updatedAt.toISOString()
12
+ };
13
+ }
14
+
15
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/dto/project.ts"],"sourcesContent":["import type {Project} from '#core/entities/index.js';\n\nexport function toProjectDto(project: Project) {\n return {\n id: project.id,\n workspace_id: project.workspaceId,\n name: project.name,\n source: {\n connection_id: project.sourceConnectionId,\n external_repository_id: project.sourceExternalRepositoryId,\n },\n created_at: project.createdAt.toISOString(),\n updated_at: project.updatedAt.toISOString(),\n };\n}\n"],"names":["toProjectDto","project","id","workspace_id","workspaceId","name","source","connection_id","sourceConnectionId","external_repository_id","sourceExternalRepositoryId","created_at","createdAt","toISOString","updated_at","updatedAt"],"mappings":"AAEA,OAAO,SAASA,aAAaC,OAAgB;IAC3C,OAAO;QACLC,IAAID,QAAQC,EAAE;QACdC,cAAcF,QAAQG,WAAW;QACjCC,MAAMJ,QAAQI,IAAI;QAClBC,QAAQ;YACNC,eAAeN,QAAQO,kBAAkB;YACzCC,wBAAwBR,QAAQS,0BAA0B;QAC5D;QACAC,YAAYV,QAAQW,SAAS,CAACC,WAAW;QACzCC,YAAYb,QAAQc,SAAS,CAACF,WAAW;IAC3C;AACF"}
@@ -0,0 +1,2 @@
1
+ export declare const createE2eProjectRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-project.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,qBAAqB,iDAmChC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { e2eCreateProjectBodySchema, e2eCreateProjectResponseSchema } from '@shipfox/api-projects-dto';
3
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
+ import { ProjectAlreadyExistsError } from '#core/index.js';
5
+ import { createProject } from '#db/index.js';
6
+ import { toProjectDto } from '#presentation/dto/index.js';
7
+ function syntheticExternalRepositoryId() {
8
+ return `e2e:${randomUUID()}`;
9
+ }
10
+ export const createE2eProjectRoute = defineRoute({
11
+ method: 'POST',
12
+ path: '/',
13
+ description: 'Create a synthetic project for E2E tests.',
14
+ schema: {
15
+ body: e2eCreateProjectBodySchema,
16
+ response: {
17
+ 201: e2eCreateProjectResponseSchema
18
+ }
19
+ },
20
+ errorHandler: (error)=>{
21
+ if (error instanceof ProjectAlreadyExistsError) {
22
+ throw new ClientError(error.message, 'project-already-exists', {
23
+ details: {
24
+ existing_project_id: error.existingProjectId,
25
+ source_connection_id: error.sourceConnectionId,
26
+ source_external_repository_id: error.sourceExternalRepositoryId
27
+ },
28
+ status: 409
29
+ });
30
+ }
31
+ throw error;
32
+ },
33
+ handler: async (request, reply)=>{
34
+ const project = await createProject({
35
+ workspaceId: request.body.workspace_id,
36
+ name: request.body.name,
37
+ sourceConnectionId: request.body.source_connection_id ?? randomUUID(),
38
+ sourceExternalRepositoryId: request.body.source_external_repository_id ?? syntheticExternalRepositoryId()
39
+ });
40
+ reply.code(201);
41
+ return toProjectDto(project);
42
+ }
43
+ });
44
+
45
+ //# sourceMappingURL=create-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/e2eRoutes/create-project.ts"],"sourcesContent":["import {randomUUID} from 'node:crypto';\nimport {\n e2eCreateProjectBodySchema,\n e2eCreateProjectResponseSchema,\n} from '@shipfox/api-projects-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {ProjectAlreadyExistsError} from '#core/index.js';\nimport {createProject} from '#db/index.js';\nimport {toProjectDto} from '#presentation/dto/index.js';\n\nfunction syntheticExternalRepositoryId(): string {\n return `e2e:${randomUUID()}`;\n}\n\nexport const createE2eProjectRoute = defineRoute({\n method: 'POST',\n path: '/',\n description: 'Create a synthetic project for E2E tests.',\n schema: {\n body: e2eCreateProjectBodySchema,\n response: {\n 201: e2eCreateProjectResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof ProjectAlreadyExistsError) {\n throw new ClientError(error.message, 'project-already-exists', {\n details: {\n existing_project_id: error.existingProjectId,\n source_connection_id: error.sourceConnectionId,\n source_external_repository_id: error.sourceExternalRepositoryId,\n },\n status: 409,\n });\n }\n throw error;\n },\n handler: async (request, reply) => {\n const project = await createProject({\n workspaceId: request.body.workspace_id,\n name: request.body.name,\n sourceConnectionId: request.body.source_connection_id ?? randomUUID(),\n sourceExternalRepositoryId:\n request.body.source_external_repository_id ?? syntheticExternalRepositoryId(),\n });\n\n reply.code(201);\n return toProjectDto(project);\n },\n});\n"],"names":["randomUUID","e2eCreateProjectBodySchema","e2eCreateProjectResponseSchema","ClientError","defineRoute","ProjectAlreadyExistsError","createProject","toProjectDto","syntheticExternalRepositoryId","createE2eProjectRoute","method","path","description","schema","body","response","errorHandler","error","message","details","existing_project_id","existingProjectId","source_connection_id","sourceConnectionId","source_external_repository_id","sourceExternalRepositoryId","status","handler","request","reply","project","workspaceId","workspace_id","name","code"],"mappings":"AAAA,SAAQA,UAAU,QAAO,cAAc;AACvC,SACEC,0BAA0B,EAC1BC,8BAA8B,QACzB,4BAA4B;AACnC,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,yBAAyB,QAAO,iBAAiB;AACzD,SAAQC,aAAa,QAAO,eAAe;AAC3C,SAAQC,YAAY,QAAO,6BAA6B;AAExD,SAASC;IACP,OAAO,CAAC,IAAI,EAAER,cAAc;AAC9B;AAEA,OAAO,MAAMS,wBAAwBL,YAAY;IAC/CM,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMb;QACNc,UAAU;YACR,KAAKb;QACP;IACF;IACAc,cAAc,CAACC;QACb,IAAIA,iBAAiBZ,2BAA2B;YAC9C,MAAM,IAAIF,YAAYc,MAAMC,OAAO,EAAE,0BAA0B;gBAC7DC,SAAS;oBACPC,qBAAqBH,MAAMI,iBAAiB;oBAC5CC,sBAAsBL,MAAMM,kBAAkB;oBAC9CC,+BAA+BP,MAAMQ,0BAA0B;gBACjE;gBACAC,QAAQ;YACV;QACF;QACA,MAAMT;IACR;IACAU,SAAS,OAAOC,SAASC;QACvB,MAAMC,UAAU,MAAMxB,cAAc;YAClCyB,aAAaH,QAAQd,IAAI,CAACkB,YAAY;YACtCC,MAAML,QAAQd,IAAI,CAACmB,IAAI;YACvBV,oBAAoBK,QAAQd,IAAI,CAACQ,oBAAoB,IAAItB;YACzDyB,4BACEG,QAAQd,IAAI,CAACU,6BAA6B,IAAIhB;QAClD;QAEAqB,MAAMK,IAAI,CAAC;QACX,OAAO3B,aAAauB;IACtB;AACF,GAAG"}
@@ -0,0 +1,3 @@
1
+ import type { RouteGroup } from '@shipfox/node-fastify';
2
+ export declare const projectsE2eRoutes: RouteGroup;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAGtD,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { createE2eProjectRoute } from './create-project.js';
2
+ export const projectsE2eRoutes = {
3
+ prefix: '/projects',
4
+ routes: [
5
+ createE2eProjectRoute
6
+ ]
7
+ };
8
+
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/e2eRoutes/index.ts"],"sourcesContent":["import type {RouteGroup} from '@shipfox/node-fastify';\nimport {createE2eProjectRoute} from './create-project.js';\n\nexport const projectsE2eRoutes: RouteGroup = {\n prefix: '/projects',\n routes: [createE2eProjectRoute],\n};\n"],"names":["createE2eProjectRoute","projectsE2eRoutes","prefix","routes"],"mappings":"AACA,SAAQA,qBAAqB,QAAO,sBAAsB;AAE1D,OAAO,MAAMC,oBAAgC;IAC3CC,QAAQ;IACRC,QAAQ;QAACH;KAAsB;AACjC,EAAE"}
@@ -0,0 +1,3 @@
1
+ export { requireProjectAccess } from './auth/require-project-access.js';
2
+ export { createProjectRoutes } from './routes/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAC,mBAAmB,EAAC,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { requireProjectAccess } from './auth/require-project-access.js';
2
+ export { createProjectRoutes } from './routes/index.js';
3
+
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/presentation/index.ts"],"sourcesContent":["export {requireProjectAccess} from './auth/require-project-access.js';\nexport {createProjectRoutes} from './routes/index.js';\n"],"names":["requireProjectAccess","createProjectRoutes"],"mappings":"AAAA,SAAQA,oBAAoB,QAAO,mCAAmC;AACtE,SAAQC,mBAAmB,QAAO,oBAAoB"}
@@ -0,0 +1,3 @@
1
+ import { type IntegrationSourceControlService } from '@shipfox/api-integration-core';
2
+ export declare function createProjectRoute(sourceControl: IntegrationSourceControlService): import("@shipfox/node-fastify").RouteDefinition;
3
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/create-project.ts"],"names":[],"mappings":"AACA,OAAO,EAQL,KAAK,+BAA+B,EACrC,MAAM,+BAA+B,CAAC;AA2BvC,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,+BAA+B,mDAgEhF"}