@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.
- package/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +117 -0
- package/LICENSE +21 -0
- package/dist/core/entities/index.d.ts +2 -0
- package/dist/core/entities/index.d.ts.map +1 -0
- package/dist/core/entities/index.js +3 -0
- package/dist/core/entities/index.js.map +1 -0
- package/dist/core/entities/project.d.ts +10 -0
- package/dist/core/entities/project.d.ts.map +1 -0
- package/dist/core/entities/project.js +3 -0
- package/dist/core/entities/project.js.map +1 -0
- package/dist/core/errors.d.ts +13 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +20 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/projects.d.ts +12 -0
- package/dist/core/projects.d.ts.map +1 -0
- package/dist/core/projects.js +62 -0
- package/dist/core/projects.js.map +1 -0
- package/dist/db/db.d.ts +763 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +22 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +10 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/integration-event-dedup.d.ts +17 -0
- package/dist/db/integration-event-dedup.d.ts.map +1 -0
- package/dist/db/integration-event-dedup.js +27 -0
- package/dist/db/integration-event-dedup.js.map +1 -0
- package/dist/db/projects.d.ts +36 -0
- package/dist/db/projects.d.ts.map +1 -0
- package/dist/db/projects.js +84 -0
- package/dist/db/projects.js.map +1 -0
- package/dist/db/schema/common.d.ts +2 -0
- package/dist/db/schema/common.d.ts.map +1 -0
- package/dist/db/schema/common.js +4 -0
- package/dist/db/schema/common.js.map +1 -0
- package/dist/db/schema/integration-event-dedup.d.ts +59 -0
- package/dist/db/schema/integration-event-dedup.d.ts.map +1 -0
- package/dist/db/schema/integration-event-dedup.js +19 -0
- package/dist/db/schema/integration-event-dedup.js.map +1 -0
- package/dist/db/schema/outbox.d.ts +195 -0
- package/dist/db/schema/outbox.d.ts.map +1 -0
- package/dist/db/schema/outbox.js +5 -0
- package/dist/db/schema/outbox.js.map +1 -0
- package/dist/db/schema/projects.d.ts +131 -0
- package/dist/db/schema/projects.d.ts.map +1 -0
- package/dist/db/schema/projects.js +32 -0
- package/dist/db/schema/projects.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +4 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +4 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +25 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/metrics/service.d.ts +2 -0
- package/dist/metrics/service.d.ts.map +1 -0
- package/dist/metrics/service.js +15 -0
- package/dist/metrics/service.js.map +1 -0
- package/dist/presentation/auth/require-project-access.d.ts +12 -0
- package/dist/presentation/auth/require-project-access.d.ts.map +1 -0
- package/dist/presentation/auth/require-project-access.js +25 -0
- package/dist/presentation/auth/require-project-access.js.map +1 -0
- package/dist/presentation/dto/index.d.ts +2 -0
- package/dist/presentation/dto/index.d.ts.map +1 -0
- package/dist/presentation/dto/index.js +3 -0
- package/dist/presentation/dto/index.js.map +1 -0
- package/dist/presentation/dto/project.d.ts +13 -0
- package/dist/presentation/dto/project.d.ts.map +1 -0
- package/dist/presentation/dto/project.js +15 -0
- package/dist/presentation/dto/project.js.map +1 -0
- package/dist/presentation/e2eRoutes/create-project.d.ts +2 -0
- package/dist/presentation/e2eRoutes/create-project.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/create-project.js +45 -0
- package/dist/presentation/e2eRoutes/create-project.js.map +1 -0
- package/dist/presentation/e2eRoutes/index.d.ts +3 -0
- package/dist/presentation/e2eRoutes/index.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/index.js +9 -0
- package/dist/presentation/e2eRoutes/index.js.map +1 -0
- package/dist/presentation/index.d.ts +3 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +4 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/routes/create-project.d.ts +3 -0
- package/dist/presentation/routes/create-project.d.ts.map +1 -0
- package/dist/presentation/routes/create-project.js +94 -0
- package/dist/presentation/routes/create-project.js.map +1 -0
- package/dist/presentation/routes/cursor.d.ts +2 -0
- package/dist/presentation/routes/cursor.d.ts.map +1 -0
- package/dist/presentation/routes/cursor.js +3 -0
- package/dist/presentation/routes/cursor.js.map +1 -0
- package/dist/presentation/routes/get-project.d.ts +2 -0
- package/dist/presentation/routes/get-project.d.ts.map +1 -0
- package/dist/presentation/routes/get-project.js +30 -0
- package/dist/presentation/routes/get-project.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +4 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +17 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/list-projects.d.ts +2 -0
- package/dist/presentation/routes/list-projects.d.ts.map +1 -0
- package/dist/presentation/routes/list-projects.js +43 -0
- package/dist/presentation/routes/list-projects.js.map +1 -0
- package/dist/presentation/subscribers/index.d.ts +2 -0
- package/dist/presentation/subscribers/index.d.ts.map +1 -0
- package/dist/presentation/subscribers/index.js +3 -0
- package/dist/presentation/subscribers/index.js.map +1 -0
- package/dist/presentation/subscribers/on-source-commit-pushed.d.ts +4 -0
- package/dist/presentation/subscribers/on-source-commit-pushed.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-source-commit-pushed.js +54 -0
- package/dist/presentation/subscribers/on-source-commit-pushed.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +5 -0
- package/dist/temporal/activities/index.d.ts.map +1 -0
- package/dist/temporal/activities/index.js +8 -0
- package/dist/temporal/activities/index.js.map +1 -0
- package/dist/temporal/activities/prune-integration-event-dedup.d.ts +4 -0
- package/dist/temporal/activities/prune-integration-event-dedup.d.ts.map +1 -0
- package/dist/temporal/activities/prune-integration-event-dedup.js +11 -0
- package/dist/temporal/activities/prune-integration-event-dedup.js.map +1 -0
- package/dist/temporal/constants.d.ts +3 -0
- package/dist/temporal/constants.d.ts.map +1 -0
- package/dist/temporal/constants.js +4 -0
- package/dist/temporal/constants.js.map +1 -0
- package/dist/temporal/workflows/index.d.ts +2 -0
- package/dist/temporal/workflows/index.d.ts.map +1 -0
- package/dist/temporal/workflows/index.js +3 -0
- package/dist/temporal/workflows/index.js.map +1 -0
- package/dist/temporal/workflows/prune-integration-event-dedup-cron.d.ts +2 -0
- package/dist/temporal/workflows/prune-integration-event-dedup-cron.d.ts.map +1 -0
- package/dist/temporal/workflows/prune-integration-event-dedup-cron.js +14 -0
- package/dist/temporal/workflows/prune-integration-event-dedup-cron.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_initial.sql +37 -0
- package/drizzle/meta/0000_snapshot.json +307 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +7 -0
- package/package.json +76 -0
- package/src/core/entities/index.ts +1 -0
- package/src/core/entities/project.ts +9 -0
- package/src/core/errors.ts +26 -0
- package/src/core/index.ts +8 -0
- package/src/core/projects.test.ts +142 -0
- package/src/core/projects.ts +97 -0
- package/src/db/db.ts +22 -0
- package/src/db/index.ts +26 -0
- package/src/db/integration-event-dedup.ts +45 -0
- package/src/db/projects.test.ts +22 -0
- package/src/db/projects.ts +158 -0
- package/src/db/schema/common.ts +3 -0
- package/src/db/schema/integration-event-dedup.ts +15 -0
- package/src/db/schema/outbox.ts +4 -0
- package/src/db/schema/projects.ts +39 -0
- package/src/index.ts +71 -0
- package/src/metrics/index.ts +2 -0
- package/src/metrics/instance.ts +34 -0
- package/src/metrics/service.ts +17 -0
- package/src/presentation/auth/require-project-access.ts +29 -0
- package/src/presentation/dto/index.ts +1 -0
- package/src/presentation/dto/project.ts +15 -0
- package/src/presentation/e2eRoutes/create-project.test.ts +119 -0
- package/src/presentation/e2eRoutes/create-project.ts +50 -0
- package/src/presentation/e2eRoutes/index.ts +7 -0
- package/src/presentation/index.ts +2 -0
- package/src/presentation/routes/create-project.ts +102 -0
- package/src/presentation/routes/cursor.ts +5 -0
- package/src/presentation/routes/get-project.ts +24 -0
- package/src/presentation/routes/index.ts +14 -0
- package/src/presentation/routes/list-projects.ts +34 -0
- package/src/presentation/routes/projects.test.ts +266 -0
- package/src/presentation/subscribers/index.ts +1 -0
- package/src/presentation/subscribers/on-source-commit-pushed.test.ts +149 -0
- package/src/presentation/subscribers/on-source-commit-pushed.ts +64 -0
- package/src/temporal/activities/index.ts +7 -0
- package/src/temporal/activities/prune-integration-event-dedup.test.ts +50 -0
- package/src/temporal/activities/prune-integration-event-dedup.ts +9 -0
- package/src/temporal/constants.ts +3 -0
- package/src/temporal/workflows/index.ts +1 -0
- package/src/temporal/workflows/prune-integration-event-dedup-cron.ts +15 -0
- package/test/env.ts +14 -0
- package/test/factories/project.ts +24 -0
- package/test/globalSetup.ts +17 -0
- package/test/index.ts +1 -0
- package/test/setup.ts +17 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +3 -0
- package/tsconfig.test.json +8 -0
- 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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|