@credo-ts/drizzle-storage 0.6.0-pr-2324-20250708122332 → 0.6.0-pr-2324-20250708123651

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 (183) hide show
  1. package/cli-build/utils.js +4 -1
  2. package/cli-build/utils.js.map +1 -1
  3. package/package.json +15 -14
  4. package/src/DrizzleDatabase.ts +29 -0
  5. package/src/DrizzleRecord.ts +73 -0
  6. package/src/DrizzleStorageModule.ts +112 -0
  7. package/src/DrizzleStorageModuleConfig.ts +48 -0
  8. package/src/action-menu/action-menu/DrizzleDidcommActionMenuRecordAdapter.ts +46 -0
  9. package/src/action-menu/action-menu/index.ts +10 -0
  10. package/src/action-menu/action-menu/postgres.ts +31 -0
  11. package/src/action-menu/action-menu/sqlite.ts +34 -0
  12. package/src/action-menu/bundle.ts +18 -0
  13. package/src/action-menu/postgres.ts +1 -0
  14. package/src/action-menu/sqlite.ts +1 -0
  15. package/src/adapter/BaseDrizzleRecordAdapter.ts +319 -0
  16. package/src/adapter/__tests__/queryToDrizzlePostgres.test.ts +328 -0
  17. package/src/adapter/__tests__/queryToDrizzleSqlite.test.ts +324 -0
  18. package/src/adapter/index.ts +6 -0
  19. package/src/adapter/queryToDrizzlePostgres.ts +217 -0
  20. package/src/adapter/queryToDrizzleSqlite.ts +213 -0
  21. package/src/anoncreds/bundle.ts +34 -0
  22. package/src/anoncreds/credential/DrizzleAnonCredsCredentialRecordAdapter.ts +93 -0
  23. package/src/anoncreds/credential/index.ts +10 -0
  24. package/src/anoncreds/credential/postgres.ts +27 -0
  25. package/src/anoncreds/credential/sqlite.ts +27 -0
  26. package/src/anoncreds/credential-definition/DrizzleAnonCredsCredentialDefinitionRecordAdapter.ts +72 -0
  27. package/src/anoncreds/credential-definition/index.ts +10 -0
  28. package/src/anoncreds/credential-definition/postgres.ts +23 -0
  29. package/src/anoncreds/credential-definition/sqlite.ts +23 -0
  30. package/src/anoncreds/credential-definition-private/DrizzleAnonCredsCredentialDefinitionPrivateRecordAdapter.ts +48 -0
  31. package/src/anoncreds/credential-definition-private/index.ts +10 -0
  32. package/src/anoncreds/credential-definition-private/postgres.ts +14 -0
  33. package/src/anoncreds/credential-definition-private/sqlite.ts +14 -0
  34. package/src/anoncreds/key-correctness-proof/DrizzleAnonCredsKeyCorrectnessProofRecordAdapter.ts +46 -0
  35. package/src/anoncreds/key-correctness-proof/index.ts +10 -0
  36. package/src/anoncreds/key-correctness-proof/postgres.ts +13 -0
  37. package/src/anoncreds/key-correctness-proof/sqlite.ts +14 -0
  38. package/src/anoncreds/link-secret/DrizzleAnonCredsLinkSecretRecordAdapter.ts +45 -0
  39. package/src/anoncreds/link-secret/index.ts +10 -0
  40. package/src/anoncreds/link-secret/postgres.ts +18 -0
  41. package/src/anoncreds/link-secret/sqlite.ts +18 -0
  42. package/src/anoncreds/postgres.ts +8 -0
  43. package/src/anoncreds/revocation-registry-definition/DrizzleAnonCredsRevocationRegistryDefinitionRecordAdapter.ts +52 -0
  44. package/src/anoncreds/revocation-registry-definition/index.ts +10 -0
  45. package/src/anoncreds/revocation-registry-definition/postgres.ts +18 -0
  46. package/src/anoncreds/revocation-registry-definition/sqlite.ts +20 -0
  47. package/src/anoncreds/revocation-registry-definition-private/DrizzleAnonCredsRevocationRegistryDefinitionPrivateRecordAdapter.ts +53 -0
  48. package/src/anoncreds/revocation-registry-definition-private/index.ts +10 -0
  49. package/src/anoncreds/revocation-registry-definition-private/postgres.ts +22 -0
  50. package/src/anoncreds/revocation-registry-definition-private/sqlite.ts +18 -0
  51. package/src/anoncreds/schema/DrizzleAnonCredsSchemaRecordAdapter.ts +54 -0
  52. package/src/anoncreds/schema/__tests__/schema.test.ts +66 -0
  53. package/src/anoncreds/schema/index.ts +10 -0
  54. package/src/anoncreds/schema/postgres.ts +22 -0
  55. package/src/anoncreds/schema/sqlite.ts +22 -0
  56. package/src/anoncreds/sqlite.ts +8 -0
  57. package/src/applyReactNativeMigrations.ts +24 -0
  58. package/src/combineSchemas.ts +44 -0
  59. package/src/core/bundle.ts +33 -0
  60. package/src/core/context/index.ts +8 -0
  61. package/src/core/context/postgres.ts +5 -0
  62. package/src/core/context/sqlite.ts +5 -0
  63. package/src/core/did/DrizzleDidRecordAdapter.ts +71 -0
  64. package/src/core/did/index.ts +10 -0
  65. package/src/core/did/postgres.ts +28 -0
  66. package/src/core/did/sqlite.ts +26 -0
  67. package/src/core/genericRecord/DrizzleGenericRecordAdapter.ts +36 -0
  68. package/src/core/genericRecord/index.ts +10 -0
  69. package/src/core/genericRecord/postgres.ts +12 -0
  70. package/src/core/genericRecord/sqlite.ts +12 -0
  71. package/src/core/mdoc/DrizzleMdocRecordAdapter.ts +44 -0
  72. package/src/core/mdoc/index.ts +10 -0
  73. package/src/core/mdoc/postgres.ts +15 -0
  74. package/src/core/mdoc/sqlite.ts +15 -0
  75. package/src/core/postgres.ts +8 -0
  76. package/src/core/sdJwtVc/DrizzleSdJwtVcRecordAdapter.ts +46 -0
  77. package/src/core/sdJwtVc/index.ts +10 -0
  78. package/src/core/sdJwtVc/postgres.ts +17 -0
  79. package/src/core/sdJwtVc/sqlite.ts +17 -0
  80. package/src/core/singleContextLruCache/DrizzleSingleContextLruCacheRecordAdapter.ts +43 -0
  81. package/src/core/singleContextLruCache/index.ts +10 -0
  82. package/src/core/singleContextLruCache/postgres.ts +12 -0
  83. package/src/core/singleContextLruCache/sqlite.ts +13 -0
  84. package/src/core/sqlite.ts +8 -0
  85. package/src/core/storageVersion/DrizzleStorageVersionRecordAdapter.ts +36 -0
  86. package/src/core/storageVersion/index.ts +10 -0
  87. package/src/core/storageVersion/postgres.ts +13 -0
  88. package/src/core/storageVersion/sqlite.ts +13 -0
  89. package/src/core/w3cCredential/DrizzleW3cCredentialRecordAdapter.ts +95 -0
  90. package/src/core/w3cCredential/index.ts +10 -0
  91. package/src/core/w3cCredential/postgres.ts +31 -0
  92. package/src/core/w3cCredential/sqlite.ts +29 -0
  93. package/src/didcomm/basic-message/DrizzleDidcommBasicMessageRecordAdapter.ts +54 -0
  94. package/src/didcomm/basic-message/index.ts +10 -0
  95. package/src/didcomm/basic-message/postgres.ts +30 -0
  96. package/src/didcomm/basic-message/sqlite.ts +29 -0
  97. package/src/didcomm/bundle.ts +34 -0
  98. package/src/didcomm/connection/DrizzleDidcommConnectionRecordAdapter.ts +70 -0
  99. package/src/didcomm/connection/index.ts +10 -0
  100. package/src/didcomm/connection/postgres.ts +55 -0
  101. package/src/didcomm/connection/sqlite.ts +39 -0
  102. package/src/didcomm/credential-exchange/DrizzleDidcommCredentialExchangeRecordAdapter.ts +64 -0
  103. package/src/didcomm/credential-exchange/__tests__/credentialExchange.test.ts +97 -0
  104. package/src/didcomm/credential-exchange/index.ts +10 -0
  105. package/src/didcomm/credential-exchange/postgres.ts +45 -0
  106. package/src/didcomm/credential-exchange/sqlite.ts +39 -0
  107. package/src/didcomm/didcomm-message/DrizzleDidcommMessageRecordAdapter.ts +75 -0
  108. package/src/didcomm/didcomm-message/index.ts +10 -0
  109. package/src/didcomm/didcomm-message/postgres.ts +27 -0
  110. package/src/didcomm/didcomm-message/sqlite.ts +26 -0
  111. package/src/didcomm/mediation/DrizzleDidcommMediationRecordAdapter.ts +51 -0
  112. package/src/didcomm/mediation/index.ts +10 -0
  113. package/src/didcomm/mediation/postgres.ts +33 -0
  114. package/src/didcomm/mediation/sqlite.ts +31 -0
  115. package/src/didcomm/mediator-routing/DrizzleDidcommMediatorRoutingRecordAdapter.ts +49 -0
  116. package/src/didcomm/mediator-routing/index.ts +10 -0
  117. package/src/didcomm/mediator-routing/postgres.ts +14 -0
  118. package/src/didcomm/mediator-routing/sqlite.ts +17 -0
  119. package/src/didcomm/out-of-band/DrizzleDidcommOutOfBandRecordAdapter.ts +85 -0
  120. package/src/didcomm/out-of-band/__tests__/outOfBand.test.ts +84 -0
  121. package/src/didcomm/out-of-band/index.ts +10 -0
  122. package/src/didcomm/out-of-band/postgres.ts +46 -0
  123. package/src/didcomm/out-of-band/sqlite.ts +46 -0
  124. package/src/didcomm/postgres.ts +8 -0
  125. package/src/didcomm/proof-exchange/DrizzleDidcommProofExchangeRecordAdapter.ts +51 -0
  126. package/src/didcomm/proof-exchange/index.ts +10 -0
  127. package/src/didcomm/proof-exchange/postgres.ts +33 -0
  128. package/src/didcomm/proof-exchange/sqlite.ts +29 -0
  129. package/src/didcomm/sqlite.ts +8 -0
  130. package/src/drpc/bundle.ts +18 -0
  131. package/src/drpc/drpc/DrizzleDidcommDrpcRecordAdapter.ts +44 -0
  132. package/src/drpc/drpc/index.ts +10 -0
  133. package/src/drpc/drpc/postgres.ts +31 -0
  134. package/src/drpc/drpc/sqlite.ts +29 -0
  135. package/src/drpc/postgres.ts +1 -0
  136. package/src/drpc/sqlite.ts +1 -0
  137. package/src/error/CredoDrizzleColumnDoesNotExistError.ts +21 -0
  138. package/src/error/CredoDrizzleStorageError.ts +7 -0
  139. package/src/error/index.ts +2 -0
  140. package/src/index.ts +29 -0
  141. package/src/openid4vc/bundle.ts +26 -0
  142. package/src/openid4vc/openid4vc-issuance-session/DrizzleOpenId4VcIssuanceSessionRecordAdapter.ts +90 -0
  143. package/src/openid4vc/openid4vc-issuance-session/index.ts +10 -0
  144. package/src/openid4vc/openid4vc-issuance-session/postgres.ts +54 -0
  145. package/src/openid4vc/openid4vc-issuance-session/sqlite.ts +54 -0
  146. package/src/openid4vc/openid4vc-issuer/DrizzleOpenid4vcIssuerRecordAdapter.ts +50 -0
  147. package/src/openid4vc/openid4vc-issuer/index.ts +10 -0
  148. package/src/openid4vc/openid4vc-issuer/postgres.ts +31 -0
  149. package/src/openid4vc/openid4vc-issuer/sqlite.ts +40 -0
  150. package/src/openid4vc/openid4vc-verification-session/DrizzleOpenId4VcVerificationSessionRecordAdapter.ts +62 -0
  151. package/src/openid4vc/openid4vc-verification-session/index.ts +10 -0
  152. package/src/openid4vc/openid4vc-verification-session/postgres.ts +46 -0
  153. package/src/openid4vc/openid4vc-verification-session/sqlite.ts +40 -0
  154. package/src/openid4vc/openid4vc-verifier/DrizzleOpenid4vcVerifierRecordAdapter.ts +43 -0
  155. package/src/openid4vc/openid4vc-verifier/index.ts +10 -0
  156. package/src/openid4vc/openid4vc-verifier/postgres.ts +14 -0
  157. package/src/openid4vc/openid4vc-verifier/sqlite.ts +19 -0
  158. package/src/openid4vc/postgres.ts +4 -0
  159. package/src/openid4vc/sqlite.ts +4 -0
  160. package/src/postgres/baseRecord.ts +44 -0
  161. package/src/postgres/index.ts +1 -0
  162. package/src/question-answer/bundle.ts +18 -0
  163. package/src/question-answer/postgres.ts +1 -0
  164. package/src/question-answer/question-answer/DrizzleDidcommQuestionAnswerRecordAdapter.ts +52 -0
  165. package/src/question-answer/question-answer/index.ts +10 -0
  166. package/src/question-answer/question-answer/postgres.ts +34 -0
  167. package/src/question-answer/question-answer/sqlite.ts +32 -0
  168. package/src/question-answer/sqlite.ts +1 -0
  169. package/src/sqlite/baseRecord.ts +38 -0
  170. package/src/sqlite/index.ts +1 -0
  171. package/src/storage/DrizzleStorageService.ts +87 -0
  172. package/src/storage/index.ts +1 -0
  173. package/src/tenants/bundle.ts +19 -0
  174. package/src/tenants/postgres.ts +2 -0
  175. package/src/tenants/sqlite.ts +2 -0
  176. package/src/tenants/tenant/DrizzleTenantRecordAdapter.ts +45 -0
  177. package/src/tenants/tenant/index.ts +10 -0
  178. package/src/tenants/tenant/postgres.ts +16 -0
  179. package/src/tenants/tenant/sqlite.ts +16 -0
  180. package/src/tenants/tenant-routing/DrizzleTenantRoutingRecordAdapter.ts +44 -0
  181. package/src/tenants/tenant-routing/index.ts +10 -0
  182. package/src/tenants/tenant-routing/postgres.ts +20 -0
  183. package/src/tenants/tenant-routing/sqlite.ts +20 -0
