@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.
Files changed (98) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +33 -0
  3. package/README.md +7 -1
  4. package/dist/core/admin-workspaces.d.ts +16 -0
  5. package/dist/core/admin-workspaces.d.ts.map +1 -1
  6. package/dist/core/admin-workspaces.js +52 -0
  7. package/dist/core/admin-workspaces.js.map +1 -1
  8. package/dist/core/errors.d.ts +12 -0
  9. package/dist/core/errors.d.ts.map +1 -1
  10. package/dist/core/errors.js +24 -0
  11. package/dist/core/errors.js.map +1 -1
  12. package/dist/core/index.d.ts +2 -2
  13. package/dist/core/index.d.ts.map +1 -1
  14. package/dist/core/index.js +2 -2
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/core/invitations.d.ts.map +1 -1
  17. package/dist/core/invitations.js +6 -3
  18. package/dist/core/invitations.js.map +1 -1
  19. package/dist/core/workspaces.d.ts +1 -0
  20. package/dist/core/workspaces.d.ts.map +1 -1
  21. package/dist/core/workspaces.js +5 -3
  22. package/dist/core/workspaces.js.map +1 -1
  23. package/dist/db/admin-workspace-commands.d.ts +17 -0
  24. package/dist/db/admin-workspace-commands.d.ts.map +1 -0
  25. package/dist/db/admin-workspace-commands.js +86 -0
  26. package/dist/db/admin-workspace-commands.js.map +1 -0
  27. package/dist/db/db.d.ts +256 -0
  28. package/dist/db/db.d.ts.map +1 -1
  29. package/dist/db/db.js +2 -0
  30. package/dist/db/db.js.map +1 -1
  31. package/dist/db/index.d.ts +1 -0
  32. package/dist/db/index.d.ts.map +1 -1
  33. package/dist/db/index.js +1 -0
  34. package/dist/db/index.js.map +1 -1
  35. package/dist/db/schema/admin-command-results.d.ts +135 -0
  36. package/dist/db/schema/admin-command-results.d.ts.map +1 -0
  37. package/dist/db/schema/admin-command-results.js +18 -0
  38. package/dist/db/schema/admin-command-results.js.map +1 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +7 -2
  41. package/dist/index.js.map +1 -1
  42. package/dist/presentation/inter-module.d.ts.map +1 -1
  43. package/dist/presentation/inter-module.js +3 -2
  44. package/dist/presentation/inter-module.js.map +1 -1
  45. package/dist/presentation/routes/admin-workspaces.d.ts.map +1 -1
  46. package/dist/presentation/routes/admin-workspaces.js +119 -14
  47. package/dist/presentation/routes/admin-workspaces.js.map +1 -1
  48. package/dist/presentation/routes/invitations/create.d.ts.map +1 -1
  49. package/dist/presentation/routes/invitations/create.js +5 -1
  50. package/dist/presentation/routes/invitations/create.js.map +1 -1
  51. package/dist/presentation/routes/invitations/list.d.ts.map +1 -1
  52. package/dist/presentation/routes/invitations/list.js +5 -1
  53. package/dist/presentation/routes/invitations/list.js.map +1 -1
  54. package/dist/presentation/routes/invitations/revoke.d.ts.map +1 -1
  55. package/dist/presentation/routes/invitations/revoke.js +5 -1
  56. package/dist/presentation/routes/invitations/revoke.js.map +1 -1
  57. package/dist/presentation/routes/members/list.d.ts.map +1 -1
  58. package/dist/presentation/routes/members/list.js +5 -1
  59. package/dist/presentation/routes/members/list.js.map +1 -1
  60. package/dist/presentation/routes/members/remove.d.ts.map +1 -1
  61. package/dist/presentation/routes/members/remove.js +5 -1
  62. package/dist/presentation/routes/members/remove.js.map +1 -1
  63. package/dist/tsconfig.test.tsbuildinfo +1 -1
  64. package/drizzle/0002_wide_enchantress.sql +11 -0
  65. package/drizzle/meta/0002_snapshot.json +555 -0
  66. package/drizzle/meta/_journal.json +7 -0
  67. package/package.json +6 -6
  68. package/src/core/admin-workspaces.ts +102 -0
  69. package/src/core/errors.ts +28 -0
  70. package/src/core/index.ts +8 -0
  71. package/src/core/invitations.test.ts +8 -8
  72. package/src/core/invitations.ts +3 -0
  73. package/src/core/workspaces.test.ts +22 -3
  74. package/src/core/workspaces.ts +4 -1
  75. package/src/db/admin-workspace-commands.ts +169 -0
  76. package/src/db/db.ts +2 -0
  77. package/src/db/index.ts +1 -0
  78. package/src/db/schema/admin-command-results.ts +30 -0
  79. package/src/index.test.ts +3 -1
  80. package/src/index.ts +17 -2
  81. package/src/presentation/inter-module.test.ts +51 -0
  82. package/src/presentation/inter-module.ts +7 -4
  83. package/src/presentation/routes/admin-workspaces.test.ts +273 -3
  84. package/src/presentation/routes/admin-workspaces.ts +143 -13
  85. package/src/presentation/routes/invitations/create.test.ts +15 -0
  86. package/src/presentation/routes/invitations/create.ts +2 -1
  87. package/src/presentation/routes/invitations/list.test.ts +30 -0
  88. package/src/presentation/routes/invitations/list.ts +2 -1
  89. package/src/presentation/routes/invitations/revoke.test.ts +14 -0
  90. package/src/presentation/routes/invitations/revoke.ts +2 -1
  91. package/src/presentation/routes/members/list.test.ts +29 -1
  92. package/src/presentation/routes/members/list.ts +2 -1
  93. package/src/presentation/routes/members/remove.test.ts +14 -0
  94. package/src/presentation/routes/members/remove.ts +2 -1
  95. package/test/globalSetup.ts +3 -1
  96. package/test/routes.ts +8 -3
  97. package/tsconfig.build.tsbuildinfo +1 -1
  98. 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;
@@ -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;AAOnE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKlB,CAAC;AAIF,wBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGjB;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B"}
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;IACpBD;IACAF;IACAD;IACAE;AACF,EAAE;AAEF,IAAIG;AAEJ,OAAO,SAASC;IACd,IAAI,CAACD,KAAKA,MAAMP,QAAQC,YAAY;QAACK;IAAM;IAC3C,OAAOC;AACT;AAEA,OAAO,SAASE;IACdF,MAAMG;AACR"}
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"}
@@ -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';
@@ -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');
@@ -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,iBAAiBpB,QAAQD,QAAQE,cAAc,YAAYoB,GAAG,IAAI,iBAAiB"}
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"}
@@ -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;AAC9E,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;AAIjG,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,CAatF;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,EAAE,aAW9B,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"}