@shipfox/api-workspaces 10.1.0 → 11.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 +1 -1
- package/CHANGELOG.md +33 -0
- package/README.md +7 -1
- package/dist/core/admin-workspaces.d.ts +16 -0
- package/dist/core/admin-workspaces.d.ts.map +1 -1
- package/dist/core/admin-workspaces.js +52 -0
- package/dist/core/admin-workspaces.js.map +1 -1
- package/dist/core/errors.d.ts +12 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +24 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/invitations.d.ts.map +1 -1
- package/dist/core/invitations.js +6 -3
- package/dist/core/invitations.js.map +1 -1
- package/dist/core/workspaces.d.ts +1 -0
- package/dist/core/workspaces.d.ts.map +1 -1
- package/dist/core/workspaces.js +5 -3
- package/dist/core/workspaces.js.map +1 -1
- package/dist/db/admin-workspace-commands.d.ts +17 -0
- package/dist/db/admin-workspace-commands.d.ts.map +1 -0
- package/dist/db/admin-workspace-commands.js +86 -0
- package/dist/db/admin-workspace-commands.js.map +1 -0
- package/dist/db/db.d.ts +256 -0
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +2 -0
- package/dist/db/db.js.map +1 -1
- package/dist/db/index.d.ts +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/schema/admin-command-results.d.ts +135 -0
- package/dist/db/schema/admin-command-results.d.ts.map +1 -0
- package/dist/db/schema/admin-command-results.js +18 -0
- package/dist/db/schema/admin-command-results.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/presentation/inter-module.d.ts.map +1 -1
- package/dist/presentation/inter-module.js +3 -2
- package/dist/presentation/inter-module.js.map +1 -1
- package/dist/presentation/routes/admin-workspaces.d.ts.map +1 -1
- package/dist/presentation/routes/admin-workspaces.js +119 -14
- package/dist/presentation/routes/admin-workspaces.js.map +1 -1
- package/dist/presentation/routes/invitations/create.d.ts.map +1 -1
- package/dist/presentation/routes/invitations/create.js +5 -1
- package/dist/presentation/routes/invitations/create.js.map +1 -1
- package/dist/presentation/routes/invitations/list.d.ts.map +1 -1
- package/dist/presentation/routes/invitations/list.js +5 -1
- package/dist/presentation/routes/invitations/list.js.map +1 -1
- package/dist/presentation/routes/invitations/revoke.d.ts.map +1 -1
- package/dist/presentation/routes/invitations/revoke.js +5 -1
- package/dist/presentation/routes/invitations/revoke.js.map +1 -1
- package/dist/presentation/routes/members/list.d.ts.map +1 -1
- package/dist/presentation/routes/members/list.js +5 -1
- package/dist/presentation/routes/members/list.js.map +1 -1
- package/dist/presentation/routes/members/remove.d.ts.map +1 -1
- package/dist/presentation/routes/members/remove.js +5 -1
- package/dist/presentation/routes/members/remove.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0002_wide_enchantress.sql +11 -0
- package/drizzle/meta/0002_snapshot.json +555 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +6 -6
- package/src/core/admin-workspaces.ts +102 -0
- package/src/core/errors.ts +28 -0
- package/src/core/index.ts +8 -0
- package/src/core/invitations.test.ts +8 -8
- package/src/core/invitations.ts +3 -0
- package/src/core/workspaces.test.ts +22 -3
- package/src/core/workspaces.ts +4 -1
- package/src/db/admin-workspace-commands.ts +169 -0
- package/src/db/db.ts +2 -0
- package/src/db/index.ts +1 -0
- package/src/db/schema/admin-command-results.ts +30 -0
- package/src/index.test.ts +3 -1
- package/src/index.ts +17 -2
- package/src/presentation/inter-module.test.ts +51 -0
- package/src/presentation/inter-module.ts +7 -4
- package/src/presentation/routes/admin-workspaces.test.ts +273 -3
- package/src/presentation/routes/admin-workspaces.ts +143 -13
- package/src/presentation/routes/invitations/create.test.ts +15 -0
- package/src/presentation/routes/invitations/create.ts +2 -1
- package/src/presentation/routes/invitations/list.test.ts +30 -0
- package/src/presentation/routes/invitations/list.ts +2 -1
- package/src/presentation/routes/invitations/revoke.test.ts +14 -0
- package/src/presentation/routes/invitations/revoke.ts +2 -1
- package/src/presentation/routes/members/list.test.ts +29 -1
- package/src/presentation/routes/members/list.ts +2 -1
- package/src/presentation/routes/members/remove.test.ts +14 -0
- package/src/presentation/routes/members/remove.ts +2 -1
- package/test/globalSetup.ts +3 -1
- package/test/routes.ts +8 -3
- package/tsconfig.build.tsbuildinfo +1 -1
- package/vitest.config.ts +3 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { writeOutboxEvent } from '@shipfox/node-outbox';
|
|
2
|
+
import { and, eq, sql } from 'drizzle-orm';
|
|
3
|
+
import { WorkspaceAdminIdempotencyKeyReuseError, WorkspaceAlreadySuspendedError, WorkspaceDeletedError, WorkspaceNotFoundError, WorkspaceNotSuspendedError } from '#core/errors.js';
|
|
4
|
+
import { db } from './db.js';
|
|
5
|
+
import { workspacesAdminCommandResults } from './schema/admin-command-results.js';
|
|
6
|
+
import { workspacesOutbox } from './schema/outbox.js';
|
|
7
|
+
import { workspaces } from './schema/workspaces.js';
|
|
8
|
+
async function loadCommandResult(tx, params) {
|
|
9
|
+
const rows = await tx.select().from(workspacesAdminCommandResults).where(and(eq(workspacesAdminCommandResults.actorId, params.actorId), eq(workspacesAdminCommandResults.idempotencyKeyFingerprint, params.idempotencyKeyFingerprint))).limit(1);
|
|
10
|
+
const result = rows[0];
|
|
11
|
+
if (!result) return undefined;
|
|
12
|
+
if (result.command !== params.command || result.requestFingerprint !== params.requestFingerprint) {
|
|
13
|
+
throw new WorkspaceAdminIdempotencyKeyReuseError();
|
|
14
|
+
}
|
|
15
|
+
return result.result;
|
|
16
|
+
}
|
|
17
|
+
async function storeCommandResult(tx, params, result) {
|
|
18
|
+
await tx.insert(workspacesAdminCommandResults).values({
|
|
19
|
+
actorId: params.actorId,
|
|
20
|
+
idempotencyKeyFingerprint: params.idempotencyKeyFingerprint,
|
|
21
|
+
command: params.event.command,
|
|
22
|
+
requestFingerprint: params.requestFingerprint,
|
|
23
|
+
result
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async function writeAdministrationAction(tx, event) {
|
|
27
|
+
await writeOutboxEvent(tx, workspacesOutbox, {
|
|
28
|
+
type: 'administration.action.performed',
|
|
29
|
+
payload: event
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async function lockAdminCommand(tx, params) {
|
|
33
|
+
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${`workspaces_admin_command:${params.actorId}:${params.idempotencyKeyFingerprint}`}))`);
|
|
34
|
+
}
|
|
35
|
+
async function updateWorkspaceStatusWithAudit(params) {
|
|
36
|
+
return await db().transaction(async (tx)=>{
|
|
37
|
+
await lockAdminCommand(tx, params);
|
|
38
|
+
const existing = await loadCommandResult(tx, {
|
|
39
|
+
actorId: params.actorId,
|
|
40
|
+
idempotencyKeyFingerprint: params.idempotencyKeyFingerprint,
|
|
41
|
+
command: params.event.command,
|
|
42
|
+
requestFingerprint: params.requestFingerprint
|
|
43
|
+
});
|
|
44
|
+
if (existing) return existing;
|
|
45
|
+
const rows = await tx.select().from(workspaces).where(eq(workspaces.id, params.workspaceId)).for('update').limit(1);
|
|
46
|
+
const workspaceRow = rows[0];
|
|
47
|
+
if (!workspaceRow) throw new WorkspaceNotFoundError(params.workspaceId);
|
|
48
|
+
if (workspaceRow.status === 'deleted') throw new WorkspaceDeletedError(params.workspaceId);
|
|
49
|
+
if (workspaceRow.status !== params.expectedStatus) {
|
|
50
|
+
if (params.nextStatus === 'suspended') {
|
|
51
|
+
throw new WorkspaceAlreadySuspendedError(params.workspaceId);
|
|
52
|
+
}
|
|
53
|
+
throw new WorkspaceNotSuspendedError(params.workspaceId);
|
|
54
|
+
}
|
|
55
|
+
const updatedRows = await tx.update(workspaces).set({
|
|
56
|
+
status: params.nextStatus,
|
|
57
|
+
updatedAt: new Date()
|
|
58
|
+
}).where(eq(workspaces.id, params.workspaceId)).returning();
|
|
59
|
+
const updatedRow = updatedRows[0];
|
|
60
|
+
if (!updatedRow) throw new WorkspaceNotFoundError(params.workspaceId);
|
|
61
|
+
const result = {
|
|
62
|
+
workspaceId: updatedRow.id,
|
|
63
|
+
status: updatedRow.status,
|
|
64
|
+
correlationId: params.event.correlationId
|
|
65
|
+
};
|
|
66
|
+
await writeAdministrationAction(tx, params.event);
|
|
67
|
+
await storeCommandResult(tx, params, result);
|
|
68
|
+
return result;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
export async function suspendWorkspaceWithAudit(params) {
|
|
72
|
+
return await updateWorkspaceStatusWithAudit({
|
|
73
|
+
...params,
|
|
74
|
+
expectedStatus: 'active',
|
|
75
|
+
nextStatus: 'suspended'
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
export async function reactivateWorkspaceWithAudit(params) {
|
|
79
|
+
return await updateWorkspaceStatusWithAudit({
|
|
80
|
+
...params,
|
|
81
|
+
expectedStatus: 'suspended',
|
|
82
|
+
nextStatus: 'active'
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=admin-workspace-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/admin-workspace-commands.ts"],"sourcesContent":["import type {\n AdministrationActionEvent,\n AdministrationActionEventMap,\n} from '@shipfox/api-common-dto';\nimport {writeOutboxEvent} from '@shipfox/node-outbox';\nimport {and, eq, sql} from 'drizzle-orm';\nimport {\n WorkspaceAdminIdempotencyKeyReuseError,\n WorkspaceAlreadySuspendedError,\n WorkspaceDeletedError,\n WorkspaceNotFoundError,\n WorkspaceNotSuspendedError,\n} from '#core/errors.js';\nimport {db} from './db.js';\nimport {\n type WorkspaceAdminCommandResultDb,\n workspacesAdminCommandResults,\n} from './schema/admin-command-results.js';\nimport {workspacesOutbox} from './schema/outbox.js';\nimport {workspaces} from './schema/workspaces.js';\n\ntype Tx = Parameters<Parameters<ReturnType<typeof db>['transaction']>[0]>[0];\n\nexport interface WorkspaceAdministrationResult {\n workspaceId: string;\n status: 'active' | 'suspended';\n correlationId: string;\n}\n\ninterface AuditedWorkspaceCommandParams {\n actorId: string;\n idempotencyKeyFingerprint: string;\n requestFingerprint: string;\n event: AdministrationActionEvent;\n workspaceId: string;\n}\n\nasync function loadCommandResult(\n tx: Tx,\n params: Pick<AuditedWorkspaceCommandParams, 'actorId' | 'idempotencyKeyFingerprint'> & {\n command: string;\n requestFingerprint: string;\n },\n): Promise<WorkspaceAdministrationResult | undefined> {\n const rows = await tx\n .select()\n .from(workspacesAdminCommandResults)\n .where(\n and(\n eq(workspacesAdminCommandResults.actorId, params.actorId),\n eq(\n workspacesAdminCommandResults.idempotencyKeyFingerprint,\n params.idempotencyKeyFingerprint,\n ),\n ),\n )\n .limit(1);\n const result: WorkspaceAdminCommandResultDb | undefined = rows[0];\n if (!result) return undefined;\n if (\n result.command !== params.command ||\n result.requestFingerprint !== params.requestFingerprint\n ) {\n throw new WorkspaceAdminIdempotencyKeyReuseError();\n }\n return result.result;\n}\n\nasync function storeCommandResult(\n tx: Tx,\n params: AuditedWorkspaceCommandParams,\n result: WorkspaceAdministrationResult,\n): Promise<void> {\n await tx.insert(workspacesAdminCommandResults).values({\n actorId: params.actorId,\n idempotencyKeyFingerprint: params.idempotencyKeyFingerprint,\n command: params.event.command,\n requestFingerprint: params.requestFingerprint,\n result,\n });\n}\n\nasync function writeAdministrationAction(tx: Tx, event: AdministrationActionEvent): Promise<void> {\n await writeOutboxEvent<AdministrationActionEventMap>(tx, workspacesOutbox, {\n type: 'administration.action.performed',\n payload: event,\n });\n}\n\nasync function lockAdminCommand(\n tx: Tx,\n params: {actorId: string; idempotencyKeyFingerprint: string},\n): Promise<void> {\n await tx.execute(\n sql`select pg_advisory_xact_lock(hashtext(${`workspaces_admin_command:${params.actorId}:${params.idempotencyKeyFingerprint}`}))`,\n );\n}\n\nasync function updateWorkspaceStatusWithAudit(\n params: AuditedWorkspaceCommandParams & {\n expectedStatus: 'active' | 'suspended';\n nextStatus: 'active' | 'suspended';\n },\n): Promise<WorkspaceAdministrationResult> {\n return await db().transaction(async (tx) => {\n await lockAdminCommand(tx, params);\n\n const existing = await loadCommandResult(tx, {\n actorId: params.actorId,\n idempotencyKeyFingerprint: params.idempotencyKeyFingerprint,\n command: params.event.command,\n requestFingerprint: params.requestFingerprint,\n });\n if (existing) return existing;\n\n const rows = await tx\n .select()\n .from(workspaces)\n .where(eq(workspaces.id, params.workspaceId))\n .for('update')\n .limit(1);\n const workspaceRow = rows[0];\n if (!workspaceRow) throw new WorkspaceNotFoundError(params.workspaceId);\n if (workspaceRow.status === 'deleted') throw new WorkspaceDeletedError(params.workspaceId);\n if (workspaceRow.status !== params.expectedStatus) {\n if (params.nextStatus === 'suspended') {\n throw new WorkspaceAlreadySuspendedError(params.workspaceId);\n }\n throw new WorkspaceNotSuspendedError(params.workspaceId);\n }\n\n const updatedRows = await tx\n .update(workspaces)\n .set({status: params.nextStatus, updatedAt: new Date()})\n .where(eq(workspaces.id, params.workspaceId))\n .returning();\n const updatedRow = updatedRows[0];\n if (!updatedRow) throw new WorkspaceNotFoundError(params.workspaceId);\n\n const result = {\n workspaceId: updatedRow.id,\n status: updatedRow.status as 'active' | 'suspended',\n correlationId: params.event.correlationId,\n } satisfies WorkspaceAdministrationResult;\n await writeAdministrationAction(tx, params.event);\n await storeCommandResult(tx, params, result);\n return result;\n });\n}\n\nexport async function suspendWorkspaceWithAudit(\n params: AuditedWorkspaceCommandParams,\n): Promise<WorkspaceAdministrationResult> {\n return await updateWorkspaceStatusWithAudit({\n ...params,\n expectedStatus: 'active',\n nextStatus: 'suspended',\n });\n}\n\nexport async function reactivateWorkspaceWithAudit(\n params: AuditedWorkspaceCommandParams,\n): Promise<WorkspaceAdministrationResult> {\n return await updateWorkspaceStatusWithAudit({\n ...params,\n expectedStatus: 'suspended',\n nextStatus: 'active',\n });\n}\n"],"names":["writeOutboxEvent","and","eq","sql","WorkspaceAdminIdempotencyKeyReuseError","WorkspaceAlreadySuspendedError","WorkspaceDeletedError","WorkspaceNotFoundError","WorkspaceNotSuspendedError","db","workspacesAdminCommandResults","workspacesOutbox","workspaces","loadCommandResult","tx","params","rows","select","from","where","actorId","idempotencyKeyFingerprint","limit","result","undefined","command","requestFingerprint","storeCommandResult","insert","values","event","writeAdministrationAction","type","payload","lockAdminCommand","execute","updateWorkspaceStatusWithAudit","transaction","existing","id","workspaceId","for","workspaceRow","status","expectedStatus","nextStatus","updatedRows","update","set","updatedAt","Date","returning","updatedRow","correlationId","suspendWorkspaceWithAudit","reactivateWorkspaceWithAudit"],"mappings":"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"}
|
package/dist/db/db.d.ts
CHANGED
|
@@ -1,5 +1,133 @@
|
|
|
1
1
|
import { type NodePgDatabase } from '@shipfox/node-drizzle';
|
|
2
2
|
export declare const schema: {
|
|
3
|
+
workspacesAdminCommandResults: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4
|
+
name: "admin_command_results";
|
|
5
|
+
schema: undefined;
|
|
6
|
+
columns: {
|
|
7
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
8
|
+
name: "id";
|
|
9
|
+
tableName: "admin_command_results";
|
|
10
|
+
dataType: "string";
|
|
11
|
+
columnType: "PgUUID";
|
|
12
|
+
data: string;
|
|
13
|
+
driverParam: string;
|
|
14
|
+
notNull: true;
|
|
15
|
+
hasDefault: true;
|
|
16
|
+
isPrimaryKey: true;
|
|
17
|
+
isAutoincrement: false;
|
|
18
|
+
hasRuntimeDefault: false;
|
|
19
|
+
enumValues: undefined;
|
|
20
|
+
baseColumn: never;
|
|
21
|
+
identity: undefined;
|
|
22
|
+
generated: undefined;
|
|
23
|
+
}, {}, {}>;
|
|
24
|
+
actorId: import("drizzle-orm/pg-core").PgColumn<{
|
|
25
|
+
name: "actor_id";
|
|
26
|
+
tableName: "admin_command_results";
|
|
27
|
+
dataType: "string";
|
|
28
|
+
columnType: "PgUUID";
|
|
29
|
+
data: string;
|
|
30
|
+
driverParam: string;
|
|
31
|
+
notNull: true;
|
|
32
|
+
hasDefault: false;
|
|
33
|
+
isPrimaryKey: false;
|
|
34
|
+
isAutoincrement: false;
|
|
35
|
+
hasRuntimeDefault: false;
|
|
36
|
+
enumValues: undefined;
|
|
37
|
+
baseColumn: never;
|
|
38
|
+
identity: undefined;
|
|
39
|
+
generated: undefined;
|
|
40
|
+
}, {}, {}>;
|
|
41
|
+
idempotencyKeyFingerprint: import("drizzle-orm/pg-core").PgColumn<{
|
|
42
|
+
name: "idempotency_key_fingerprint";
|
|
43
|
+
tableName: "admin_command_results";
|
|
44
|
+
dataType: "string";
|
|
45
|
+
columnType: "PgText";
|
|
46
|
+
data: string;
|
|
47
|
+
driverParam: string;
|
|
48
|
+
notNull: true;
|
|
49
|
+
hasDefault: false;
|
|
50
|
+
isPrimaryKey: false;
|
|
51
|
+
isAutoincrement: false;
|
|
52
|
+
hasRuntimeDefault: false;
|
|
53
|
+
enumValues: [string, ...string[]];
|
|
54
|
+
baseColumn: never;
|
|
55
|
+
identity: undefined;
|
|
56
|
+
generated: undefined;
|
|
57
|
+
}, {}, {}>;
|
|
58
|
+
command: import("drizzle-orm/pg-core").PgColumn<{
|
|
59
|
+
name: "command";
|
|
60
|
+
tableName: "admin_command_results";
|
|
61
|
+
dataType: "string";
|
|
62
|
+
columnType: "PgText";
|
|
63
|
+
data: string;
|
|
64
|
+
driverParam: string;
|
|
65
|
+
notNull: true;
|
|
66
|
+
hasDefault: false;
|
|
67
|
+
isPrimaryKey: false;
|
|
68
|
+
isAutoincrement: false;
|
|
69
|
+
hasRuntimeDefault: false;
|
|
70
|
+
enumValues: [string, ...string[]];
|
|
71
|
+
baseColumn: never;
|
|
72
|
+
identity: undefined;
|
|
73
|
+
generated: undefined;
|
|
74
|
+
}, {}, {}>;
|
|
75
|
+
requestFingerprint: import("drizzle-orm/pg-core").PgColumn<{
|
|
76
|
+
name: "request_fingerprint";
|
|
77
|
+
tableName: "admin_command_results";
|
|
78
|
+
dataType: "string";
|
|
79
|
+
columnType: "PgText";
|
|
80
|
+
data: string;
|
|
81
|
+
driverParam: string;
|
|
82
|
+
notNull: true;
|
|
83
|
+
hasDefault: false;
|
|
84
|
+
isPrimaryKey: false;
|
|
85
|
+
isAutoincrement: false;
|
|
86
|
+
hasRuntimeDefault: false;
|
|
87
|
+
enumValues: [string, ...string[]];
|
|
88
|
+
baseColumn: never;
|
|
89
|
+
identity: undefined;
|
|
90
|
+
generated: undefined;
|
|
91
|
+
}, {}, {}>;
|
|
92
|
+
result: import("drizzle-orm/pg-core").PgColumn<{
|
|
93
|
+
name: "result";
|
|
94
|
+
tableName: "admin_command_results";
|
|
95
|
+
dataType: "json";
|
|
96
|
+
columnType: "PgJsonb";
|
|
97
|
+
data: import("./schema/admin-command-results.js").StoredWorkspaceAdministrationResult;
|
|
98
|
+
driverParam: unknown;
|
|
99
|
+
notNull: true;
|
|
100
|
+
hasDefault: false;
|
|
101
|
+
isPrimaryKey: false;
|
|
102
|
+
isAutoincrement: false;
|
|
103
|
+
hasRuntimeDefault: false;
|
|
104
|
+
enumValues: undefined;
|
|
105
|
+
baseColumn: never;
|
|
106
|
+
identity: undefined;
|
|
107
|
+
generated: undefined;
|
|
108
|
+
}, {}, {
|
|
109
|
+
$type: import("./schema/admin-command-results.js").StoredWorkspaceAdministrationResult;
|
|
110
|
+
}>;
|
|
111
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
112
|
+
name: "created_at";
|
|
113
|
+
tableName: "admin_command_results";
|
|
114
|
+
dataType: "date";
|
|
115
|
+
columnType: "PgTimestamp";
|
|
116
|
+
data: Date;
|
|
117
|
+
driverParam: string;
|
|
118
|
+
notNull: true;
|
|
119
|
+
hasDefault: true;
|
|
120
|
+
isPrimaryKey: false;
|
|
121
|
+
isAutoincrement: false;
|
|
122
|
+
hasRuntimeDefault: false;
|
|
123
|
+
enumValues: undefined;
|
|
124
|
+
baseColumn: never;
|
|
125
|
+
identity: undefined;
|
|
126
|
+
generated: undefined;
|
|
127
|
+
}, {}, {}>;
|
|
128
|
+
};
|
|
129
|
+
dialect: "pg";
|
|
130
|
+
}>;
|
|
3
131
|
workspaces: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
4
132
|
name: "workspaces";
|
|
5
133
|
schema: undefined;
|
|
@@ -659,6 +787,134 @@ export declare const schema: {
|
|
|
659
787
|
}>;
|
|
660
788
|
};
|
|
661
789
|
export declare function db(): NodePgDatabase<{
|
|
790
|
+
workspacesAdminCommandResults: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
791
|
+
name: "admin_command_results";
|
|
792
|
+
schema: undefined;
|
|
793
|
+
columns: {
|
|
794
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
795
|
+
name: "id";
|
|
796
|
+
tableName: "admin_command_results";
|
|
797
|
+
dataType: "string";
|
|
798
|
+
columnType: "PgUUID";
|
|
799
|
+
data: string;
|
|
800
|
+
driverParam: string;
|
|
801
|
+
notNull: true;
|
|
802
|
+
hasDefault: true;
|
|
803
|
+
isPrimaryKey: true;
|
|
804
|
+
isAutoincrement: false;
|
|
805
|
+
hasRuntimeDefault: false;
|
|
806
|
+
enumValues: undefined;
|
|
807
|
+
baseColumn: never;
|
|
808
|
+
identity: undefined;
|
|
809
|
+
generated: undefined;
|
|
810
|
+
}, {}, {}>;
|
|
811
|
+
actorId: import("drizzle-orm/pg-core").PgColumn<{
|
|
812
|
+
name: "actor_id";
|
|
813
|
+
tableName: "admin_command_results";
|
|
814
|
+
dataType: "string";
|
|
815
|
+
columnType: "PgUUID";
|
|
816
|
+
data: string;
|
|
817
|
+
driverParam: string;
|
|
818
|
+
notNull: true;
|
|
819
|
+
hasDefault: false;
|
|
820
|
+
isPrimaryKey: false;
|
|
821
|
+
isAutoincrement: false;
|
|
822
|
+
hasRuntimeDefault: false;
|
|
823
|
+
enumValues: undefined;
|
|
824
|
+
baseColumn: never;
|
|
825
|
+
identity: undefined;
|
|
826
|
+
generated: undefined;
|
|
827
|
+
}, {}, {}>;
|
|
828
|
+
idempotencyKeyFingerprint: import("drizzle-orm/pg-core").PgColumn<{
|
|
829
|
+
name: "idempotency_key_fingerprint";
|
|
830
|
+
tableName: "admin_command_results";
|
|
831
|
+
dataType: "string";
|
|
832
|
+
columnType: "PgText";
|
|
833
|
+
data: string;
|
|
834
|
+
driverParam: string;
|
|
835
|
+
notNull: true;
|
|
836
|
+
hasDefault: false;
|
|
837
|
+
isPrimaryKey: false;
|
|
838
|
+
isAutoincrement: false;
|
|
839
|
+
hasRuntimeDefault: false;
|
|
840
|
+
enumValues: [string, ...string[]];
|
|
841
|
+
baseColumn: never;
|
|
842
|
+
identity: undefined;
|
|
843
|
+
generated: undefined;
|
|
844
|
+
}, {}, {}>;
|
|
845
|
+
command: import("drizzle-orm/pg-core").PgColumn<{
|
|
846
|
+
name: "command";
|
|
847
|
+
tableName: "admin_command_results";
|
|
848
|
+
dataType: "string";
|
|
849
|
+
columnType: "PgText";
|
|
850
|
+
data: string;
|
|
851
|
+
driverParam: string;
|
|
852
|
+
notNull: true;
|
|
853
|
+
hasDefault: false;
|
|
854
|
+
isPrimaryKey: false;
|
|
855
|
+
isAutoincrement: false;
|
|
856
|
+
hasRuntimeDefault: false;
|
|
857
|
+
enumValues: [string, ...string[]];
|
|
858
|
+
baseColumn: never;
|
|
859
|
+
identity: undefined;
|
|
860
|
+
generated: undefined;
|
|
861
|
+
}, {}, {}>;
|
|
862
|
+
requestFingerprint: import("drizzle-orm/pg-core").PgColumn<{
|
|
863
|
+
name: "request_fingerprint";
|
|
864
|
+
tableName: "admin_command_results";
|
|
865
|
+
dataType: "string";
|
|
866
|
+
columnType: "PgText";
|
|
867
|
+
data: string;
|
|
868
|
+
driverParam: string;
|
|
869
|
+
notNull: true;
|
|
870
|
+
hasDefault: false;
|
|
871
|
+
isPrimaryKey: false;
|
|
872
|
+
isAutoincrement: false;
|
|
873
|
+
hasRuntimeDefault: false;
|
|
874
|
+
enumValues: [string, ...string[]];
|
|
875
|
+
baseColumn: never;
|
|
876
|
+
identity: undefined;
|
|
877
|
+
generated: undefined;
|
|
878
|
+
}, {}, {}>;
|
|
879
|
+
result: import("drizzle-orm/pg-core").PgColumn<{
|
|
880
|
+
name: "result";
|
|
881
|
+
tableName: "admin_command_results";
|
|
882
|
+
dataType: "json";
|
|
883
|
+
columnType: "PgJsonb";
|
|
884
|
+
data: import("./schema/admin-command-results.js").StoredWorkspaceAdministrationResult;
|
|
885
|
+
driverParam: unknown;
|
|
886
|
+
notNull: true;
|
|
887
|
+
hasDefault: false;
|
|
888
|
+
isPrimaryKey: false;
|
|
889
|
+
isAutoincrement: false;
|
|
890
|
+
hasRuntimeDefault: false;
|
|
891
|
+
enumValues: undefined;
|
|
892
|
+
baseColumn: never;
|
|
893
|
+
identity: undefined;
|
|
894
|
+
generated: undefined;
|
|
895
|
+
}, {}, {
|
|
896
|
+
$type: import("./schema/admin-command-results.js").StoredWorkspaceAdministrationResult;
|
|
897
|
+
}>;
|
|
898
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
899
|
+
name: "created_at";
|
|
900
|
+
tableName: "admin_command_results";
|
|
901
|
+
dataType: "date";
|
|
902
|
+
columnType: "PgTimestamp";
|
|
903
|
+
data: Date;
|
|
904
|
+
driverParam: string;
|
|
905
|
+
notNull: true;
|
|
906
|
+
hasDefault: true;
|
|
907
|
+
isPrimaryKey: false;
|
|
908
|
+
isAutoincrement: false;
|
|
909
|
+
hasRuntimeDefault: false;
|
|
910
|
+
enumValues: undefined;
|
|
911
|
+
baseColumn: never;
|
|
912
|
+
identity: undefined;
|
|
913
|
+
generated: undefined;
|
|
914
|
+
}, {}, {}>;
|
|
915
|
+
};
|
|
916
|
+
dialect: "pg";
|
|
917
|
+
}>;
|
|
662
918
|
workspaces: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
663
919
|
name: "workspaces";
|
|
664
920
|
schema: undefined;
|
package/dist/db/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAQnE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMlB,CAAC;AAIF,wBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGjB;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B"}
|
package/dist/db/db.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { drizzle } from '@shipfox/node-drizzle';
|
|
2
2
|
import { pgClient } from '@shipfox/node-postgres';
|
|
3
|
+
import { workspacesAdminCommandResults } from './schema/admin-command-results.js';
|
|
3
4
|
import { invitations } from './schema/invitations.js';
|
|
4
5
|
import { memberships } from './schema/memberships.js';
|
|
5
6
|
import { workspacesOutbox } from './schema/outbox.js';
|
|
6
7
|
import { workspaces } from './schema/workspaces.js';
|
|
7
8
|
export const schema = {
|
|
9
|
+
workspacesAdminCommandResults,
|
|
8
10
|
workspaces,
|
|
9
11
|
memberships,
|
|
10
12
|
invitations,
|
package/dist/db/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/db.ts"],"sourcesContent":["import {drizzle, type NodePgDatabase} from '@shipfox/node-drizzle';\nimport {pgClient} from '@shipfox/node-postgres';\nimport {invitations} from './schema/invitations.js';\nimport {memberships} from './schema/memberships.js';\nimport {workspacesOutbox} from './schema/outbox.js';\nimport {workspaces} from './schema/workspaces.js';\n\nexport const schema = {\n workspaces,\n memberships,\n invitations,\n workspacesOutbox,\n};\n\nlet _db: NodePgDatabase<typeof schema> | undefined;\n\nexport function db() {\n if (!_db) _db = drizzle(pgClient(), {schema});\n return _db;\n}\n\nexport function closeDb(): void {\n _db = undefined;\n}\n"],"names":["drizzle","pgClient","invitations","memberships","workspacesOutbox","workspaces","schema","_db","db","closeDb","undefined"],"mappings":"AAAA,SAAQA,OAAO,QAA4B,wBAAwB;AACnE,SAAQC,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,WAAW,QAAO,0BAA0B;AACpD,SAAQC,WAAW,QAAO,0BAA0B;AACpD,SAAQC,gBAAgB,QAAO,qBAAqB;AACpD,SAAQC,UAAU,QAAO,yBAAyB;AAElD,OAAO,MAAMC,SAAS;
|
|
1
|
+
{"version":3,"sources":["../../src/db/db.ts"],"sourcesContent":["import {drizzle, type NodePgDatabase} from '@shipfox/node-drizzle';\nimport {pgClient} from '@shipfox/node-postgres';\nimport {workspacesAdminCommandResults} from './schema/admin-command-results.js';\nimport {invitations} from './schema/invitations.js';\nimport {memberships} from './schema/memberships.js';\nimport {workspacesOutbox} from './schema/outbox.js';\nimport {workspaces} from './schema/workspaces.js';\n\nexport const schema = {\n workspacesAdminCommandResults,\n workspaces,\n memberships,\n invitations,\n workspacesOutbox,\n};\n\nlet _db: NodePgDatabase<typeof schema> | undefined;\n\nexport function db() {\n if (!_db) _db = drizzle(pgClient(), {schema});\n return _db;\n}\n\nexport function closeDb(): void {\n _db = undefined;\n}\n"],"names":["drizzle","pgClient","workspacesAdminCommandResults","invitations","memberships","workspacesOutbox","workspaces","schema","_db","db","closeDb","undefined"],"mappings":"AAAA,SAAQA,OAAO,QAA4B,wBAAwB;AACnE,SAAQC,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,6BAA6B,QAAO,oCAAoC;AAChF,SAAQC,WAAW,QAAO,0BAA0B;AACpD,SAAQC,WAAW,QAAO,0BAA0B;AACpD,SAAQC,gBAAgB,QAAO,qBAAqB;AACpD,SAAQC,UAAU,QAAO,yBAAyB;AAElD,OAAO,MAAMC,SAAS;IACpBL;IACAI;IACAF;IACAD;IACAE;AACF,EAAE;AAEF,IAAIG;AAEJ,OAAO,SAASC;IACd,IAAI,CAACD,KAAKA,MAAMR,QAAQC,YAAY;QAACM;IAAM;IAC3C,OAAOC;AACT;AAEA,OAAO,SAASE;IACdF,MAAMG;AACR"}
|
package/dist/db/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export type { CreateInvitationParams } from './invitations.js';
|
|
|
3
3
|
export { createInvitation, findInvitationByToken, listOpenInvitationsByWorkspace, revokeInvitation, } from './invitations.js';
|
|
4
4
|
export type { CreateMembershipParams, MembershipWithUser, MembershipWithWorkspace, RemoveMembershipParams, } from './memberships.js';
|
|
5
5
|
export { createMembership, findMembership, listMembershipsByUser, listMembershipsByWorkspace, removeMembership, } from './memberships.js';
|
|
6
|
+
export { workspacesAdminCommandResults } from './schema/admin-command-results.js';
|
|
6
7
|
export { workspacesOutbox } from './schema/outbox.js';
|
|
7
8
|
export type { AdminWorkspaceRow, CreateWorkspaceParams, ListAdminWorkspaceParams, ListAdminWorkspaceResult, UpdateWorkspaceParams, WorkspaceServiceMetrics, } from './workspaces.js';
|
|
8
9
|
export { createWorkspace, getWorkspaceById, getWorkspaceServiceMetrics, listAdminWorkspaces, updateWorkspace, } from './workspaces.js';
|
package/dist/db/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AAC5C,YAAY,EAAC,sBAAsB,EAAC,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,0BAA0B,EAC1B,mBAAmB,EACnB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,cAAc,QAAoE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,SAAS,CAAC;AAC5C,YAAY,EAAC,sBAAsB,EAAC,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,6BAA6B,EAAC,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,0BAA0B,EAC1B,mBAAmB,EACnB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,cAAc,QAAoE,CAAC"}
|
package/dist/db/index.js
CHANGED
|
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
3
3
|
export { closeDb, db, schema } from './db.js';
|
|
4
4
|
export { createInvitation, findInvitationByToken, listOpenInvitationsByWorkspace, revokeInvitation } from './invitations.js';
|
|
5
5
|
export { createMembership, findMembership, listMembershipsByUser, listMembershipsByWorkspace, removeMembership } from './memberships.js';
|
|
6
|
+
export { workspacesAdminCommandResults } from './schema/admin-command-results.js';
|
|
6
7
|
export { workspacesOutbox } from './schema/outbox.js';
|
|
7
8
|
export { createWorkspace, getWorkspaceById, getWorkspaceServiceMetrics, listAdminWorkspaces, updateWorkspace } from './workspaces.js';
|
|
8
9
|
export const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');
|
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {closeDb, db, schema} from './db.js';\nexport type {CreateInvitationParams} from './invitations.js';\nexport {\n createInvitation,\n findInvitationByToken,\n listOpenInvitationsByWorkspace,\n revokeInvitation,\n} from './invitations.js';\nexport type {\n CreateMembershipParams,\n MembershipWithUser,\n MembershipWithWorkspace,\n RemoveMembershipParams,\n} from './memberships.js';\nexport {\n createMembership,\n findMembership,\n listMembershipsByUser,\n listMembershipsByWorkspace,\n removeMembership,\n} from './memberships.js';\nexport {workspacesOutbox} from './schema/outbox.js';\nexport type {\n AdminWorkspaceRow,\n CreateWorkspaceParams,\n ListAdminWorkspaceParams,\n ListAdminWorkspaceResult,\n UpdateWorkspaceParams,\n WorkspaceServiceMetrics,\n} from './workspaces.js';\nexport {\n createWorkspace,\n getWorkspaceById,\n getWorkspaceServiceMetrics,\n listAdminWorkspaces,\n updateWorkspace,\n} from './workspaces.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","closeDb","db","schema","createInvitation","findInvitationByToken","listOpenInvitationsByWorkspace","revokeInvitation","createMembership","findMembership","listMembershipsByUser","listMembershipsByWorkspace","removeMembership","workspacesOutbox","createWorkspace","getWorkspaceById","getWorkspaceServiceMetrics","listAdminWorkspaces","updateWorkspace","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SAAQC,OAAO,EAAEC,EAAE,EAAEC,MAAM,QAAO,UAAU;AAE5C,SACEC,gBAAgB,EAChBC,qBAAqB,EACrBC,8BAA8B,EAC9BC,gBAAgB,QACX,mBAAmB;AAO1B,SACEC,gBAAgB,EAChBC,cAAc,EACdC,qBAAqB,EACrBC,0BAA0B,EAC1BC,gBAAgB,QACX,mBAAmB;AAC1B,SAAQC,gBAAgB,QAAO,qBAAqB;AASpD,SACEC,eAAe,EACfC,gBAAgB,EAChBC,0BAA0B,EAC1BC,mBAAmB,EACnBC,eAAe,QACV,kBAAkB;AAEzB,OAAO,MAAMC,
|
|
1
|
+
{"version":3,"sources":["../../src/db/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nexport {closeDb, db, schema} from './db.js';\nexport type {CreateInvitationParams} from './invitations.js';\nexport {\n createInvitation,\n findInvitationByToken,\n listOpenInvitationsByWorkspace,\n revokeInvitation,\n} from './invitations.js';\nexport type {\n CreateMembershipParams,\n MembershipWithUser,\n MembershipWithWorkspace,\n RemoveMembershipParams,\n} from './memberships.js';\nexport {\n createMembership,\n findMembership,\n listMembershipsByUser,\n listMembershipsByWorkspace,\n removeMembership,\n} from './memberships.js';\nexport {workspacesAdminCommandResults} from './schema/admin-command-results.js';\nexport {workspacesOutbox} from './schema/outbox.js';\nexport type {\n AdminWorkspaceRow,\n CreateWorkspaceParams,\n ListAdminWorkspaceParams,\n ListAdminWorkspaceResult,\n UpdateWorkspaceParams,\n WorkspaceServiceMetrics,\n} from './workspaces.js';\nexport {\n createWorkspace,\n getWorkspaceById,\n getWorkspaceServiceMetrics,\n listAdminWorkspaces,\n updateWorkspace,\n} from './workspaces.js';\n\nexport const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');\n"],"names":["dirname","resolve","fileURLToPath","closeDb","db","schema","createInvitation","findInvitationByToken","listOpenInvitationsByWorkspace","revokeInvitation","createMembership","findMembership","listMembershipsByUser","listMembershipsByWorkspace","removeMembership","workspacesAdminCommandResults","workspacesOutbox","createWorkspace","getWorkspaceById","getWorkspaceServiceMetrics","listAdminWorkspaces","updateWorkspace","migrationsPath","url"],"mappings":"AAAA,SAAQA,OAAO,EAAEC,OAAO,QAAO,YAAY;AAC3C,SAAQC,aAAa,QAAO,WAAW;AAEvC,SAAQC,OAAO,EAAEC,EAAE,EAAEC,MAAM,QAAO,UAAU;AAE5C,SACEC,gBAAgB,EAChBC,qBAAqB,EACrBC,8BAA8B,EAC9BC,gBAAgB,QACX,mBAAmB;AAO1B,SACEC,gBAAgB,EAChBC,cAAc,EACdC,qBAAqB,EACrBC,0BAA0B,EAC1BC,gBAAgB,QACX,mBAAmB;AAC1B,SAAQC,6BAA6B,QAAO,oCAAoC;AAChF,SAAQC,gBAAgB,QAAO,qBAAqB;AASpD,SACEC,eAAe,EACfC,gBAAgB,EAChBC,0BAA0B,EAC1BC,mBAAmB,EACnBC,eAAe,QACV,kBAAkB;AAEzB,OAAO,MAAMC,iBAAiBrB,QAAQD,QAAQE,cAAc,YAAYqB,GAAG,IAAI,iBAAiB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
export interface StoredWorkspaceAdministrationResult {
|
|
2
|
+
workspaceId: string;
|
|
3
|
+
status: 'active' | 'suspended';
|
|
4
|
+
correlationId: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const workspacesAdminCommandResults: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
7
|
+
name: "admin_command_results";
|
|
8
|
+
schema: undefined;
|
|
9
|
+
columns: {
|
|
10
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
11
|
+
name: "id";
|
|
12
|
+
tableName: "admin_command_results";
|
|
13
|
+
dataType: "string";
|
|
14
|
+
columnType: "PgUUID";
|
|
15
|
+
data: string;
|
|
16
|
+
driverParam: string;
|
|
17
|
+
notNull: true;
|
|
18
|
+
hasDefault: true;
|
|
19
|
+
isPrimaryKey: true;
|
|
20
|
+
isAutoincrement: false;
|
|
21
|
+
hasRuntimeDefault: false;
|
|
22
|
+
enumValues: undefined;
|
|
23
|
+
baseColumn: never;
|
|
24
|
+
identity: undefined;
|
|
25
|
+
generated: undefined;
|
|
26
|
+
}, {}, {}>;
|
|
27
|
+
actorId: import("drizzle-orm/pg-core").PgColumn<{
|
|
28
|
+
name: "actor_id";
|
|
29
|
+
tableName: "admin_command_results";
|
|
30
|
+
dataType: "string";
|
|
31
|
+
columnType: "PgUUID";
|
|
32
|
+
data: string;
|
|
33
|
+
driverParam: string;
|
|
34
|
+
notNull: true;
|
|
35
|
+
hasDefault: false;
|
|
36
|
+
isPrimaryKey: false;
|
|
37
|
+
isAutoincrement: false;
|
|
38
|
+
hasRuntimeDefault: false;
|
|
39
|
+
enumValues: undefined;
|
|
40
|
+
baseColumn: never;
|
|
41
|
+
identity: undefined;
|
|
42
|
+
generated: undefined;
|
|
43
|
+
}, {}, {}>;
|
|
44
|
+
idempotencyKeyFingerprint: import("drizzle-orm/pg-core").PgColumn<{
|
|
45
|
+
name: "idempotency_key_fingerprint";
|
|
46
|
+
tableName: "admin_command_results";
|
|
47
|
+
dataType: "string";
|
|
48
|
+
columnType: "PgText";
|
|
49
|
+
data: string;
|
|
50
|
+
driverParam: string;
|
|
51
|
+
notNull: true;
|
|
52
|
+
hasDefault: false;
|
|
53
|
+
isPrimaryKey: false;
|
|
54
|
+
isAutoincrement: false;
|
|
55
|
+
hasRuntimeDefault: false;
|
|
56
|
+
enumValues: [string, ...string[]];
|
|
57
|
+
baseColumn: never;
|
|
58
|
+
identity: undefined;
|
|
59
|
+
generated: undefined;
|
|
60
|
+
}, {}, {}>;
|
|
61
|
+
command: import("drizzle-orm/pg-core").PgColumn<{
|
|
62
|
+
name: "command";
|
|
63
|
+
tableName: "admin_command_results";
|
|
64
|
+
dataType: "string";
|
|
65
|
+
columnType: "PgText";
|
|
66
|
+
data: string;
|
|
67
|
+
driverParam: string;
|
|
68
|
+
notNull: true;
|
|
69
|
+
hasDefault: false;
|
|
70
|
+
isPrimaryKey: false;
|
|
71
|
+
isAutoincrement: false;
|
|
72
|
+
hasRuntimeDefault: false;
|
|
73
|
+
enumValues: [string, ...string[]];
|
|
74
|
+
baseColumn: never;
|
|
75
|
+
identity: undefined;
|
|
76
|
+
generated: undefined;
|
|
77
|
+
}, {}, {}>;
|
|
78
|
+
requestFingerprint: import("drizzle-orm/pg-core").PgColumn<{
|
|
79
|
+
name: "request_fingerprint";
|
|
80
|
+
tableName: "admin_command_results";
|
|
81
|
+
dataType: "string";
|
|
82
|
+
columnType: "PgText";
|
|
83
|
+
data: string;
|
|
84
|
+
driverParam: string;
|
|
85
|
+
notNull: true;
|
|
86
|
+
hasDefault: false;
|
|
87
|
+
isPrimaryKey: false;
|
|
88
|
+
isAutoincrement: false;
|
|
89
|
+
hasRuntimeDefault: false;
|
|
90
|
+
enumValues: [string, ...string[]];
|
|
91
|
+
baseColumn: never;
|
|
92
|
+
identity: undefined;
|
|
93
|
+
generated: undefined;
|
|
94
|
+
}, {}, {}>;
|
|
95
|
+
result: import("drizzle-orm/pg-core").PgColumn<{
|
|
96
|
+
name: "result";
|
|
97
|
+
tableName: "admin_command_results";
|
|
98
|
+
dataType: "json";
|
|
99
|
+
columnType: "PgJsonb";
|
|
100
|
+
data: StoredWorkspaceAdministrationResult;
|
|
101
|
+
driverParam: unknown;
|
|
102
|
+
notNull: true;
|
|
103
|
+
hasDefault: false;
|
|
104
|
+
isPrimaryKey: false;
|
|
105
|
+
isAutoincrement: false;
|
|
106
|
+
hasRuntimeDefault: false;
|
|
107
|
+
enumValues: undefined;
|
|
108
|
+
baseColumn: never;
|
|
109
|
+
identity: undefined;
|
|
110
|
+
generated: undefined;
|
|
111
|
+
}, {}, {
|
|
112
|
+
$type: StoredWorkspaceAdministrationResult;
|
|
113
|
+
}>;
|
|
114
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
115
|
+
name: "created_at";
|
|
116
|
+
tableName: "admin_command_results";
|
|
117
|
+
dataType: "date";
|
|
118
|
+
columnType: "PgTimestamp";
|
|
119
|
+
data: Date;
|
|
120
|
+
driverParam: string;
|
|
121
|
+
notNull: true;
|
|
122
|
+
hasDefault: true;
|
|
123
|
+
isPrimaryKey: false;
|
|
124
|
+
isAutoincrement: false;
|
|
125
|
+
hasRuntimeDefault: false;
|
|
126
|
+
enumValues: undefined;
|
|
127
|
+
baseColumn: never;
|
|
128
|
+
identity: undefined;
|
|
129
|
+
generated: undefined;
|
|
130
|
+
}, {}, {}>;
|
|
131
|
+
};
|
|
132
|
+
dialect: "pg";
|
|
133
|
+
}>;
|
|
134
|
+
export type WorkspaceAdminCommandResultDb = typeof workspacesAdminCommandResults.$inferSelect;
|
|
135
|
+
//# sourceMappingURL=admin-command-results.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-command-results.d.ts","sourceRoot":"","sources":["../../../src/db/schema/admin-command-results.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mCAAmC;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBzC,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,OAAO,6BAA6B,CAAC,YAAY,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { uuidv7PrimaryKey } from '@shipfox/node-drizzle';
|
|
2
|
+
import { jsonb, text, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
|
|
3
|
+
import { pgTable } from './common.js';
|
|
4
|
+
export const workspacesAdminCommandResults = pgTable('admin_command_results', {
|
|
5
|
+
id: uuidv7PrimaryKey(),
|
|
6
|
+
actorId: uuid('actor_id').notNull(),
|
|
7
|
+
idempotencyKeyFingerprint: text('idempotency_key_fingerprint').notNull(),
|
|
8
|
+
command: text('command').notNull(),
|
|
9
|
+
requestFingerprint: text('request_fingerprint').notNull(),
|
|
10
|
+
result: jsonb('result').$type().notNull(),
|
|
11
|
+
createdAt: timestamp('created_at', {
|
|
12
|
+
withTimezone: true
|
|
13
|
+
}).notNull().defaultNow()
|
|
14
|
+
}, (table)=>[
|
|
15
|
+
uniqueIndex('workspaces_admin_command_results_actor_key_unique').on(table.actorId, table.idempotencyKeyFingerprint)
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=admin-command-results.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/db/schema/admin-command-results.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {jsonb, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport {pgTable} from './common.js';\n\nexport interface StoredWorkspaceAdministrationResult {\n workspaceId: string;\n status: 'active' | 'suspended';\n correlationId: string;\n}\n\nexport const workspacesAdminCommandResults = pgTable(\n 'admin_command_results',\n {\n id: uuidv7PrimaryKey(),\n actorId: uuid('actor_id').notNull(),\n idempotencyKeyFingerprint: text('idempotency_key_fingerprint').notNull(),\n command: text('command').notNull(),\n requestFingerprint: text('request_fingerprint').notNull(),\n result: jsonb('result').$type<StoredWorkspaceAdministrationResult>().notNull(),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('workspaces_admin_command_results_actor_key_unique').on(\n table.actorId,\n table.idempotencyKeyFingerprint,\n ),\n ],\n);\n\nexport type WorkspaceAdminCommandResultDb = typeof workspacesAdminCommandResults.$inferSelect;\n"],"names":["uuidv7PrimaryKey","jsonb","text","timestamp","uniqueIndex","uuid","pgTable","workspacesAdminCommandResults","id","actorId","notNull","idempotencyKeyFingerprint","command","requestFingerprint","result","$type","createdAt","withTimezone","defaultNow","table","on"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,KAAK,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AAC9E,SAAQC,OAAO,QAAO,cAAc;AAQpC,OAAO,MAAMC,gCAAgCD,QAC3C,yBACA;IACEE,IAAIR;IACJS,SAASJ,KAAK,YAAYK,OAAO;IACjCC,2BAA2BT,KAAK,+BAA+BQ,OAAO;IACtEE,SAASV,KAAK,WAAWQ,OAAO;IAChCG,oBAAoBX,KAAK,uBAAuBQ,OAAO;IACvDI,QAAQb,MAAM,UAAUc,KAAK,GAAwCL,OAAO;IAC5EM,WAAWb,UAAU,cAAc;QAACc,cAAc;IAAI,GAAGP,OAAO,GAAGQ,UAAU;AAC/E,GACA,CAACC,QAAU;QACTf,YAAY,qDAAqDgB,EAAE,CACjED,MAAMV,OAAO,EACbU,MAAMR,yBAAyB;KAElC,EACD"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,oCAAoC,CAAC;AAE9E,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wCAAwC,CAAC;AACjF,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAMpF,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AASxD,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,EACL,yBAAyB,EACzB,wBAAwB,EACxB,sCAAsC,EACtC,KAAK,iCAAiC,GACvC,MAAM,sBAAsB,CAAC;AAC9B,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,sBAAsB,EAAE,gBAAgB,IAAI,MAAM,EAAC,MAAM,+BAA+B,CAAC;AAQjG,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,OAAO,EAAE,wBAAwB,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa,CAkBtF;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,EAAE,aAgB9B,CAAC"}
|