@@ -0,0 +1,38 @@
1
+ import { SQLiteColumn, foreignKey, integer, primaryKey, text } from 'drizzle-orm/sqlite-core'
2
+ import { context } from '../core/context/sqlite'
3
+
4
+ export const getSqliteBaseRecordTable = () =>
5
+ ({
6
+ contextCorrelationId: text('context_correlation_id').notNull(),
7
+
8
+ id: text().notNull(),
9
+
10
+ // createdAt is set in credo, to avoid having to query the
11
+ // value from the database after creation
12
+ createdAt: integer('created_at', { mode: 'timestamp_ms' }).notNull(),
13
+
14
+ // updatedAt is updated in credo, to avoid having to query the updated
15
+ // value from the database after an update
16
+ updatedAt: integer('updated_at', { mode: 'timestamp_ms' }).notNull(),
17
+
18
+ metadata: text({ mode: 'json' }).$type<Record<string, Record<string, unknown> | undefined>>(),
19
+ customTags: text('custom_tags', { mode: 'json' }).$type<
20
+ Record<string, string | number | undefined | boolean | null | string[]>
21
+ >(),
22
+ }) as const
23
+
24
+ // Define common base indexes that all tables should have
25
+ export const sqliteBaseRecordIndexes = <
26
+ // biome-ignore lint/suspicious/noExplicitAny: <explanation>
27
+ Table extends { contextCorrelationId: SQLiteColumn<any>; id: SQLiteColumn<any> },
28
+ >(
29
+ table: Table,
30
+ tableName: string
31
+ ) => [
32
+ primaryKey({ columns: [table.contextCorrelationId, table.id], name: `${tableName}_pk` }),
33
+ foreignKey({
34
+ columns: [table.contextCorrelationId],
35
+ foreignColumns: [context.contextCorrelationId],
36
+ name: `${tableName}_fk_context`,
37
+ }).onDelete('cascade'),
38
+ ]
@@ -0,0 +1 @@
1
+ export { getSqliteBaseRecordTable, sqliteBaseRecordIndexes } from './baseRecord'
@@ -0,0 +1,87 @@
1
+ import type {
2
+ AgentContext,
3
+ BaseRecord,
4
+ BaseRecordConstructor,
5
+ Query,
6
+ QueryOptions,
7
+ StorageService,
8
+ } from '@credo-ts/core'
9
+ import { injectable } from '@credo-ts/core'
10
+ import { DrizzleStorageModuleConfig } from '../DrizzleStorageModuleConfig'
11
+ import { BaseDrizzleRecordAdapter } from '../adapter/BaseDrizzleRecordAdapter'
12
+ import { CredoDrizzleStorageError } from '../error/CredoDrizzleStorageError'
13
+
14
+ @injectable()
15
+ export class DrizzleStorageService<T extends BaseRecord> implements StorageService<T> {
16
+ public constructor(public config: DrizzleStorageModuleConfig) {}
17
+
18
+ private getAdapterForRecordType(recordType: string) {
19
+ const adapter = this.config.adapters.find((adapter) => adapter.recordType === recordType)
20
+ if (!adapter) {
21
+ throw new CredoDrizzleStorageError(
22
+ `Could not find a registered drizzle adapter for record type '${recordType}'. Make sure to register the record type in the DrizzleStorageModule.`
23
+ )
24
+ }
25
+
26
+ // biome-ignore lint/suspicious/noExplicitAny: <explanation>
27
+ return adapter as BaseDrizzleRecordAdapter<T, any, any, any, any>
28
+ }
29
+
30
+ public async save(agentContext: AgentContext, record: T): Promise<void> {
31
+ record.createdAt = record.createdAt ?? new Date()
32
+ record.updatedAt = record.createdAt
33
+
34
+ const adapter = this.getAdapterForRecordType(record.type)
35
+
36
+ // TOOD: duplicate
37
+ await adapter.insert(agentContext, record)
38
+ }
39
+
40
+ public async update(agentContext: AgentContext, record: T): Promise<void> {
41
+ record.updatedAt = new Date()
42
+
43
+ const adapter = this.getAdapterForRecordType(record.type)
44
+ await adapter.update(agentContext, record)
45
+ }
46
+
47
+ public async delete(agentContext: AgentContext, record: T): Promise<void> {
48
+ const adapter = this.getAdapterForRecordType(record.type)
49
+ await adapter.delete(agentContext, record.id)
50
+ }
51
+
52
+ public async deleteById(
53
+ agentContext: AgentContext,
54
+ recordClass: BaseRecordConstructor<T>,
55
+ id: string
56
+ ): Promise<void> {
57
+ const adapter = this.getAdapterForRecordType(recordClass.type)
58
+
59
+ await adapter.delete(agentContext, id)
60
+ }
61
+
62
+ public async getById(agentContext: AgentContext, recordClass: BaseRecordConstructor<T>, id: string): Promise<T> {
63
+ const adapter = this.getAdapterForRecordType(recordClass.type)
64
+
65
+ const record = await adapter.getById(agentContext, id)
66
+ return record
67
+ }
68
+
69
+ public async getAll(agentContext: AgentContext, recordClass: BaseRecordConstructor<T>): Promise<T[]> {
70
+ const adapter = this.getAdapterForRecordType(recordClass.type)
71
+
72
+ const records = await adapter.query(agentContext)
73
+ return records
74
+ }
75
+
76
+ public async findByQuery(
77
+ agentContext: AgentContext,
78
+ recordClass: BaseRecordConstructor<T>,
79
+ query: Query<T>,
80
+ queryOptions?: QueryOptions
81
+ ): Promise<T[]> {
82
+ const adapter = this.getAdapterForRecordType(recordClass.type)
83
+
84
+ const records = await adapter.query(agentContext, query, queryOptions)
85
+ return records
86
+ }
87
+ }
@@ -0,0 +1 @@
1
+ export * from './DrizzleStorageService'
@@ -0,0 +1,19 @@
1
+ import { DrizzleRecordBundle } from '../DrizzleRecord'
2
+ import { tenantDrizzleRecord } from './tenant'
3
+ import { tenantRoutingDrizzleRecord } from './tenant-routing'
4
+
5
+ export default {
6
+ name: 'tenants',
7
+ records: [tenantDrizzleRecord, tenantRoutingDrizzleRecord],
8
+
9
+ migrations: {
10
+ postgres: {
11
+ schemaModule: '@credo-ts/drizzle-storage/tenants/postgres',
12
+ migrationsPath: '../../migrations/tenants/postgres',
13
+ },
14
+ sqlite: {
15
+ schemaModule: '@credo-ts/drizzle-storage/tenants/sqlite',
16
+ migrationsPath: '../../migrations/tenants/sqlite',
17
+ },
18
+ },
19
+ } as const satisfies DrizzleRecordBundle
@@ -0,0 +1,2 @@
1
+ export * from './tenant/postgres'
2
+ export * from './tenant-routing/postgres'
@@ -0,0 +1,2 @@
1
+ export * from './tenant/sqlite'
2
+ export * from './tenant-routing/sqlite'
@@ -0,0 +1,45 @@
1
+ import { JsonTransformer, TagsBase } from '@credo-ts/core'
2
+
3
+ import {
4
+ BaseDrizzleRecordAdapter,
5
+ DrizzleAdapterRecordValues,
6
+ DrizzleAdapterValues,
7
+ } from '../../adapter/BaseDrizzleRecordAdapter'
8
+
9
+ import { TenantRecord } from '@credo-ts/tenants'
10
+ import { DrizzleDatabase } from '../../DrizzleDatabase'
11
+ import * as postgres from './postgres'
12
+ import * as sqlite from './sqlite'
13
+
14
+ type DrizzleTenantAdapterValues = DrizzleAdapterRecordValues<(typeof sqlite)['tenant']>
15
+ export class DrizzleTenantRecordAdapter extends BaseDrizzleRecordAdapter<
16
+ TenantRecord,
17
+ typeof postgres.tenant,
18
+ typeof postgres,
19
+ typeof sqlite.tenant,
20
+ typeof sqlite
21
+ > {
22
+ public constructor(database: DrizzleDatabase<typeof postgres, typeof sqlite>) {
23
+ super(database, { postgres: postgres.tenant, sqlite: sqlite.tenant }, 'TenantRecord')
24
+ }
25
+
26
+ public getValues(record: TenantRecord): DrizzleAdapterValues<(typeof sqlite)['tenant']> {
27
+ const { label, storageVersion, ...customTags } = record.getTags()
28
+
29
+ return {
30
+ label,
31
+ storageVersion,
32
+ config: record.config,
33
+ customTags,
34
+ }
35
+ }
36
+
37
+ public toRecord(values: DrizzleTenantAdapterValues): TenantRecord {
38
+ const { customTags, ...remainingValues } = values
39
+
40
+ const record = JsonTransformer.fromJSON(remainingValues, TenantRecord)
41
+ if (customTags) record.setTags(customTags as TagsBase)
42
+
43
+ return record
44
+ }
45
+ }
@@ -0,0 +1,10 @@
1
+ import { DrizzleRecord } from '../../DrizzleRecord'
2
+ import { DrizzleTenantRecordAdapter } from './DrizzleTenantRecordAdapter'
3
+ import * as postgres from './postgres'
4
+ import * as sqlite from './sqlite'
5
+
6
+ export const tenantDrizzleRecord = {
7
+ adapter: DrizzleTenantRecordAdapter,
8
+ postgres,
9
+ sqlite,
10
+ } satisfies DrizzleRecord
@@ -0,0 +1,16 @@
1
+ import { VersionString } from '@credo-ts/core'
2
+ import { TenantRecord } from '@credo-ts/tenants'
3
+ import { jsonb, pgTable, text } from 'drizzle-orm/pg-core'
4
+ import { getPostgresBaseRecordTable, postgresBaseRecordIndexes } from '../../postgres/baseRecord'
5
+
6
+ export const tenant = pgTable(
7
+ 'Tenant',
8
+ {
9
+ ...getPostgresBaseRecordTable(),
10
+
11
+ storageVersion: text('storage_version').$type<VersionString>(),
12
+ config: jsonb().$type<TenantRecord['config']>().notNull(),
13
+ label: text().notNull(),
14
+ },
15
+ (table) => postgresBaseRecordIndexes(table, 'tenant')
16
+ )
@@ -0,0 +1,16 @@
1
+ import { VersionString } from '@credo-ts/core'
2
+ import { TenantRecord } from '@credo-ts/tenants'
3
+ import { sqliteTable, text } from 'drizzle-orm/sqlite-core'
4
+ import { getSqliteBaseRecordTable, sqliteBaseRecordIndexes } from '../../sqlite/baseRecord'
5
+
6
+ export const tenant = sqliteTable(
7
+ 'Tenant',
8
+ {
9
+ ...getSqliteBaseRecordTable(),
10
+
11
+ storageVersion: text('storage_version').$type<VersionString>(),
12
+ config: text({ mode: 'json' }).$type<TenantRecord['config']>().notNull(),
13
+ label: text().notNull(),
14
+ },
15
+ (table) => sqliteBaseRecordIndexes(table, 'tenant')
16
+ )
@@ -0,0 +1,44 @@
1
+ import { JsonTransformer, TagsBase } from '@credo-ts/core'
2
+
3
+ import {
4
+ BaseDrizzleRecordAdapter,
5
+ DrizzleAdapterRecordValues,
6
+ DrizzleAdapterValues,
7
+ } from '../../adapter/BaseDrizzleRecordAdapter'
8
+
9
+ import { TenantRoutingRecord } from '@credo-ts/tenants'
10
+ import { DrizzleDatabase } from '../../DrizzleDatabase'
11
+ import * as postgres from './postgres'
12
+ import * as sqlite from './sqlite'
13
+
14
+ type DrizzleTenantRoutingAdapterValues = DrizzleAdapterRecordValues<(typeof sqlite)['tenantRouting']>
15
+ export class DrizzleTenantRoutingRecordAdapter extends BaseDrizzleRecordAdapter<
16
+ TenantRoutingRecord,
17
+ typeof postgres.tenantRouting,
18
+ typeof postgres,
19
+ typeof sqlite.tenantRouting,
20
+ typeof sqlite
21
+ > {
22
+ public constructor(database: DrizzleDatabase<typeof postgres, typeof sqlite>) {
23
+ super(database, { postgres: postgres.tenantRouting, sqlite: sqlite.tenantRouting }, 'TenantRoutingRecord')
24
+ }
25
+
26
+ public getValues(record: TenantRoutingRecord): DrizzleAdapterValues<(typeof sqlite)['tenantRouting']> {
27
+ const { recipientKeyFingerprint, tenantId, ...customTags } = record.getTags()
28
+
29
+ return {
30
+ recipientKeyFingerprint,
31
+ tenantId,
32
+ customTags,
33
+ }
34
+ }
35
+
36
+ public toRecord(values: DrizzleTenantRoutingAdapterValues): TenantRoutingRecord {
37
+ const { customTags, ...remainingValues } = values
38
+
39
+ const record = JsonTransformer.fromJSON(remainingValues, TenantRoutingRecord)
40
+ if (customTags) record.setTags(customTags as TagsBase)
41
+
42
+ return record
43
+ }
44
+ }
@@ -0,0 +1,10 @@
1
+ import { DrizzleRecord } from '../../DrizzleRecord'
2
+ import { DrizzleTenantRoutingRecordAdapter } from './DrizzleTenantRoutingRecordAdapter'
3
+ import * as postgres from './postgres'
4
+ import * as sqlite from './sqlite'
5
+
6
+ export const tenantRoutingDrizzleRecord = {
7
+ adapter: DrizzleTenantRoutingRecordAdapter,
8
+ postgres,
9
+ sqlite,
10
+ } satisfies DrizzleRecord
@@ -0,0 +1,20 @@
1
+ import { foreignKey, pgTable, text } from 'drizzle-orm/pg-core'
2
+ import { getPostgresBaseRecordTable, postgresBaseRecordIndexes } from '../../postgres/baseRecord'
3
+ import { tenant } from '../postgres'
4
+
5
+ export const tenantRouting = pgTable(
6
+ 'TenantRouting',
7
+ {
8
+ ...getPostgresBaseRecordTable(),
9
+
10
+ tenantId: text('tenant_id').notNull(),
11
+ recipientKeyFingerprint: text('recipient_key_fingerprint').notNull(),
12
+ },
13
+ (table) => [
14
+ ...postgresBaseRecordIndexes(table, 'tenantRouting'),
15
+ foreignKey({
16
+ columns: [table.tenantId, table.contextCorrelationId],
17
+ foreignColumns: [tenant.id, tenant.contextCorrelationId],
18
+ }).onDelete('cascade'),
19
+ ]
20
+ )
@@ -0,0 +1,20 @@
1
+ import { foreignKey, sqliteTable, text } from 'drizzle-orm/sqlite-core'
2
+ import { getSqliteBaseRecordTable, sqliteBaseRecordIndexes } from '../../sqlite/baseRecord'
3
+ import { tenant } from '../sqlite'
4
+
5
+ export const tenantRouting = sqliteTable(
6
+ 'TenantRouting',
7
+ {
8
+ ...getSqliteBaseRecordTable(),
9
+
10
+ tenantId: text('tenant_id').notNull(),
11
+ recipientKeyFingerprint: text('recipient_key_fingerprint').notNull(),
12
+ },
13
+ (table) => [
14
+ ...sqliteBaseRecordIndexes(table, 'tenantRouting'),
15
+ foreignKey({
16
+ columns: [table.tenantId, table.contextCorrelationId],
17
+ foreignColumns: [tenant.id, tenant.contextCorrelationId],
18
+ }).onDelete('cascade'),
19
+ ]
20
+ )