@shipfox/api-workspaces 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 +97 -0
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/core/entities/index.d.ts +4 -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/invitation.d.ts +14 -0
- package/dist/core/entities/invitation.d.ts.map +1 -0
- package/dist/core/entities/invitation.js +3 -0
- package/dist/core/entities/invitation.js.map +1 -0
- package/dist/core/entities/membership.d.ts +10 -0
- package/dist/core/entities/membership.d.ts.map +1 -0
- package/dist/core/entities/membership.js +3 -0
- package/dist/core/entities/membership.js.map +1 -0
- package/dist/core/entities/workspace.d.ts +10 -0
- package/dist/core/entities/workspace.d.ts.map +1 -0
- package/dist/core/entities/workspace.js +3 -0
- package/dist/core/entities/workspace.js.map +1 -0
- package/dist/core/errors.d.ts +52 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +104 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/invitations.d.ts +51 -0
- package/dist/core/invitations.d.ts.map +1 -0
- package/dist/core/invitations.js +136 -0
- package/dist/core/invitations.js.map +1 -0
- package/dist/core/memberships.d.ts +9 -0
- package/dist/core/memberships.d.ts.map +1 -0
- package/dist/core/memberships.js +13 -0
- package/dist/core/memberships.js.map +1 -0
- package/dist/core/workspaces.d.ts +40 -0
- package/dist/core/workspaces.d.ts.map +1 -0
- package/dist/core/workspaces.js +85 -0
- package/dist/core/workspaces.js.map +1 -0
- package/dist/db/db.d.ts +1253 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +24 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/index.d.ts +10 -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/invitations.d.ts +47 -0
- package/dist/db/invitations.d.ts.map +1 -0
- package/dist/db/invitations.js +107 -0
- package/dist/db/invitations.js.map +1 -0
- package/dist/db/memberships.d.ts +44 -0
- package/dist/db/memberships.d.ts.map +1 -0
- package/dist/db/memberships.js +75 -0
- package/dist/db/memberships.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/invitations.d.ts +199 -0
- package/dist/db/schema/invitations.d.ts.map +1 -0
- package/dist/db/schema/invitations.js +47 -0
- package/dist/db/schema/invitations.js.map +1 -0
- package/dist/db/schema/memberships.d.ts +131 -0
- package/dist/db/schema/memberships.d.ts.map +1 -0
- package/dist/db/schema/memberships.js +35 -0
- package/dist/db/schema/memberships.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/workspaces.d.ts +115 -0
- package/dist/db/schema/workspaces.d.ts.map +1 -0
- package/dist/db/schema/workspaces.js +32 -0
- package/dist/db/schema/workspaces.js.map +1 -0
- package/dist/db/workspaces.d.ts +20 -0
- package/dist/db/workspaces.d.ts.map +1 -0
- package/dist/db/workspaces.js +53 -0
- package/dist/db/workspaces.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +8 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +41 -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 +26 -0
- package/dist/metrics/service.js.map +1 -0
- package/dist/presentation/dto/index.d.ts +4 -0
- package/dist/presentation/dto/index.d.ts.map +1 -0
- package/dist/presentation/dto/index.js +5 -0
- package/dist/presentation/dto/index.js.map +1 -0
- package/dist/presentation/dto/invitation.d.ts +4 -0
- package/dist/presentation/dto/invitation.d.ts.map +1 -0
- package/dist/presentation/dto/invitation.js +15 -0
- package/dist/presentation/dto/invitation.js.map +1 -0
- package/dist/presentation/dto/membership.d.ts +5 -0
- package/dist/presentation/dto/membership.d.ts.map +1 -0
- package/dist/presentation/dto/membership.js +23 -0
- package/dist/presentation/dto/membership.js.map +1 -0
- package/dist/presentation/dto/workspace.d.ts +4 -0
- package/dist/presentation/dto/workspace.d.ts.map +1 -0
- package/dist/presentation/dto/workspace.js +12 -0
- package/dist/presentation/dto/workspace.js.map +1 -0
- package/dist/presentation/e2eRoutes/create-invitation.d.ts +2 -0
- package/dist/presentation/e2eRoutes/create-invitation.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/create-invitation.js +39 -0
- package/dist/presentation/e2eRoutes/create-invitation.js.map +1 -0
- package/dist/presentation/e2eRoutes/create-workspace.d.ts +2 -0
- package/dist/presentation/e2eRoutes/create-workspace.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/create-workspace.js +27 -0
- package/dist/presentation/e2eRoutes/create-workspace.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 +11 -0
- package/dist/presentation/e2eRoutes/index.js.map +1 -0
- package/dist/presentation/index.d.ts +2 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +3 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +3 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +23 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/invitations/accept.d.ts +2 -0
- package/dist/presentation/routes/invitations/accept.d.ts.map +1 -0
- package/dist/presentation/routes/invitations/accept.js +67 -0
- package/dist/presentation/routes/invitations/accept.js.map +1 -0
- package/dist/presentation/routes/invitations/create.d.ts +2 -0
- package/dist/presentation/routes/invitations/create.d.ts.map +1 -0
- package/dist/presentation/routes/invitations/create.js +66 -0
- package/dist/presentation/routes/invitations/create.js.map +1 -0
- package/dist/presentation/routes/invitations/index.d.ts +4 -0
- package/dist/presentation/routes/invitations/index.d.ts.map +1 -0
- package/dist/presentation/routes/invitations/index.js +19 -0
- package/dist/presentation/routes/invitations/index.js.map +1 -0
- package/dist/presentation/routes/invitations/list.d.ts +2 -0
- package/dist/presentation/routes/invitations/list.d.ts.map +1 -0
- package/dist/presentation/routes/invitations/list.js +58 -0
- package/dist/presentation/routes/invitations/list.js.map +1 -0
- package/dist/presentation/routes/invitations/preview.d.ts +2 -0
- package/dist/presentation/routes/invitations/preview.d.ts.map +1 -0
- package/dist/presentation/routes/invitations/preview.js +47 -0
- package/dist/presentation/routes/invitations/preview.js.map +1 -0
- package/dist/presentation/routes/invitations/revoke.d.ts +2 -0
- package/dist/presentation/routes/invitations/revoke.d.ts.map +1 -0
- package/dist/presentation/routes/invitations/revoke.js +66 -0
- package/dist/presentation/routes/invitations/revoke.js.map +1 -0
- package/dist/presentation/routes/members/index.d.ts +3 -0
- package/dist/presentation/routes/members/index.d.ts.map +1 -0
- package/dist/presentation/routes/members/index.js +8 -0
- package/dist/presentation/routes/members/index.js.map +1 -0
- package/dist/presentation/routes/members/list.d.ts +2 -0
- package/dist/presentation/routes/members/list.d.ts.map +1 -0
- package/dist/presentation/routes/members/list.js +58 -0
- package/dist/presentation/routes/members/list.js.map +1 -0
- package/dist/presentation/routes/members/remove.d.ts +2 -0
- package/dist/presentation/routes/members/remove.d.ts.map +1 -0
- package/dist/presentation/routes/members/remove.js +71 -0
- package/dist/presentation/routes/members/remove.js.map +1 -0
- package/dist/presentation/routes/workspaces/create.d.ts +2 -0
- package/dist/presentation/routes/workspaces/create.d.ts.map +1 -0
- package/dist/presentation/routes/workspaces/create.js +36 -0
- package/dist/presentation/routes/workspaces/create.js.map +1 -0
- package/dist/presentation/routes/workspaces/index.d.ts +3 -0
- package/dist/presentation/routes/workspaces/index.d.ts.map +1 -0
- package/dist/presentation/routes/workspaces/index.js +4 -0
- package/dist/presentation/routes/workspaces/index.js.map +1 -0
- package/dist/presentation/routes/workspaces/list.d.ts +2 -0
- package/dist/presentation/routes/workspaces/list.d.ts.map +1 -0
- package/dist/presentation/routes/workspaces/list.js +32 -0
- package/dist/presentation/routes/workspaces/list.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-invitation-send-requested.d.ts +3 -0
- package/dist/presentation/subscribers/on-invitation-send-requested.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-invitation-send-requested.js +16 -0
- package/dist/presentation/subscribers/on-invitation-send-requested.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_initial.sql +9 -0
- package/drizzle/0001_memberships_invitations.sql +30 -0
- package/drizzle/0002_membership_user_snapshots.sql +40 -0
- package/drizzle/0003_outgoing_enchantress.sql +16 -0
- package/drizzle/meta/0000_snapshot.json +80 -0
- package/drizzle/meta/0001_snapshot.json +705 -0
- package/drizzle/meta/0003_snapshot.json +442 -0
- package/drizzle/meta/_journal.json +34 -0
- package/drizzle.config.ts +7 -0
- package/package.json +71 -0
- package/src/config.ts +51 -0
- package/src/core/entities/index.ts +3 -0
- package/src/core/entities/invitation.ts +13 -0
- package/src/core/entities/membership.ts +9 -0
- package/src/core/entities/workspace.ts +10 -0
- package/src/core/errors.ts +118 -0
- package/src/core/index.ts +35 -0
- package/src/core/invitations.test.ts +251 -0
- package/src/core/invitations.ts +191 -0
- package/src/core/memberships.test.ts +77 -0
- package/src/core/memberships.ts +17 -0
- package/src/core/workspaces.test.ts +72 -0
- package/src/core/workspaces.ts +126 -0
- package/src/db/db.ts +24 -0
- package/src/db/index.ts +43 -0
- package/src/db/invitations.test.ts +204 -0
- package/src/db/invitations.ts +235 -0
- package/src/db/memberships.test.ts +107 -0
- package/src/db/memberships.ts +139 -0
- package/src/db/schema/common.ts +5 -0
- package/src/db/schema/invitations.ts +47 -0
- package/src/db/schema/memberships.ts +39 -0
- package/src/db/schema/outbox.ts +4 -0
- package/src/db/schema/workspaces.ts +33 -0
- package/src/db/workspaces.test.ts +114 -0
- package/src/db/workspaces.ts +81 -0
- package/src/index.test.ts +25 -0
- package/src/index.ts +43 -0
- package/src/metrics/index.ts +1 -0
- package/src/metrics/instance.test.ts +74 -0
- package/src/metrics/instance.ts +57 -0
- package/src/metrics/service.ts +26 -0
- package/src/presentation/dto/index.ts +3 -0
- package/src/presentation/dto/invitation.ts +16 -0
- package/src/presentation/dto/membership.ts +27 -0
- package/src/presentation/dto/workspace.ts +13 -0
- package/src/presentation/e2eRoutes/create-invitation.ts +44 -0
- package/src/presentation/e2eRoutes/create-workspace.ts +30 -0
- package/src/presentation/e2eRoutes/index.ts +8 -0
- package/src/presentation/index.ts +1 -0
- package/src/presentation/routes/index.ts +23 -0
- package/src/presentation/routes/invitations/accept.test.ts +154 -0
- package/src/presentation/routes/invitations/accept.ts +70 -0
- package/src/presentation/routes/invitations/create.test.ts +99 -0
- package/src/presentation/routes/invitations/create.ts +60 -0
- package/src/presentation/routes/invitations/index.ts +17 -0
- package/src/presentation/routes/invitations/list.test.ts +94 -0
- package/src/presentation/routes/invitations/list.ts +53 -0
- package/src/presentation/routes/invitations/preview.test.ts +140 -0
- package/src/presentation/routes/invitations/preview.ts +46 -0
- package/src/presentation/routes/invitations/revoke.test.ts +99 -0
- package/src/presentation/routes/invitations/revoke.ts +64 -0
- package/src/presentation/routes/members/index.ts +5 -0
- package/src/presentation/routes/members/list.test.ts +95 -0
- package/src/presentation/routes/members/list.ts +53 -0
- package/src/presentation/routes/members/remove.test.ts +110 -0
- package/src/presentation/routes/members/remove.ts +66 -0
- package/src/presentation/routes/workspaces/create.test.ts +87 -0
- package/src/presentation/routes/workspaces/create.ts +36 -0
- package/src/presentation/routes/workspaces/index.ts +2 -0
- package/src/presentation/routes/workspaces/list.test.ts +56 -0
- package/src/presentation/routes/workspaces/list.ts +29 -0
- package/src/presentation/subscribers/index.ts +1 -0
- package/src/presentation/subscribers/invitation-send-requested.test.ts +64 -0
- package/src/presentation/subscribers/on-invitation-send-requested.ts +15 -0
- package/test/env.ts +8 -0
- package/test/factories/index.ts +3 -0
- package/test/factories/membership.ts +24 -0
- package/test/factories/user.ts +15 -0
- package/test/factories/workspace.ts +18 -0
- package/test/globalSetup.ts +15 -0
- package/test/index.ts +3 -0
- package/test/routes.ts +255 -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 +11 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { and, count, eq, gt, isNull, sql } from 'drizzle-orm';
|
|
2
|
+
import { recordWorkspaceCreated } from '#metrics/instance.js';
|
|
3
|
+
import { db } from './db.js';
|
|
4
|
+
import { invitations } from './schema/invitations.js';
|
|
5
|
+
import { memberships } from './schema/memberships.js';
|
|
6
|
+
import { toWorkspace, workspaces } from './schema/workspaces.js';
|
|
7
|
+
export async function createWorkspace(params) {
|
|
8
|
+
const rows = await db().insert(workspaces).values({
|
|
9
|
+
name: params.name
|
|
10
|
+
}).returning();
|
|
11
|
+
const row = rows[0];
|
|
12
|
+
if (!row) throw new Error('Insert returned no rows');
|
|
13
|
+
recordWorkspaceCreated();
|
|
14
|
+
return toWorkspace(row);
|
|
15
|
+
}
|
|
16
|
+
export async function updateWorkspace(params) {
|
|
17
|
+
const set = {
|
|
18
|
+
updatedAt: sql`NOW()`
|
|
19
|
+
};
|
|
20
|
+
if (params.name !== undefined) set.name = params.name;
|
|
21
|
+
if (params.status !== undefined) set.status = params.status;
|
|
22
|
+
if (params.settings !== undefined) set.settings = params.settings;
|
|
23
|
+
const rows = await db().update(workspaces).set(set).where(eq(workspaces.id, params.id)).returning();
|
|
24
|
+
const row = rows[0];
|
|
25
|
+
if (!row) return undefined;
|
|
26
|
+
return toWorkspace(row);
|
|
27
|
+
}
|
|
28
|
+
export async function getWorkspaceById(id) {
|
|
29
|
+
const rows = await db().select().from(workspaces).where(eq(workspaces.id, id)).limit(1);
|
|
30
|
+
const row = rows[0];
|
|
31
|
+
if (!row) return undefined;
|
|
32
|
+
return toWorkspace(row);
|
|
33
|
+
}
|
|
34
|
+
export async function getWorkspaceServiceMetrics() {
|
|
35
|
+
const [workspaceRows, membershipRows, invitationRows] = await Promise.all([
|
|
36
|
+
db().select({
|
|
37
|
+
value: count()
|
|
38
|
+
}).from(workspaces).where(eq(workspaces.status, 'active')),
|
|
39
|
+
db().select({
|
|
40
|
+
value: count()
|
|
41
|
+
}).from(memberships),
|
|
42
|
+
db().select({
|
|
43
|
+
value: count()
|
|
44
|
+
}).from(invitations).where(and(isNull(invitations.acceptedAt), gt(invitations.expiresAt, sql`now()`)))
|
|
45
|
+
]);
|
|
46
|
+
return {
|
|
47
|
+
activeWorkspaces: workspaceRows[0]?.value ?? 0,
|
|
48
|
+
memberships: membershipRows[0]?.value ?? 0,
|
|
49
|
+
openInvitations: invitationRows[0]?.value ?? 0
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/workspaces.ts"],"sourcesContent":["import {and, count, eq, gt, isNull, sql} from 'drizzle-orm';\nimport type {Workspace, WorkspaceStatus} from '#core/entities/workspace.js';\nimport {recordWorkspaceCreated} from '#metrics/instance.js';\nimport {db} from './db.js';\nimport {invitations} from './schema/invitations.js';\nimport {memberships} from './schema/memberships.js';\nimport {toWorkspace, workspaces} from './schema/workspaces.js';\n\nexport interface CreateWorkspaceParams {\n name: string;\n}\n\nexport async function createWorkspace(params: CreateWorkspaceParams): Promise<Workspace> {\n const rows = await db()\n .insert(workspaces)\n .values({\n name: params.name,\n })\n .returning();\n\n const row = rows[0];\n if (!row) throw new Error('Insert returned no rows');\n recordWorkspaceCreated();\n return toWorkspace(row);\n}\n\nexport interface UpdateWorkspaceParams {\n id: string;\n name?: string | undefined;\n status?: WorkspaceStatus | undefined;\n settings?: Record<string, unknown> | undefined;\n}\n\nexport async function updateWorkspace(\n params: UpdateWorkspaceParams,\n): Promise<Workspace | undefined> {\n const set: Record<string, unknown> = {updatedAt: sql`NOW()`};\n if (params.name !== undefined) set.name = params.name;\n if (params.status !== undefined) set.status = params.status;\n if (params.settings !== undefined) set.settings = params.settings;\n\n const rows = await db()\n .update(workspaces)\n .set(set)\n .where(eq(workspaces.id, params.id))\n .returning();\n\n const row = rows[0];\n if (!row) return undefined;\n return toWorkspace(row);\n}\n\nexport async function getWorkspaceById(id: string): Promise<Workspace | undefined> {\n const rows = await db().select().from(workspaces).where(eq(workspaces.id, id)).limit(1);\n const row = rows[0];\n if (!row) return undefined;\n return toWorkspace(row);\n}\n\nexport interface WorkspaceServiceMetrics {\n activeWorkspaces: number;\n memberships: number;\n openInvitations: number;\n}\n\nexport async function getWorkspaceServiceMetrics(): Promise<WorkspaceServiceMetrics> {\n const [workspaceRows, membershipRows, invitationRows] = await Promise.all([\n db().select({value: count()}).from(workspaces).where(eq(workspaces.status, 'active')),\n db().select({value: count()}).from(memberships),\n db()\n .select({value: count()})\n .from(invitations)\n .where(and(isNull(invitations.acceptedAt), gt(invitations.expiresAt, sql`now()`))),\n ]);\n\n return {\n activeWorkspaces: workspaceRows[0]?.value ?? 0,\n memberships: membershipRows[0]?.value ?? 0,\n openInvitations: invitationRows[0]?.value ?? 0,\n };\n}\n"],"names":["and","count","eq","gt","isNull","sql","recordWorkspaceCreated","db","invitations","memberships","toWorkspace","workspaces","createWorkspace","params","rows","insert","values","name","returning","row","Error","updateWorkspace","set","updatedAt","undefined","status","settings","update","where","id","getWorkspaceById","select","from","limit","getWorkspaceServiceMetrics","workspaceRows","membershipRows","invitationRows","Promise","all","value","acceptedAt","expiresAt","activeWorkspaces","openInvitations"],"mappings":"AAAA,SAAQA,GAAG,EAAEC,KAAK,EAAEC,EAAE,EAAEC,EAAE,EAAEC,MAAM,EAAEC,GAAG,QAAO,cAAc;AAE5D,SAAQC,sBAAsB,QAAO,uBAAuB;AAC5D,SAAQC,EAAE,QAAO,UAAU;AAC3B,SAAQC,WAAW,QAAO,0BAA0B;AACpD,SAAQC,WAAW,QAAO,0BAA0B;AACpD,SAAQC,WAAW,EAAEC,UAAU,QAAO,yBAAyB;AAM/D,OAAO,eAAeC,gBAAgBC,MAA6B;IACjE,MAAMC,OAAO,MAAMP,KAChBQ,MAAM,CAACJ,YACPK,MAAM,CAAC;QACNC,MAAMJ,OAAOI,IAAI;IACnB,GACCC,SAAS;IAEZ,MAAMC,MAAML,IAAI,CAAC,EAAE;IACnB,IAAI,CAACK,KAAK,MAAM,IAAIC,MAAM;IAC1Bd;IACA,OAAOI,YAAYS;AACrB;AASA,OAAO,eAAeE,gBACpBR,MAA6B;IAE7B,MAAMS,MAA+B;QAACC,WAAWlB,GAAG,CAAC,KAAK,CAAC;IAAA;IAC3D,IAAIQ,OAAOI,IAAI,KAAKO,WAAWF,IAAIL,IAAI,GAAGJ,OAAOI,IAAI;IACrD,IAAIJ,OAAOY,MAAM,KAAKD,WAAWF,IAAIG,MAAM,GAAGZ,OAAOY,MAAM;IAC3D,IAAIZ,OAAOa,QAAQ,KAAKF,WAAWF,IAAII,QAAQ,GAAGb,OAAOa,QAAQ;IAEjE,MAAMZ,OAAO,MAAMP,KAChBoB,MAAM,CAAChB,YACPW,GAAG,CAACA,KACJM,KAAK,CAAC1B,GAAGS,WAAWkB,EAAE,EAAEhB,OAAOgB,EAAE,GACjCX,SAAS;IAEZ,MAAMC,MAAML,IAAI,CAAC,EAAE;IACnB,IAAI,CAACK,KAAK,OAAOK;IACjB,OAAOd,YAAYS;AACrB;AAEA,OAAO,eAAeW,iBAAiBD,EAAU;IAC/C,MAAMf,OAAO,MAAMP,KAAKwB,MAAM,GAAGC,IAAI,CAACrB,YAAYiB,KAAK,CAAC1B,GAAGS,WAAWkB,EAAE,EAAEA,KAAKI,KAAK,CAAC;IACrF,MAAMd,MAAML,IAAI,CAAC,EAAE;IACnB,IAAI,CAACK,KAAK,OAAOK;IACjB,OAAOd,YAAYS;AACrB;AAQA,OAAO,eAAee;IACpB,MAAM,CAACC,eAAeC,gBAAgBC,eAAe,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACxEhC,KAAKwB,MAAM,CAAC;YAACS,OAAOvC;QAAO,GAAG+B,IAAI,CAACrB,YAAYiB,KAAK,CAAC1B,GAAGS,WAAWc,MAAM,EAAE;QAC3ElB,KAAKwB,MAAM,CAAC;YAACS,OAAOvC;QAAO,GAAG+B,IAAI,CAACvB;QACnCF,KACGwB,MAAM,CAAC;YAACS,OAAOvC;QAAO,GACtB+B,IAAI,CAACxB,aACLoB,KAAK,CAAC5B,IAAII,OAAOI,YAAYiC,UAAU,GAAGtC,GAAGK,YAAYkC,SAAS,EAAErC,GAAG,CAAC,KAAK,CAAC;KAClF;IAED,OAAO;QACLsC,kBAAkBR,aAAa,CAAC,EAAE,EAAEK,SAAS;QAC7C/B,aAAa2B,cAAc,CAAC,EAAE,EAAEI,SAAS;QACzCI,iBAAiBP,cAAc,CAAC,EAAE,EAAEG,SAAS;IAC/C;AACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ShipfoxModule } from '@shipfox/node-module';
|
|
2
|
+
export type { Invitation } from '#core/entities/invitation.js';
|
|
3
|
+
export type { Membership } from '#core/entities/membership.js';
|
|
4
|
+
export type { Workspace, WorkspaceStatus } from '#core/entities/workspace.js';
|
|
5
|
+
export { InvitationEmailMismatchError, TokenAlreadyUsedError, TokenExpiredError, TokenInvalidError, WorkspaceNotFoundError, } from '#core/errors.js';
|
|
6
|
+
export { acceptWorkspaceInvitation, peekInvitationByRawToken } from '#core/invitations.js';
|
|
7
|
+
export { type EnsureMembershipParams, ensureMembership } from '#core/memberships.js';
|
|
8
|
+
export { getWorkspace, requireWorkspaceMembership } from '#core/workspaces.js';
|
|
9
|
+
export { db, migrationsPath } from '#db/index.js';
|
|
10
|
+
export { listMembershipsByUser } from '#db/memberships.js';
|
|
11
|
+
export { workspacesRoutes as routes } from '#presentation/routes/index.js';
|
|
12
|
+
export declare const workspacesModule: ShipfoxModule;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAQxD,YAAY,EAAC,UAAU,EAAC,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAC,UAAU,EAAC,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAC,SAAS,EAAE,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAC,yBAAyB,EAAE,wBAAwB,EAAC,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAC,KAAK,sBAAsB,EAAE,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAC,YAAY,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAC,EAAE,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAC,gBAAgB,IAAI,MAAM,EAAC,MAAM,+BAA+B,CAAC;AAIzE,eAAO,MAAM,gBAAgB,EAAE,aAU9B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { WORKSPACES_INVITATION_SEND_REQUESTED, workspacesEventSchemas } from '@shipfox/api-workspaces-dto';
|
|
2
|
+
import { subscriberFactory } from '@shipfox/node-module';
|
|
3
|
+
import { db, migrationsPath, workspacesOutbox } from '#db/index.js';
|
|
4
|
+
import { registerWorkspacesServiceMetrics } from '#metrics/index.js';
|
|
5
|
+
import { workspacesE2eRoutes } from '#presentation/e2eRoutes/index.js';
|
|
6
|
+
import { workspacesRoutes } from '#presentation/routes/index.js';
|
|
7
|
+
import { onInvitationSendRequested } from '#presentation/subscribers/index.js';
|
|
8
|
+
export { InvitationEmailMismatchError, TokenAlreadyUsedError, TokenExpiredError, TokenInvalidError, WorkspaceNotFoundError } from '#core/errors.js';
|
|
9
|
+
export { acceptWorkspaceInvitation, peekInvitationByRawToken } from '#core/invitations.js';
|
|
10
|
+
export { ensureMembership } from '#core/memberships.js';
|
|
11
|
+
export { getWorkspace, requireWorkspaceMembership } from '#core/workspaces.js';
|
|
12
|
+
export { db, migrationsPath } from '#db/index.js';
|
|
13
|
+
export { listMembershipsByUser } from '#db/memberships.js';
|
|
14
|
+
export { workspacesRoutes as routes } from '#presentation/routes/index.js';
|
|
15
|
+
const subscriber = subscriberFactory();
|
|
16
|
+
export const workspacesModule = {
|
|
17
|
+
name: 'workspaces',
|
|
18
|
+
database: {
|
|
19
|
+
db,
|
|
20
|
+
migrationsPath
|
|
21
|
+
},
|
|
22
|
+
routes: workspacesRoutes,
|
|
23
|
+
e2eRoutes: [
|
|
24
|
+
workspacesE2eRoutes
|
|
25
|
+
],
|
|
26
|
+
publishers: [
|
|
27
|
+
{
|
|
28
|
+
name: 'workspaces',
|
|
29
|
+
table: workspacesOutbox,
|
|
30
|
+
db,
|
|
31
|
+
eventSchemas: workspacesEventSchemas
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
subscribers: [
|
|
35
|
+
subscriber(WORKSPACES_INVITATION_SEND_REQUESTED, onInvitationSendRequested)
|
|
36
|
+
],
|
|
37
|
+
metrics: registerWorkspacesServiceMetrics
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n WORKSPACES_INVITATION_SEND_REQUESTED,\n type WorkspacesEventMap,\n workspacesEventSchemas,\n} from '@shipfox/api-workspaces-dto';\nimport type {ShipfoxModule} from '@shipfox/node-module';\nimport {subscriberFactory} from '@shipfox/node-module';\nimport {db, migrationsPath, workspacesOutbox} from '#db/index.js';\nimport {registerWorkspacesServiceMetrics} from '#metrics/index.js';\nimport {workspacesE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {workspacesRoutes} from '#presentation/routes/index.js';\nimport {onInvitationSendRequested} from '#presentation/subscribers/index.js';\n\nexport type {Invitation} from '#core/entities/invitation.js';\nexport type {Membership} from '#core/entities/membership.js';\nexport type {Workspace, WorkspaceStatus} from '#core/entities/workspace.js';\nexport {\n InvitationEmailMismatchError,\n TokenAlreadyUsedError,\n TokenExpiredError,\n TokenInvalidError,\n WorkspaceNotFoundError,\n} from '#core/errors.js';\nexport {acceptWorkspaceInvitation, peekInvitationByRawToken} from '#core/invitations.js';\nexport {type EnsureMembershipParams, ensureMembership} from '#core/memberships.js';\nexport {getWorkspace, requireWorkspaceMembership} from '#core/workspaces.js';\nexport {db, migrationsPath} from '#db/index.js';\nexport {listMembershipsByUser} from '#db/memberships.js';\nexport {workspacesRoutes as routes} from '#presentation/routes/index.js';\n\nconst subscriber = subscriberFactory<WorkspacesEventMap>();\n\nexport const workspacesModule: ShipfoxModule = {\n name: 'workspaces',\n database: {db, migrationsPath},\n routes: workspacesRoutes,\n e2eRoutes: [workspacesE2eRoutes],\n publishers: [\n {name: 'workspaces', table: workspacesOutbox, db, eventSchemas: workspacesEventSchemas},\n ],\n subscribers: [subscriber(WORKSPACES_INVITATION_SEND_REQUESTED, onInvitationSendRequested)],\n metrics: registerWorkspacesServiceMetrics,\n};\n"],"names":["WORKSPACES_INVITATION_SEND_REQUESTED","workspacesEventSchemas","subscriberFactory","db","migrationsPath","workspacesOutbox","registerWorkspacesServiceMetrics","workspacesE2eRoutes","workspacesRoutes","onInvitationSendRequested","InvitationEmailMismatchError","TokenAlreadyUsedError","TokenExpiredError","TokenInvalidError","WorkspaceNotFoundError","acceptWorkspaceInvitation","peekInvitationByRawToken","ensureMembership","getWorkspace","requireWorkspaceMembership","listMembershipsByUser","routes","subscriber","workspacesModule","name","database","e2eRoutes","publishers","table","eventSchemas","subscribers","metrics"],"mappings":"AAAA,SACEA,oCAAoC,EAEpCC,sBAAsB,QACjB,8BAA8B;AAErC,SAAQC,iBAAiB,QAAO,uBAAuB;AACvD,SAAQC,EAAE,EAAEC,cAAc,EAAEC,gBAAgB,QAAO,eAAe;AAClE,SAAQC,gCAAgC,QAAO,oBAAoB;AACnE,SAAQC,mBAAmB,QAAO,mCAAmC;AACrE,SAAQC,gBAAgB,QAAO,gCAAgC;AAC/D,SAAQC,yBAAyB,QAAO,qCAAqC;AAK7E,SACEC,4BAA4B,EAC5BC,qBAAqB,EACrBC,iBAAiB,EACjBC,iBAAiB,EACjBC,sBAAsB,QACjB,kBAAkB;AACzB,SAAQC,yBAAyB,EAAEC,wBAAwB,QAAO,uBAAuB;AACzF,SAAqCC,gBAAgB,QAAO,uBAAuB;AACnF,SAAQC,YAAY,EAAEC,0BAA0B,QAAO,sBAAsB;AAC7E,SAAQhB,EAAE,EAAEC,cAAc,QAAO,eAAe;AAChD,SAAQgB,qBAAqB,QAAO,qBAAqB;AACzD,SAAQZ,oBAAoBa,MAAM,QAAO,gCAAgC;AAEzE,MAAMC,aAAapB;AAEnB,OAAO,MAAMqB,mBAAkC;IAC7CC,MAAM;IACNC,UAAU;QAACtB;QAAIC;IAAc;IAC7BiB,QAAQb;IACRkB,WAAW;QAACnB;KAAoB;IAChCoB,YAAY;QACV;YAACH,MAAM;YAAcI,OAAOvB;YAAkBF;YAAI0B,cAAc5B;QAAsB;KACvF;IACD6B,aAAa;QAACR,WAAWtB,sCAAsCS;KAA2B;IAC1FsB,SAASzB;AACX,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gCAAgC,EAAC,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["export {registerWorkspacesServiceMetrics} from './service.js';\n"],"names":["registerWorkspacesServiceMetrics"],"mappings":"AAAA,SAAQA,gCAAgC,QAAO,eAAe"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type WorkspacesInvitationEmailRequested = 'requested' | 'skipped';
|
|
2
|
+
export type WorkspacesMembershipChangeAction = 'added' | 'removed';
|
|
3
|
+
export type WorkspacesInvitationAcceptOutcome = 'added' | 'already_member';
|
|
4
|
+
export declare function recordWorkspaceCreated(): void;
|
|
5
|
+
export declare function recordWorkspaceMembershipChanged(action: WorkspacesMembershipChangeAction): void;
|
|
6
|
+
export declare function recordWorkspaceInvitationCreated(emailRequested: WorkspacesInvitationEmailRequested): void;
|
|
7
|
+
export declare function recordWorkspaceInvitationAccepted(outcome: WorkspacesInvitationAcceptOutcome): void;
|
|
8
|
+
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/metrics/instance.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kCAAkC,GAAG,WAAW,GAAG,SAAS,CAAC;AACzE,MAAM,MAAM,gCAAgC,GAAG,OAAO,GAAG,SAAS,CAAC;AACnE,MAAM,MAAM,iCAAiC,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAkC3E,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,gCAAgC,GAAG,IAAI,CAE/F;AAED,wBAAgB,gCAAgC,CAC9C,cAAc,EAAE,kCAAkC,GACjD,IAAI,CAEN;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,iCAAiC,GACzC,IAAI,CAEN"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { instanceMetrics } from '@shipfox/node-opentelemetry';
|
|
2
|
+
const meter = instanceMetrics.getMeter('workspaces');
|
|
3
|
+
const workspaceCreatedCount = meter.createCounter('workspaces_created', {
|
|
4
|
+
description: 'Workspaces created'
|
|
5
|
+
});
|
|
6
|
+
const membershipChangedCount = meter.createCounter('workspaces_membership_changed', {
|
|
7
|
+
description: 'Workspace membership changes by action'
|
|
8
|
+
});
|
|
9
|
+
const invitationCreatedCount = meter.createCounter('workspaces_invitation_created', {
|
|
10
|
+
description: 'Workspace invitations created by whether an invitation email was requested'
|
|
11
|
+
});
|
|
12
|
+
const invitationAcceptedCount = meter.createCounter('workspaces_invitation_accepted', {
|
|
13
|
+
description: 'Workspace invitations accepted by membership outcome'
|
|
14
|
+
});
|
|
15
|
+
function recordMetric(record) {
|
|
16
|
+
try {
|
|
17
|
+
record();
|
|
18
|
+
} catch {
|
|
19
|
+
// Metrics must not affect workspace mutations.
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function recordWorkspaceCreated() {
|
|
23
|
+
recordMetric(()=>workspaceCreatedCount.add(1));
|
|
24
|
+
}
|
|
25
|
+
export function recordWorkspaceMembershipChanged(action) {
|
|
26
|
+
recordMetric(()=>membershipChangedCount.add(1, {
|
|
27
|
+
action
|
|
28
|
+
}));
|
|
29
|
+
}
|
|
30
|
+
export function recordWorkspaceInvitationCreated(emailRequested) {
|
|
31
|
+
recordMetric(()=>invitationCreatedCount.add(1, {
|
|
32
|
+
email_requested: emailRequested
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
export function recordWorkspaceInvitationAccepted(outcome) {
|
|
36
|
+
recordMetric(()=>invitationAcceptedCount.add(1, {
|
|
37
|
+
outcome
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/instance.ts"],"sourcesContent":["import {instanceMetrics} from '@shipfox/node-opentelemetry';\n\nexport type WorkspacesInvitationEmailRequested = 'requested' | 'skipped';\nexport type WorkspacesMembershipChangeAction = 'added' | 'removed';\nexport type WorkspacesInvitationAcceptOutcome = 'added' | 'already_member';\n\nconst meter = instanceMetrics.getMeter('workspaces');\n\nconst workspaceCreatedCount = meter.createCounter<Record<string, never>>('workspaces_created', {\n description: 'Workspaces created',\n});\n\nconst membershipChangedCount = meter.createCounter<{\n action: WorkspacesMembershipChangeAction;\n}>('workspaces_membership_changed', {\n description: 'Workspace membership changes by action',\n});\n\nconst invitationCreatedCount = meter.createCounter<{\n email_requested: WorkspacesInvitationEmailRequested;\n}>('workspaces_invitation_created', {\n description: 'Workspace invitations created by whether an invitation email was requested',\n});\n\nconst invitationAcceptedCount = meter.createCounter<{\n outcome: WorkspacesInvitationAcceptOutcome;\n}>('workspaces_invitation_accepted', {\n description: 'Workspace invitations accepted by membership outcome',\n});\n\nfunction recordMetric(record: () => void): void {\n try {\n record();\n } catch {\n // Metrics must not affect workspace mutations.\n }\n}\n\nexport function recordWorkspaceCreated(): void {\n recordMetric(() => workspaceCreatedCount.add(1));\n}\n\nexport function recordWorkspaceMembershipChanged(action: WorkspacesMembershipChangeAction): void {\n recordMetric(() => membershipChangedCount.add(1, {action}));\n}\n\nexport function recordWorkspaceInvitationCreated(\n emailRequested: WorkspacesInvitationEmailRequested,\n): void {\n recordMetric(() => invitationCreatedCount.add(1, {email_requested: emailRequested}));\n}\n\nexport function recordWorkspaceInvitationAccepted(\n outcome: WorkspacesInvitationAcceptOutcome,\n): void {\n recordMetric(() => invitationAcceptedCount.add(1, {outcome}));\n}\n"],"names":["instanceMetrics","meter","getMeter","workspaceCreatedCount","createCounter","description","membershipChangedCount","invitationCreatedCount","invitationAcceptedCount","recordMetric","record","recordWorkspaceCreated","add","recordWorkspaceMembershipChanged","action","recordWorkspaceInvitationCreated","emailRequested","email_requested","recordWorkspaceInvitationAccepted","outcome"],"mappings":"AAAA,SAAQA,eAAe,QAAO,8BAA8B;AAM5D,MAAMC,QAAQD,gBAAgBE,QAAQ,CAAC;AAEvC,MAAMC,wBAAwBF,MAAMG,aAAa,CAAwB,sBAAsB;IAC7FC,aAAa;AACf;AAEA,MAAMC,yBAAyBL,MAAMG,aAAa,CAE/C,iCAAiC;IAClCC,aAAa;AACf;AAEA,MAAME,yBAAyBN,MAAMG,aAAa,CAE/C,iCAAiC;IAClCC,aAAa;AACf;AAEA,MAAMG,0BAA0BP,MAAMG,aAAa,CAEhD,kCAAkC;IACnCC,aAAa;AACf;AAEA,SAASI,aAAaC,MAAkB;IACtC,IAAI;QACFA;IACF,EAAE,OAAM;IACN,+CAA+C;IACjD;AACF;AAEA,OAAO,SAASC;IACdF,aAAa,IAAMN,sBAAsBS,GAAG,CAAC;AAC/C;AAEA,OAAO,SAASC,iCAAiCC,MAAwC;IACvFL,aAAa,IAAMH,uBAAuBM,GAAG,CAAC,GAAG;YAACE;QAAM;AAC1D;AAEA,OAAO,SAASC,iCACdC,cAAkD;IAElDP,aAAa,IAAMF,uBAAuBK,GAAG,CAAC,GAAG;YAACK,iBAAiBD;QAAc;AACnF;AAEA,OAAO,SAASE,kCACdC,OAA0C;IAE1CV,aAAa,IAAMD,wBAAwBI,GAAG,CAAC,GAAG;YAACO;QAAO;AAC5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/metrics/service.ts"],"names":[],"mappings":"AAGA,wBAAgB,gCAAgC,IAAI,IAAI,CAsBvD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getServiceMetricsProvider } from '@shipfox/node-opentelemetry';
|
|
2
|
+
import { getWorkspaceServiceMetrics } from '#db/workspaces.js';
|
|
3
|
+
export function registerWorkspacesServiceMetrics() {
|
|
4
|
+
const meter = getServiceMetricsProvider().getMeter('workspaces');
|
|
5
|
+
const activeWorkspaces = meter.createObservableGauge('workspaces_active', {
|
|
6
|
+
description: 'Workspaces currently marked active'
|
|
7
|
+
});
|
|
8
|
+
const memberships = meter.createObservableGauge('workspaces_memberships', {
|
|
9
|
+
description: 'Workspace memberships currently present'
|
|
10
|
+
});
|
|
11
|
+
const openInvitations = meter.createObservableGauge('workspaces_open_invitations', {
|
|
12
|
+
description: 'Workspace invitations currently unaccepted and unexpired'
|
|
13
|
+
});
|
|
14
|
+
meter.addBatchObservableCallback(async (observer)=>{
|
|
15
|
+
const metrics = await getWorkspaceServiceMetrics();
|
|
16
|
+
observer.observe(activeWorkspaces, metrics.activeWorkspaces);
|
|
17
|
+
observer.observe(memberships, metrics.memberships);
|
|
18
|
+
observer.observe(openInvitations, metrics.openInvitations);
|
|
19
|
+
}, [
|
|
20
|
+
activeWorkspaces,
|
|
21
|
+
memberships,
|
|
22
|
+
openInvitations
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/service.ts"],"sourcesContent":["import {getServiceMetricsProvider} from '@shipfox/node-opentelemetry';\nimport {getWorkspaceServiceMetrics} from '#db/workspaces.js';\n\nexport function registerWorkspacesServiceMetrics(): void {\n const meter = getServiceMetricsProvider().getMeter('workspaces');\n\n const activeWorkspaces = meter.createObservableGauge('workspaces_active', {\n description: 'Workspaces currently marked active',\n });\n const memberships = meter.createObservableGauge('workspaces_memberships', {\n description: 'Workspace memberships currently present',\n });\n const openInvitations = meter.createObservableGauge('workspaces_open_invitations', {\n description: 'Workspace invitations currently unaccepted and unexpired',\n });\n\n meter.addBatchObservableCallback(\n async (observer) => {\n const metrics = await getWorkspaceServiceMetrics();\n observer.observe(activeWorkspaces, metrics.activeWorkspaces);\n observer.observe(memberships, metrics.memberships);\n observer.observe(openInvitations, metrics.openInvitations);\n },\n [activeWorkspaces, memberships, openInvitations],\n );\n}\n"],"names":["getServiceMetricsProvider","getWorkspaceServiceMetrics","registerWorkspacesServiceMetrics","meter","getMeter","activeWorkspaces","createObservableGauge","description","memberships","openInvitations","addBatchObservableCallback","observer","metrics","observe"],"mappings":"AAAA,SAAQA,yBAAyB,QAAO,8BAA8B;AACtE,SAAQC,0BAA0B,QAAO,oBAAoB;AAE7D,OAAO,SAASC;IACd,MAAMC,QAAQH,4BAA4BI,QAAQ,CAAC;IAEnD,MAAMC,mBAAmBF,MAAMG,qBAAqB,CAAC,qBAAqB;QACxEC,aAAa;IACf;IACA,MAAMC,cAAcL,MAAMG,qBAAqB,CAAC,0BAA0B;QACxEC,aAAa;IACf;IACA,MAAME,kBAAkBN,MAAMG,qBAAqB,CAAC,+BAA+B;QACjFC,aAAa;IACf;IAEAJ,MAAMO,0BAA0B,CAC9B,OAAOC;QACL,MAAMC,UAAU,MAAMX;QACtBU,SAASE,OAAO,CAACR,kBAAkBO,QAAQP,gBAAgB;QAC3DM,SAASE,OAAO,CAACL,aAAaI,QAAQJ,WAAW;QACjDG,SAASE,OAAO,CAACJ,iBAAiBG,QAAQH,eAAe;IAC3D,GACA;QAACJ;QAAkBG;QAAaC;KAAgB;AAEpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAC,uBAAuB,EAAE,4BAA4B,EAAC,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAC,cAAc,EAAC,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/dto/index.ts"],"sourcesContent":["export {toInvitationDto} from './invitation.js';\nexport {toMembershipWithUserDto, toMembershipWithWorkspaceDto} from './membership.js';\nexport {toWorkspaceDto} from './workspace.js';\n"],"names":["toInvitationDto","toMembershipWithUserDto","toMembershipWithWorkspaceDto","toWorkspaceDto"],"mappings":"AAAA,SAAQA,eAAe,QAAO,kBAAkB;AAChD,SAAQC,uBAAuB,EAAEC,4BAA4B,QAAO,kBAAkB;AACtF,SAAQC,cAAc,QAAO,iBAAiB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invitation.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/invitation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,8BAA8B,CAAC;AAE7D,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,aAAa,CAYrE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function toInvitationDto(invitation) {
|
|
2
|
+
return {
|
|
3
|
+
id: invitation.id,
|
|
4
|
+
workspace_id: invitation.workspaceId,
|
|
5
|
+
email: invitation.email,
|
|
6
|
+
expires_at: invitation.expiresAt.toISOString(),
|
|
7
|
+
accepted_at: invitation.acceptedAt ? invitation.acceptedAt.toISOString() : null,
|
|
8
|
+
invited_by_user_id: invitation.invitedByUserId,
|
|
9
|
+
invited_by_display: invitation.invitedByDisplay,
|
|
10
|
+
created_at: invitation.createdAt.toISOString(),
|
|
11
|
+
updated_at: invitation.updatedAt.toISOString()
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=invitation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/dto/invitation.ts"],"sourcesContent":["import type {InvitationDto} from '@shipfox/api-workspaces-dto';\nimport type {Invitation} from '#core/entities/invitation.js';\n\nexport function toInvitationDto(invitation: Invitation): InvitationDto {\n return {\n id: invitation.id,\n workspace_id: invitation.workspaceId,\n email: invitation.email,\n expires_at: invitation.expiresAt.toISOString(),\n accepted_at: invitation.acceptedAt ? invitation.acceptedAt.toISOString() : null,\n invited_by_user_id: invitation.invitedByUserId,\n invited_by_display: invitation.invitedByDisplay,\n created_at: invitation.createdAt.toISOString(),\n updated_at: invitation.updatedAt.toISOString(),\n };\n}\n"],"names":["toInvitationDto","invitation","id","workspace_id","workspaceId","email","expires_at","expiresAt","toISOString","accepted_at","acceptedAt","invited_by_user_id","invitedByUserId","invited_by_display","invitedByDisplay","created_at","createdAt","updated_at","updatedAt"],"mappings":"AAGA,OAAO,SAASA,gBAAgBC,UAAsB;IACpD,OAAO;QACLC,IAAID,WAAWC,EAAE;QACjBC,cAAcF,WAAWG,WAAW;QACpCC,OAAOJ,WAAWI,KAAK;QACvBC,YAAYL,WAAWM,SAAS,CAACC,WAAW;QAC5CC,aAAaR,WAAWS,UAAU,GAAGT,WAAWS,UAAU,CAACF,WAAW,KAAK;QAC3EG,oBAAoBV,WAAWW,eAAe;QAC9CC,oBAAoBZ,WAAWa,gBAAgB;QAC/CC,YAAYd,WAAWe,SAAS,CAACR,WAAW;QAC5CS,YAAYhB,WAAWiB,SAAS,CAACV,WAAW;IAC9C;AACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MembershipWithUserDto, MembershipWithWorkspaceDto } from '@shipfox/api-workspaces-dto';
|
|
2
|
+
import type { MembershipWithUser, MembershipWithWorkspace } from '#db/memberships.js';
|
|
3
|
+
export declare function toMembershipWithWorkspaceDto(membership: MembershipWithWorkspace): MembershipWithWorkspaceDto;
|
|
4
|
+
export declare function toMembershipWithUserDto(membership: MembershipWithUser): MembershipWithUserDto;
|
|
5
|
+
//# sourceMappingURL=membership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/membership.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAE,0BAA0B,EAAC,MAAM,6BAA6B,CAAC;AACnG,OAAO,KAAK,EAAC,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AAEpF,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,uBAAuB,GAClC,0BAA0B,CAS5B;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,qBAAqB,CAU7F"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function toMembershipWithWorkspaceDto(membership) {
|
|
2
|
+
return {
|
|
3
|
+
id: membership.id,
|
|
4
|
+
user_id: membership.userId,
|
|
5
|
+
workspace_id: membership.workspaceId,
|
|
6
|
+
workspace_name: membership.workspaceName,
|
|
7
|
+
created_at: membership.createdAt.toISOString(),
|
|
8
|
+
updated_at: membership.updatedAt.toISOString()
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function toMembershipWithUserDto(membership) {
|
|
12
|
+
return {
|
|
13
|
+
id: membership.id,
|
|
14
|
+
user_id: membership.userId,
|
|
15
|
+
workspace_id: membership.workspaceId,
|
|
16
|
+
user_email: membership.userEmail,
|
|
17
|
+
user_name: membership.userName,
|
|
18
|
+
created_at: membership.createdAt.toISOString(),
|
|
19
|
+
updated_at: membership.updatedAt.toISOString()
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=membership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/dto/membership.ts"],"sourcesContent":["import type {MembershipWithUserDto, MembershipWithWorkspaceDto} from '@shipfox/api-workspaces-dto';\nimport type {MembershipWithUser, MembershipWithWorkspace} from '#db/memberships.js';\n\nexport function toMembershipWithWorkspaceDto(\n membership: MembershipWithWorkspace,\n): MembershipWithWorkspaceDto {\n return {\n id: membership.id,\n user_id: membership.userId,\n workspace_id: membership.workspaceId,\n workspace_name: membership.workspaceName,\n created_at: membership.createdAt.toISOString(),\n updated_at: membership.updatedAt.toISOString(),\n };\n}\n\nexport function toMembershipWithUserDto(membership: MembershipWithUser): MembershipWithUserDto {\n return {\n id: membership.id,\n user_id: membership.userId,\n workspace_id: membership.workspaceId,\n user_email: membership.userEmail,\n user_name: membership.userName,\n created_at: membership.createdAt.toISOString(),\n updated_at: membership.updatedAt.toISOString(),\n };\n}\n"],"names":["toMembershipWithWorkspaceDto","membership","id","user_id","userId","workspace_id","workspaceId","workspace_name","workspaceName","created_at","createdAt","toISOString","updated_at","updatedAt","toMembershipWithUserDto","user_email","userEmail","user_name","userName"],"mappings":"AAGA,OAAO,SAASA,6BACdC,UAAmC;IAEnC,OAAO;QACLC,IAAID,WAAWC,EAAE;QACjBC,SAASF,WAAWG,MAAM;QAC1BC,cAAcJ,WAAWK,WAAW;QACpCC,gBAAgBN,WAAWO,aAAa;QACxCC,YAAYR,WAAWS,SAAS,CAACC,WAAW;QAC5CC,YAAYX,WAAWY,SAAS,CAACF,WAAW;IAC9C;AACF;AAEA,OAAO,SAASG,wBAAwBb,UAA8B;IACpE,OAAO;QACLC,IAAID,WAAWC,EAAE;QACjBC,SAASF,WAAWG,MAAM;QAC1BC,cAAcJ,WAAWK,WAAW;QACpCS,YAAYd,WAAWe,SAAS;QAChCC,WAAWhB,WAAWiB,QAAQ;QAC9BT,YAAYR,WAAWS,SAAS,CAACC,WAAW;QAC5CC,YAAYX,WAAWY,SAAS,CAACF,WAAW;IAC9C;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,6BAA6B,CAAC;AAE3D,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,YAAY,CASjE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function toWorkspaceDto(workspace) {
|
|
2
|
+
return {
|
|
3
|
+
id: workspace.id,
|
|
4
|
+
name: workspace.name,
|
|
5
|
+
status: workspace.status,
|
|
6
|
+
settings: workspace.settings,
|
|
7
|
+
created_at: workspace.createdAt.toISOString(),
|
|
8
|
+
updated_at: workspace.updatedAt.toISOString()
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/dto/workspace.ts"],"sourcesContent":["import type {WorkspaceDto} from '@shipfox/api-workspaces-dto';\nimport type {Workspace} from '#core/entities/workspace.js';\n\nexport function toWorkspaceDto(workspace: Workspace): WorkspaceDto {\n return {\n id: workspace.id,\n name: workspace.name,\n status: workspace.status,\n settings: workspace.settings,\n created_at: workspace.createdAt.toISOString(),\n updated_at: workspace.updatedAt.toISOString(),\n };\n}\n"],"names":["toWorkspaceDto","workspace","id","name","status","settings","created_at","createdAt","toISOString","updated_at","updatedAt"],"mappings":"AAGA,OAAO,SAASA,eAAeC,SAAoB;IACjD,OAAO;QACLC,IAAID,UAAUC,EAAE;QAChBC,MAAMF,UAAUE,IAAI;QACpBC,QAAQH,UAAUG,MAAM;QACxBC,UAAUJ,UAAUI,QAAQ;QAC5BC,YAAYL,UAAUM,SAAS,CAACC,WAAW;QAC3CC,YAAYR,UAAUS,SAAS,CAACF,WAAW;IAC7C;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-invitation.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-invitation.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,wBAAwB,iDA4BnC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { e2eCreateInvitationBodySchema, e2eCreateInvitationResponseSchema } from '@shipfox/api-workspaces-dto';
|
|
2
|
+
import { defineRoute } from '@shipfox/node-fastify';
|
|
3
|
+
import { generateOpaqueToken, hashOpaqueToken } from '@shipfox/node-tokens';
|
|
4
|
+
import { createInvitation } from '#db/invitations.js';
|
|
5
|
+
import { toInvitationDto } from '#presentation/dto/index.js';
|
|
6
|
+
const INVITATION_TTL_DAYS = 7;
|
|
7
|
+
function daysFromNow(days) {
|
|
8
|
+
return new Date(Date.now() + days * 24 * 60 * 60 * 1000);
|
|
9
|
+
}
|
|
10
|
+
export const createE2eInvitationRoute = defineRoute({
|
|
11
|
+
method: 'POST',
|
|
12
|
+
path: '/invitations',
|
|
13
|
+
description: 'Create a workspace invitation for E2E tests.',
|
|
14
|
+
schema: {
|
|
15
|
+
body: e2eCreateInvitationBodySchema,
|
|
16
|
+
response: {
|
|
17
|
+
201: e2eCreateInvitationResponseSchema
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
handler: async (request, reply)=>{
|
|
21
|
+
const rawToken = generateOpaqueToken('invitation');
|
|
22
|
+
const invitation = await createInvitation({
|
|
23
|
+
workspaceId: request.body.workspace_id,
|
|
24
|
+
email: request.body.email,
|
|
25
|
+
hashedToken: hashOpaqueToken(rawToken),
|
|
26
|
+
expiresAt: daysFromNow(INVITATION_TTL_DAYS),
|
|
27
|
+
invitedByUserId: request.body.invited_by_user_id,
|
|
28
|
+
invitedByDisplay: request.body.invited_by_display ?? null,
|
|
29
|
+
skipEmail: true
|
|
30
|
+
});
|
|
31
|
+
reply.code(201);
|
|
32
|
+
return {
|
|
33
|
+
invitation: toInvitationDto(invitation),
|
|
34
|
+
raw_token: rawToken
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=create-invitation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/e2eRoutes/create-invitation.ts"],"sourcesContent":["import {\n e2eCreateInvitationBodySchema,\n e2eCreateInvitationResponseSchema,\n} from '@shipfox/api-workspaces-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {generateOpaqueToken, hashOpaqueToken} from '@shipfox/node-tokens';\nimport {createInvitation} from '#db/invitations.js';\nimport {toInvitationDto} from '#presentation/dto/index.js';\n\nconst INVITATION_TTL_DAYS = 7;\n\nfunction daysFromNow(days: number): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\nexport const createE2eInvitationRoute = defineRoute({\n method: 'POST',\n path: '/invitations',\n description: 'Create a workspace invitation for E2E tests.',\n schema: {\n body: e2eCreateInvitationBodySchema,\n response: {\n 201: e2eCreateInvitationResponseSchema,\n },\n },\n handler: async (request, reply) => {\n const rawToken = generateOpaqueToken('invitation');\n const invitation = await createInvitation({\n workspaceId: request.body.workspace_id,\n email: request.body.email,\n hashedToken: hashOpaqueToken(rawToken),\n expiresAt: daysFromNow(INVITATION_TTL_DAYS),\n invitedByUserId: request.body.invited_by_user_id,\n invitedByDisplay: request.body.invited_by_display ?? null,\n skipEmail: true,\n });\n\n reply.code(201);\n return {\n invitation: toInvitationDto(invitation),\n raw_token: rawToken,\n };\n },\n});\n"],"names":["e2eCreateInvitationBodySchema","e2eCreateInvitationResponseSchema","defineRoute","generateOpaqueToken","hashOpaqueToken","createInvitation","toInvitationDto","INVITATION_TTL_DAYS","daysFromNow","days","Date","now","createE2eInvitationRoute","method","path","description","schema","body","response","handler","request","reply","rawToken","invitation","workspaceId","workspace_id","email","hashedToken","expiresAt","invitedByUserId","invited_by_user_id","invitedByDisplay","invited_by_display","skipEmail","code","raw_token"],"mappings":"AAAA,SACEA,6BAA6B,EAC7BC,iCAAiC,QAC5B,8BAA8B;AACrC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,mBAAmB,EAAEC,eAAe,QAAO,uBAAuB;AAC1E,SAAQC,gBAAgB,QAAO,qBAAqB;AACpD,SAAQC,eAAe,QAAO,6BAA6B;AAE3D,MAAMC,sBAAsB;AAE5B,SAASC,YAAYC,IAAY;IAC/B,OAAO,IAAIC,KAAKA,KAAKC,GAAG,KAAKF,OAAO,KAAK,KAAK,KAAK;AACrD;AAEA,OAAO,MAAMG,2BAA2BV,YAAY;IAClDW,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMjB;QACNkB,UAAU;YACR,KAAKjB;QACP;IACF;IACAkB,SAAS,OAAOC,SAASC;QACvB,MAAMC,WAAWnB,oBAAoB;QACrC,MAAMoB,aAAa,MAAMlB,iBAAiB;YACxCmB,aAAaJ,QAAQH,IAAI,CAACQ,YAAY;YACtCC,OAAON,QAAQH,IAAI,CAACS,KAAK;YACzBC,aAAavB,gBAAgBkB;YAC7BM,WAAWpB,YAAYD;YACvBsB,iBAAiBT,QAAQH,IAAI,CAACa,kBAAkB;YAChDC,kBAAkBX,QAAQH,IAAI,CAACe,kBAAkB,IAAI;YACrDC,WAAW;QACb;QAEAZ,MAAMa,IAAI,CAAC;QACX,OAAO;YACLX,YAAYjB,gBAAgBiB;YAC5BY,WAAWb;QACb;IACF;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-workspace.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-workspace.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,uBAAuB,iDAqBlC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { e2eCreateWorkspaceBodySchema, e2eCreateWorkspaceResponseSchema } from '@shipfox/api-workspaces-dto';
|
|
2
|
+
import { defineRoute } from '@shipfox/node-fastify';
|
|
3
|
+
import { createWorkspaceForUser } from '#core/index.js';
|
|
4
|
+
import { toWorkspaceDto } from '#presentation/dto/index.js';
|
|
5
|
+
export const createE2eWorkspaceRoute = defineRoute({
|
|
6
|
+
method: 'POST',
|
|
7
|
+
path: '/',
|
|
8
|
+
description: 'Create a workspace for an existing user for E2E tests.',
|
|
9
|
+
schema: {
|
|
10
|
+
body: e2eCreateWorkspaceBodySchema,
|
|
11
|
+
response: {
|
|
12
|
+
201: e2eCreateWorkspaceResponseSchema
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
handler: async (request, reply)=>{
|
|
16
|
+
const workspace = await createWorkspaceForUser({
|
|
17
|
+
name: request.body.name,
|
|
18
|
+
userId: request.body.user_id,
|
|
19
|
+
userEmail: request.body.user_email,
|
|
20
|
+
userName: request.body.user_name
|
|
21
|
+
});
|
|
22
|
+
reply.code(201);
|
|
23
|
+
return toWorkspaceDto(workspace);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=create-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/e2eRoutes/create-workspace.ts"],"sourcesContent":["import {\n e2eCreateWorkspaceBodySchema,\n e2eCreateWorkspaceResponseSchema,\n} from '@shipfox/api-workspaces-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {createWorkspaceForUser} from '#core/index.js';\nimport {toWorkspaceDto} from '#presentation/dto/index.js';\n\nexport const createE2eWorkspaceRoute = defineRoute({\n method: 'POST',\n path: '/',\n description: 'Create a workspace for an existing user for E2E tests.',\n schema: {\n body: e2eCreateWorkspaceBodySchema,\n response: {\n 201: e2eCreateWorkspaceResponseSchema,\n },\n },\n handler: async (request, reply) => {\n const workspace = await createWorkspaceForUser({\n name: request.body.name,\n userId: request.body.user_id,\n userEmail: request.body.user_email,\n userName: request.body.user_name,\n });\n\n reply.code(201);\n return toWorkspaceDto(workspace);\n },\n});\n"],"names":["e2eCreateWorkspaceBodySchema","e2eCreateWorkspaceResponseSchema","defineRoute","createWorkspaceForUser","toWorkspaceDto","createE2eWorkspaceRoute","method","path","description","schema","body","response","handler","request","reply","workspace","name","userId","user_id","userEmail","user_email","userName","user_name","code"],"mappings":"AAAA,SACEA,4BAA4B,EAC5BC,gCAAgC,QAC3B,8BAA8B;AACrC,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,sBAAsB,QAAO,iBAAiB;AACtD,SAAQC,cAAc,QAAO,6BAA6B;AAE1D,OAAO,MAAMC,0BAA0BH,YAAY;IACjDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMV;QACNW,UAAU;YACR,KAAKV;QACP;IACF;IACAW,SAAS,OAAOC,SAASC;QACvB,MAAMC,YAAY,MAAMZ,uBAAuB;YAC7Ca,MAAMH,QAAQH,IAAI,CAACM,IAAI;YACvBC,QAAQJ,QAAQH,IAAI,CAACQ,OAAO;YAC5BC,WAAWN,QAAQH,IAAI,CAACU,UAAU;YAClCC,UAAUR,QAAQH,IAAI,CAACY,SAAS;QAClC;QAEAR,MAAMS,IAAI,CAAC;QACX,OAAOnB,eAAeW;IACxB;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;AAItD,eAAO,MAAM,mBAAmB,EAAE,UAGjC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createE2eInvitationRoute } from './create-invitation.js';
|
|
2
|
+
import { createE2eWorkspaceRoute } from './create-workspace.js';
|
|
3
|
+
export const workspacesE2eRoutes = {
|
|
4
|
+
prefix: '/workspaces',
|
|
5
|
+
routes: [
|
|
6
|
+
createE2eWorkspaceRoute,
|
|
7
|
+
createE2eInvitationRoute
|
|
8
|
+
]
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
//# 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 {createE2eInvitationRoute} from './create-invitation.js';\nimport {createE2eWorkspaceRoute} from './create-workspace.js';\n\nexport const workspacesE2eRoutes: RouteGroup = {\n prefix: '/workspaces',\n routes: [createE2eWorkspaceRoute, createE2eInvitationRoute],\n};\n"],"names":["createE2eInvitationRoute","createE2eWorkspaceRoute","workspacesE2eRoutes","prefix","routes"],"mappings":"AACA,SAAQA,wBAAwB,QAAO,yBAAyB;AAChE,SAAQC,uBAAuB,QAAO,wBAAwB;AAE9D,OAAO,MAAMC,sBAAkC;IAC7CC,QAAQ;IACRC,QAAQ;QAACH;QAAyBD;KAAyB;AAC7D,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presentation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,IAAI,MAAM,EAAC,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/presentation/index.ts"],"sourcesContent":["export {workspacesRoutes as routes} from './routes/index.js';\n"],"names":["workspacesRoutes","routes"],"mappings":"AAAA,SAAQA,oBAAoBC,MAAM,QAAO,oBAAoB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAKtD,eAAO,MAAM,gBAAgB,EAAE,UAAU,EAiBxC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { invitationsAcceptGroup, invitationsWorkspaceScopedRoutes } from './invitations/index.js';
|
|
2
|
+
import { memberRoutes } from './members/index.js';
|
|
3
|
+
import { createWorkspaceRoute, listUserWorkspacesRoute } from './workspaces/index.js';
|
|
4
|
+
export const workspacesRoutes = [
|
|
5
|
+
invitationsAcceptGroup,
|
|
6
|
+
{
|
|
7
|
+
prefix: '/workspaces',
|
|
8
|
+
routes: [
|
|
9
|
+
listUserWorkspacesRoute,
|
|
10
|
+
createWorkspaceRoute,
|
|
11
|
+
{
|
|
12
|
+
prefix: '/:workspaceId/members',
|
|
13
|
+
routes: memberRoutes
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
prefix: '/:workspaceId/invitations',
|
|
17
|
+
routes: invitationsWorkspaceScopedRoutes
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/routes/index.ts"],"sourcesContent":["import type {RouteGroup} from '@shipfox/node-fastify';\nimport {invitationsAcceptGroup, invitationsWorkspaceScopedRoutes} from './invitations/index.js';\nimport {memberRoutes} from './members/index.js';\nimport {createWorkspaceRoute, listUserWorkspacesRoute} from './workspaces/index.js';\n\nexport const workspacesRoutes: RouteGroup[] = [\n invitationsAcceptGroup,\n {\n prefix: '/workspaces',\n routes: [\n listUserWorkspacesRoute,\n createWorkspaceRoute,\n {\n prefix: '/:workspaceId/members',\n routes: memberRoutes,\n },\n {\n prefix: '/:workspaceId/invitations',\n routes: invitationsWorkspaceScopedRoutes,\n },\n ],\n },\n];\n"],"names":["invitationsAcceptGroup","invitationsWorkspaceScopedRoutes","memberRoutes","createWorkspaceRoute","listUserWorkspacesRoute","workspacesRoutes","prefix","routes"],"mappings":"AACA,SAAQA,sBAAsB,EAAEC,gCAAgC,QAAO,yBAAyB;AAChG,SAAQC,YAAY,QAAO,qBAAqB;AAChD,SAAQC,oBAAoB,EAAEC,uBAAuB,QAAO,wBAAwB;AAEpF,OAAO,MAAMC,mBAAiC;IAC5CL;IACA;QACEM,QAAQ;QACRC,QAAQ;YACNH;YACAD;YACA;gBACEG,QAAQ;gBACRC,QAAQL;YACV;YACA;gBACEI,QAAQ;gBACRC,QAAQN;YACV;SACD;IACH;CACD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/invitations/accept.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,qBAAqB,iDAuDhC,CAAC"}
|