@sphereon/ssi-sdk.data-store 0.32.1-next.12 → 0.32.1-next.141

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 (85) hide show
  1. package/dist/entities/presentationDefinition/PresentationDefinitionItemEntity.d.ts +1 -0
  2. package/dist/entities/presentationDefinition/PresentationDefinitionItemEntity.d.ts.map +1 -1
  3. package/dist/entities/presentationDefinition/PresentationDefinitionItemEntity.js +8 -2
  4. package/dist/entities/presentationDefinition/PresentationDefinitionItemEntity.js.map +1 -1
  5. package/dist/entities/{statusList2021 → statusList}/StatusList2021EntryEntity.d.ts +1 -1
  6. package/dist/entities/statusList/StatusList2021EntryEntity.d.ts.map +1 -0
  7. package/dist/entities/{statusList2021 → statusList}/StatusList2021EntryEntity.js +3 -3
  8. package/dist/entities/statusList/StatusList2021EntryEntity.js.map +1 -0
  9. package/dist/entities/statusList/StatusListEntities.d.ts +23 -0
  10. package/dist/entities/statusList/StatusListEntities.d.ts.map +1 -0
  11. package/dist/entities/{statusList2021/StatusList2021Entity.js → statusList/StatusListEntities.js} +44 -16
  12. package/dist/entities/statusList/StatusListEntities.js.map +1 -0
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4 -4
  16. package/dist/index.js.map +1 -1
  17. package/dist/migrations/generic/4-CreateStatusList.d.ts.map +1 -1
  18. package/dist/migrations/generic/4-CreateStatusList.js +22 -12
  19. package/dist/migrations/generic/4-CreateStatusList.js.map +1 -1
  20. package/dist/migrations/postgres/1693866470001-CreateStatusList.d.ts.map +1 -1
  21. package/dist/migrations/postgres/1693866470001-CreateStatusList.js +43 -7
  22. package/dist/migrations/postgres/1693866470001-CreateStatusList.js.map +1 -1
  23. package/dist/migrations/postgres/1716475165345-CreatePresentationDefinitions.d.ts.map +1 -1
  24. package/dist/migrations/postgres/1716475165345-CreatePresentationDefinitions.js +1 -0
  25. package/dist/migrations/postgres/1716475165345-CreatePresentationDefinitions.js.map +1 -1
  26. package/dist/migrations/postgres/1737110469001-UpdateStatusList.d.ts +7 -0
  27. package/dist/migrations/postgres/1737110469001-UpdateStatusList.d.ts.map +1 -0
  28. package/dist/migrations/postgres/1737110469001-UpdateStatusList.js +39 -0
  29. package/dist/migrations/postgres/1737110469001-UpdateStatusList.js.map +1 -0
  30. package/dist/migrations/sqlite/1693866470000-CreateStatusList.d.ts.map +1 -1
  31. package/dist/migrations/sqlite/1693866470000-CreateStatusList.js +45 -5
  32. package/dist/migrations/sqlite/1693866470000-CreateStatusList.js.map +1 -1
  33. package/dist/migrations/sqlite/1716475165344-CreatePresentationDefinitions.d.ts.map +1 -1
  34. package/dist/migrations/sqlite/1716475165344-CreatePresentationDefinitions.js +1 -0
  35. package/dist/migrations/sqlite/1716475165344-CreatePresentationDefinitions.js.map +1 -1
  36. package/dist/migrations/sqlite/1737110469000-UpdateStatusList.d.ts +7 -0
  37. package/dist/migrations/sqlite/1737110469000-UpdateStatusList.d.ts.map +1 -0
  38. package/dist/migrations/sqlite/1737110469000-UpdateStatusList.js +88 -0
  39. package/dist/migrations/sqlite/1737110469000-UpdateStatusList.js.map +1 -0
  40. package/dist/statusList/IStatusListStore.d.ts +2 -2
  41. package/dist/statusList/IStatusListStore.d.ts.map +1 -1
  42. package/dist/statusList/StatusListStore.d.ts +8 -7
  43. package/dist/statusList/StatusListStore.d.ts.map +1 -1
  44. package/dist/statusList/StatusListStore.js +53 -31
  45. package/dist/statusList/StatusListStore.js.map +1 -1
  46. package/dist/types/presentationDefinition/presentationDefinition.d.ts +3 -1
  47. package/dist/types/presentationDefinition/presentationDefinition.d.ts.map +1 -1
  48. package/dist/types/statusList/IAbstractStatusListStore.d.ts +2 -2
  49. package/dist/types/statusList/IAbstractStatusListStore.d.ts.map +1 -1
  50. package/dist/types/statusList/statusList.d.ts +9 -4
  51. package/dist/types/statusList/statusList.d.ts.map +1 -1
  52. package/dist/utils/presentationDefinition/MappingUtils.d.ts.map +1 -1
  53. package/dist/utils/presentationDefinition/MappingUtils.js +2 -0
  54. package/dist/utils/presentationDefinition/MappingUtils.js.map +1 -1
  55. package/dist/utils/statusList/MappingUtils.d.ts +5 -0
  56. package/dist/utils/statusList/MappingUtils.d.ts.map +1 -0
  57. package/dist/utils/statusList/MappingUtils.js +69 -0
  58. package/dist/utils/statusList/MappingUtils.js.map +1 -0
  59. package/package.json +6 -5
  60. package/src/__tests__/pd-manager.entities.test.ts +77 -0
  61. package/src/__tests__/statusList.entities.test.ts +215 -0
  62. package/src/__tests__/statusList.store.test.ts +232 -0
  63. package/src/entities/presentationDefinition/PresentationDefinitionItemEntity.ts +6 -2
  64. package/src/entities/{statusList2021 → statusList}/StatusList2021EntryEntity.ts +1 -1
  65. package/src/entities/{statusList2021/StatusList2021Entity.ts → statusList/StatusListEntities.ts} +37 -18
  66. package/src/index.ts +3 -3
  67. package/src/migrations/generic/4-CreateStatusList.ts +22 -12
  68. package/src/migrations/postgres/1693866470001-CreateStatusList.ts +45 -9
  69. package/src/migrations/postgres/1716475165345-CreatePresentationDefinitions.ts +1 -0
  70. package/src/migrations/postgres/1737110469001-UpdateStatusList.ts +25 -0
  71. package/src/migrations/sqlite/1693866470000-CreateStatusList.ts +45 -5
  72. package/src/migrations/sqlite/1716475165344-CreatePresentationDefinitions.ts +1 -0
  73. package/src/migrations/sqlite/1737110469000-UpdateStatusList.ts +84 -0
  74. package/src/statusList/IStatusListStore.ts +2 -2
  75. package/src/statusList/StatusListStore.ts +66 -40
  76. package/src/types/presentationDefinition/presentationDefinition.ts +3 -1
  77. package/src/types/statusList/IAbstractStatusListStore.ts +2 -2
  78. package/src/types/statusList/statusList.ts +12 -4
  79. package/src/utils/presentationDefinition/MappingUtils.ts +3 -0
  80. package/src/utils/statusList/MappingUtils.ts +82 -0
  81. package/dist/entities/statusList2021/StatusList2021Entity.d.ts +0 -19
  82. package/dist/entities/statusList2021/StatusList2021Entity.d.ts.map +0 -1
  83. package/dist/entities/statusList2021/StatusList2021Entity.js.map +0 -1
  84. package/dist/entities/statusList2021/StatusList2021EntryEntity.d.ts.map +0 -1
  85. package/dist/entities/statusList2021/StatusList2021EntryEntity.js.map +0 -1
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  IIssuer,
3
- JwtDecodedVerifiableCredential,
3
+ StatusListCredential,
4
4
  StatusListCredentialIdMode,
5
5
  StatusListDriverType,
6
6
  StatusListIndexingDirection,
7
7
  StatusListType,
8
8
  StatusPurpose2021,
9
- W3CVerifiableCredential,
9
+ ProofFormat,
10
10
  } from '@sphereon/ssi-types'
11
- import { ProofFormat } from '@veramo/core'
12
- import { BaseEntity, Column, Entity, OneToMany, PrimaryColumn, Unique } from 'typeorm'
11
+ import { BaseEntity, ChildEntity, Column, Entity, OneToMany, PrimaryColumn, TableInheritance, Unique } from 'typeorm'
13
12
  import { StatusListEntryEntity } from './StatusList2021EntryEntity'
14
13
 
15
14
  @Entity('StatusList')
16
15
  @Unique('UQ_correlationId', ['correlationId'])
17
- export class StatusListEntity extends BaseEntity {
16
+ @TableInheritance({ column: { type: 'simple-enum', name: 'type', enum: StatusListType } })
17
+ export abstract class StatusListEntity extends BaseEntity {
18
18
  @PrimaryColumn({ name: 'id', type: 'varchar' })
19
19
  id!: string
20
20
 
@@ -46,10 +46,12 @@ export class StatusListEntity extends BaseEntity {
46
46
  })
47
47
  issuer!: string | IIssuer
48
48
 
49
- @Column('simple-enum', { name: 'type', enum: StatusListType, nullable: false, default: StatusListType.StatusList2021 })
50
- type!: StatusListType
51
-
52
- @Column('simple-enum', { name: 'driverType', enum: StatusListDriverType, nullable: false, default: StatusListDriverType.AGENT_TYPEORM })
49
+ @Column('simple-enum', {
50
+ name: 'driverType',
51
+ enum: StatusListDriverType,
52
+ nullable: false,
53
+ default: StatusListDriverType.AGENT_TYPEORM,
54
+ })
53
55
  driverType!: StatusListDriverType
54
56
 
55
57
  @Column('simple-enum', {
@@ -63,25 +65,19 @@ export class StatusListEntity extends BaseEntity {
63
65
  @Column({ type: 'varchar', name: 'proofFormat', enum: ['lds', 'jwt'], nullable: false, default: 'lds' })
64
66
  proofFormat!: ProofFormat
65
67
 
66
- @Column({ type: 'varchar', name: 'indexingDirection', enum: ['rightToLeft'], nullable: false, default: 'rightToLeft' })
67
- indexingDirection!: StatusListIndexingDirection
68
-
69
- @Column({ type: 'varchar', name: 'statusPurpose', nullable: false, default: 'revocation' })
70
- statusPurpose!: StatusPurpose2021
71
-
72
68
  @Column({
73
69
  name: 'statusListCredential',
74
70
  type: 'text',
75
71
  nullable: true,
76
72
  unique: false,
77
73
  transformer: {
78
- from(value: string): W3CVerifiableCredential | JwtDecodedVerifiableCredential {
74
+ from(value: string): StatusListCredential {
79
75
  if (value?.startsWith('ey')) {
80
76
  return value
81
77
  }
82
78
  return JSON.parse(value)
83
79
  },
84
- to(value: W3CVerifiableCredential | JwtDecodedVerifiableCredential): string {
80
+ to(value: StatusListCredential): string {
85
81
  if (typeof value === 'string') {
86
82
  return value
87
83
  }
@@ -89,8 +85,31 @@ export class StatusListEntity extends BaseEntity {
89
85
  },
90
86
  },
91
87
  })
92
- statusListCredential?: W3CVerifiableCredential | JwtDecodedVerifiableCredential
88
+ statusListCredential?: StatusListCredential
93
89
 
94
90
  @OneToMany((type) => StatusListEntryEntity, (entry) => entry.statusList)
95
91
  statusListEntries!: StatusListEntryEntity[]
96
92
  }
93
+
94
+ @ChildEntity(StatusListType.StatusList2021)
95
+ export class StatusList2021Entity extends StatusListEntity {
96
+ @Column({
97
+ type: 'varchar',
98
+ name: 'indexingDirection',
99
+ enum: ['rightToLeft'],
100
+ nullable: false,
101
+ default: 'rightToLeft',
102
+ })
103
+ indexingDirection!: StatusListIndexingDirection
104
+
105
+ @Column({ type: 'varchar', name: 'statusPurpose', nullable: false, default: 'revocation' })
106
+ statusPurpose!: StatusPurpose2021
107
+ }
108
+
109
+ @ChildEntity(StatusListType.OAuthStatusList)
110
+ export class OAuthStatusListEntity extends StatusListEntity {
111
+ @Column({ type: 'integer', name: 'bitsPerStatus', nullable: false })
112
+ bitsPerStatus!: number
113
+ @Column({ type: 'datetime', name: 'expiresAt', nullable: true })
114
+ expiresAt?: Date
115
+ }
package/src/index.ts CHANGED
@@ -16,8 +16,8 @@ import { ImageDimensionsEntity } from './entities/issuanceBranding/ImageDimensio
16
16
  import { IssuerLocaleBrandingEntity } from './entities/issuanceBranding/IssuerLocaleBrandingEntity'
17
17
  import { IssuerBrandingEntity } from './entities/issuanceBranding/IssuerBrandingEntity'
18
18
  import { TextAttributesEntity } from './entities/issuanceBranding/TextAttributesEntity'
19
- import { StatusListEntity } from './entities/statusList2021/StatusList2021Entity'
20
- import { StatusListEntryEntity } from './entities/statusList2021/StatusList2021EntryEntity'
19
+ import { OAuthStatusListEntity, StatusList2021Entity, StatusListEntity } from './entities/statusList/StatusListEntities'
20
+ import { StatusListEntryEntity } from './entities/statusList/StatusList2021EntryEntity'
21
21
  import { MachineStateInfoEntity } from './entities/machineState/MachineStateInfoEntity'
22
22
  import { IStatusListEntity, IStatusListEntryEntity } from './types'
23
23
  import { PartyRelationshipEntity } from './entities/contact/PartyRelationshipEntity'
@@ -96,7 +96,7 @@ export const DataStoreIssuanceBrandingEntities = [
96
96
 
97
97
  export const DataStorePresentationDefinitionEntities = [PresentationDefinitionItemEntity]
98
98
 
99
- export const DataStoreStatusListEntities = [StatusListEntity, StatusListEntryEntity]
99
+ export const DataStoreStatusListEntities = [StatusListEntity, StatusList2021Entity, OAuthStatusListEntity, StatusListEntryEntity]
100
100
 
101
101
  export const DataStoreEventLoggerEntities = [AuditEventEntity]
102
102
 
@@ -2,6 +2,8 @@ import Debug from 'debug'
2
2
  import { MigrationInterface, QueryRunner } from 'typeorm'
3
3
  import { CreateStatusList1693866470001 } from '../postgres/1693866470001-CreateStatusList'
4
4
  import { CreateStatusList1693866470002 } from '../sqlite/1693866470000-CreateStatusList'
5
+ import { UpdateStatusList1737110469001 } from '../postgres/1737110469001-UpdateStatusList'
6
+ import { UpdateStatusList1737110469000 } from '../sqlite/1737110469000-UpdateStatusList'
5
7
 
6
8
  const debug = Debug('sphereon:ssi-sdk:migrations')
7
9
 
@@ -12,15 +14,19 @@ export class CreateStatusList1693866470000 implements MigrationInterface {
12
14
  debug('migration: creating issuance branding tables')
13
15
  const dbType = queryRunner.connection.driver.options.type
14
16
  if (dbType === 'postgres') {
15
- debug('using postgres migration file')
16
- const mig = new CreateStatusList1693866470001()
17
- const up = await mig.up(queryRunner)
17
+ debug('using postgres migration files')
18
+ const createMig = new CreateStatusList1693866470001()
19
+ await createMig.up(queryRunner)
20
+ const updateMig = new UpdateStatusList1737110469001()
21
+ const up = await updateMig.up(queryRunner)
18
22
  debug('Migration statements executed')
19
23
  return up
20
24
  } else if (dbType === 'sqlite' || dbType === 'react-native' || dbType === 'expo') {
21
- debug('using sqlite/react-native migration file')
22
- const mig = new CreateStatusList1693866470002()
23
- const up = await mig.up(queryRunner)
25
+ debug('using sqlite/react-native migration files')
26
+ const createMig = new CreateStatusList1693866470002()
27
+ await createMig.up(queryRunner)
28
+ const updateMig = new UpdateStatusList1737110469000()
29
+ const up = await updateMig.up(queryRunner)
24
30
  debug('Migration statements executed')
25
31
  return up
26
32
  } else {
@@ -34,15 +40,19 @@ export class CreateStatusList1693866470000 implements MigrationInterface {
34
40
  debug('migration: reverting issuance branding tables')
35
41
  const dbType = queryRunner.connection.driver.options.type
36
42
  if (dbType === 'postgres') {
37
- debug('using postgres migration file')
38
- const mig = new CreateStatusList1693866470002()
39
- const down = await mig.down(queryRunner)
43
+ debug('using postgres migration files')
44
+ const updateMig = new UpdateStatusList1737110469001()
45
+ await updateMig.down(queryRunner)
46
+ const createMig = new CreateStatusList1693866470001()
47
+ const down = await createMig.down(queryRunner)
40
48
  debug('Migration statements executed')
41
49
  return down
42
50
  } else if (dbType === 'sqlite' || dbType === 'react-native' || dbType === 'expo') {
43
- debug('using sqlite/react-native migration file')
44
- const mig = new CreateStatusList1693866470002()
45
- const down = await mig.down(queryRunner)
51
+ debug('using sqlite/react-native migration files')
52
+ const updateMig = new UpdateStatusList1737110469000()
53
+ await updateMig.down(queryRunner)
54
+ const createMig = new CreateStatusList1693866470002()
55
+ const down = await createMig.down(queryRunner)
46
56
  debug('Migration statements executed')
47
57
  return down
48
58
  } else {
@@ -1,24 +1,60 @@
1
+ // noinspection SqlPostgresDialect SqlNoDataSourceInspection
1
2
  import { MigrationInterface, QueryRunner } from 'typeorm'
2
3
 
3
4
  export class CreateStatusList1693866470001 implements MigrationInterface {
4
5
  name = 'CreateStatusList1693866470001'
5
6
 
6
7
  public async up(queryRunner: QueryRunner): Promise<void> {
8
+ await queryRunner.query(`CREATE TYPE "StatusList_type_enum" AS ENUM('StatusList2021', 'OAuthStatusList')`)
9
+ await queryRunner.query(`CREATE TYPE "StatusList_drivertype_enum" AS ENUM('agent_typeorm', 'agent_kv_store', 'github', 'agent_filesystem')`)
10
+ await queryRunner.query(`CREATE TYPE "StatusList_credentialidmode_enum" AS ENUM('ISSUANCE', 'PERSISTENCE', 'NEVER')`)
11
+
7
12
  await queryRunner.query(
8
- `CREATE TABLE "StatusListEntry" ("statusListId" character varying NOT NULL, "statusListIndex" integer NOT NULL, "credentialId" character varying, "credentialHash" character varying(128), "correlationId" character varying(255), "value" character varying(50), CONSTRAINT "PK_68704d2d13857360c6b44a3d1d0" PRIMARY KEY ("statusListId", "statusListIndex"))`,
9
- )
10
- await queryRunner.query(`CREATE TYPE "public"."StatusList_type_enum" AS ENUM('StatusList2021')`)
11
- await queryRunner.query(
12
- `CREATE TYPE "public"."StatusList_drivertype_enum" AS ENUM('agent_typeorm', 'agent_kv_store', 'github', 'agent_filesystem')`,
13
+ `CREATE TABLE "StatusListEntry"
14
+ (
15
+ "statusListId" character varying NOT NULL,
16
+ "statusListIndex" integer NOT NULL,
17
+ "credentialId" character varying,
18
+ "credentialHash" character varying(128),
19
+ "correlationId" character varying(255),
20
+ "value" character varying(50),
21
+ CONSTRAINT "PK_68704d2d13857360c6b44a3d1d0" PRIMARY KEY ("statusListId", "statusListIndex")
22
+ )`,
13
23
  )
14
- await queryRunner.query(`CREATE TYPE "public"."StatusList_credentialidmode_enum" AS ENUM('ISSUANCE', 'PERSISTENCE', 'NEVER')`)
24
+ await queryRunner.query(`CREATE TYPE "StatusList_type_enum" AS ENUM('StatusList2021')`)
25
+ await queryRunner.query(`CREATE TYPE "StatusList_drivertype_enum" AS ENUM('agent_typeorm', 'agent_kv_store', 'github', 'agent_filesystem')`)
26
+ await queryRunner.query(`CREATE TYPE "StatusList_credentialidmode_enum" AS ENUM('ISSUANCE', 'PERSISTENCE', 'NEVER')`)
15
27
  await queryRunner.query(
16
- `CREATE TABLE "StatusList" ("id" character varying NOT NULL, "correlationId" character varying NOT NULL, "length" integer NOT NULL, "issuer" text NOT NULL, "type" "public"."StatusList_type_enum" NOT NULL DEFAULT 'StatusList2021', "driverType" "public"."StatusList_drivertype_enum" NOT NULL DEFAULT 'agent_typeorm', "credentialIdMode" "public"."StatusList_credentialidmode_enum" NOT NULL DEFAULT 'ISSUANCE', "proofFormat" character varying NOT NULL DEFAULT 'lds', "indexingDirection" character varying NOT NULL DEFAULT 'rightToLeft', "statusPurpose" character varying NOT NULL DEFAULT 'revocation', "statusListCredential" text, CONSTRAINT "UQ_correlationId" UNIQUE ("correlationId"), CONSTRAINT "PK_StatusList_Id" PRIMARY KEY ("id"))`,
28
+ `CREATE TABLE "StatusList"
29
+ (
30
+ "id" character varying NOT NULL,
31
+ "correlationId" character varying NOT NULL,
32
+ "length" integer NOT NULL,
33
+ "issuer" text NOT NULL,
34
+ "type" "StatusList_type_enum" NOT NULL DEFAULT 'StatusList2021',
35
+ "driverType" "StatusList_drivertype_enum" NOT NULL DEFAULT 'agent_typeorm',
36
+ "credentialIdMode" "StatusList_credentialidmode_enum" NOT NULL DEFAULT 'ISSUANCE',
37
+ "proofFormat" character varying NOT NULL DEFAULT 'lds',
38
+ "indexingDirection" character varying NOT NULL DEFAULT 'rightToLeft',
39
+ "statusPurpose" character varying NOT NULL DEFAULT 'revocation',
40
+ "statusListCredential" text,
41
+ CONSTRAINT "UQ_correlationId" UNIQUE ("correlationId"),
42
+ CONSTRAINT "PK_StatusList_Id" PRIMARY KEY ("id")
43
+ )`,
17
44
  )
18
45
  await queryRunner.query(
19
- `ALTER TABLE "StatusListEntry" ADD CONSTRAINT "FK_statusListEntry_statusListId" FOREIGN KEY ("statusListId") REFERENCES "StatusList"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
46
+ `ALTER TABLE "StatusListEntry"
47
+ ADD CONSTRAINT "FK_statusListEntry_statusListId" FOREIGN KEY ("statusListId") REFERENCES "StatusList" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
20
48
  )
21
49
  }
22
50
 
23
- public async down(queryRunner: QueryRunner): Promise<void> {}
51
+ public async down(queryRunner: QueryRunner): Promise<void> {
52
+ await queryRunner.query(`ALTER TABLE "StatusListEntry"
53
+ DROP CONSTRAINT "FK_statusListEntry_statusListId"`)
54
+ await queryRunner.query(`DROP TABLE "StatusListEntry"`)
55
+ await queryRunner.query(`DROP TABLE "StatusList"`)
56
+ await queryRunner.query(`DROP TYPE "StatusList_credentialidmode_enum"`)
57
+ await queryRunner.query(`DROP TYPE "StatusList_drivertype_enum"`)
58
+ await queryRunner.query(`DROP TYPE "StatusList_type_enum"`)
59
+ }
24
60
  }
@@ -13,6 +13,7 @@ CREATE TABLE "PresentationDefinitionItem" (
13
13
  "version" TEXT NOT NULL,
14
14
  "purpose" TEXT,
15
15
  "definition_payload" TEXT NOT NULL,
16
+ "dcql_payload" TEXT,
16
17
  "created_at" TIMESTAMP NOT NULL DEFAULT now(),
17
18
  "last_updated_at" TIMESTAMP NOT NULL DEFAULT now(),
18
19
  CONSTRAINT "PK_PresentationDefinitionItem_id" PRIMARY KEY ("id"))
@@ -0,0 +1,25 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm'
2
+
3
+ export class UpdateStatusList1737110469001 implements MigrationInterface {
4
+ name = 'UpdateStatusList1737110469001'
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ // Add new enum value
8
+ await queryRunner.query(`ALTER TYPE "StatusList_type_enum" ADD VALUE 'OAuthStatusList'`)
9
+
10
+ // Make columns nullable and add new columns
11
+ await queryRunner.query(`ALTER TABLE "StatusList" ALTER COLUMN "indexingDirection" DROP NOT NULL`)
12
+ await queryRunner.query(`ALTER TABLE "StatusList" ALTER COLUMN "statusPurpose" DROP NOT NULL`)
13
+ await queryRunner.query(`ALTER TABLE "StatusList" ADD "bitsPerStatus" integer`)
14
+ await queryRunner.query(`ALTER TABLE "StatusList" ADD "expiresAt" timestamp with time zone`)
15
+ }
16
+
17
+ public async down(queryRunner: QueryRunner): Promise<void> {
18
+ await queryRunner.query(`ALTER TABLE "StatusList" DROP COLUMN "expiresAt"`)
19
+ await queryRunner.query(`ALTER TABLE "StatusList" DROP COLUMN "bitsPerStatus"`)
20
+ await queryRunner.query(`ALTER TABLE "StatusList" ALTER COLUMN "statusPurpose" SET NOT NULL`)
21
+ await queryRunner.query(`ALTER TABLE "StatusList" ALTER COLUMN "indexingDirection" SET NOT NULL`)
22
+
23
+ // Note: Cannot remove enum value in Postgres, would need to recreate the type
24
+ }
25
+ }
@@ -5,20 +5,60 @@ export class CreateStatusList1693866470002 implements MigrationInterface {
5
5
 
6
6
  public async up(queryRunner: QueryRunner): Promise<void> {
7
7
  await queryRunner.query(
8
- `CREATE TABLE "StatusListEntry" ("statusListId" varchar NOT NULL, "statusListIndex" integer NOT NULL, "credentialId" varchar, "credentialHash" varchar(128), "correlationId" varchar(255), "value" varchar(50), PRIMARY KEY ("statusListId", "statusListIndex"))`,
8
+ `CREATE TABLE "StatusListEntry"
9
+ (
10
+ "statusListId" varchar NOT NULL,
11
+ "statusListIndex" integer NOT NULL,
12
+ "credentialId" varchar,
13
+ "credentialHash" varchar(128),
14
+ "correlationId" varchar(255),
15
+ "value" varchar(50),
16
+ PRIMARY KEY ("statusListId", "statusListIndex")
17
+ )`,
9
18
  )
10
19
  await queryRunner.query(
11
- `CREATE TABLE "StatusList" ("id" varchar PRIMARY KEY NOT NULL, "correlationId" varchar NOT NULL, "length" integer NOT NULL, "issuer" text NOT NULL, "type" varchar CHECK( "type" IN ('StatusList2021') ) NOT NULL DEFAULT ('StatusList2021'), "driverType" varchar CHECK( "driverType" IN ('agent_typeorm','agent_kv_store','github','agent_filesystem') ) NOT NULL DEFAULT ('agent_typeorm'), "credentialIdMode" varchar CHECK( "credentialIdMode" IN ('ISSUANCE','PERSISTENCE','NEVER') ) NOT NULL DEFAULT ('ISSUANCE'), "proofFormat" varchar CHECK( "proofFormat" IN ('lds','jwt') ) NOT NULL DEFAULT ('lds'), "indexingDirection" varchar CHECK( "indexingDirection" IN ('rightToLeft') ) NOT NULL DEFAULT ('rightToLeft'), "statusPurpose" varchar NOT NULL DEFAULT ('revocation'), "statusListCredential" text, CONSTRAINT "UQ_correlationId" UNIQUE ("correlationId"))`,
20
+ `CREATE TABLE "StatusList"
21
+ (
22
+ "id" varchar PRIMARY KEY NOT NULL,
23
+ "correlationId" varchar NOT NULL,
24
+ "length" integer NOT NULL,
25
+ "issuer" text NOT NULL,
26
+ "type" varchar CHECK ( "type" IN ('StatusList2021') ) NOT NULL DEFAULT ('StatusList2021'),
27
+ "driverType" varchar CHECK ( "driverType" IN ('agent_typeorm', 'agent_kv_store', 'github',
28
+ 'agent_filesystem') ) NOT NULL DEFAULT ('agent_typeorm'),
29
+ "credentialIdMode" varchar CHECK ( "credentialIdMode" IN ('ISSUANCE', 'PERSISTENCE', 'NEVER') ) NOT NULL DEFAULT ('ISSUANCE'),
30
+ "proofFormat" varchar CHECK ( "proofFormat" IN ('lds', 'jwt') ) NOT NULL DEFAULT ('lds'),
31
+ "indexingDirection" varchar CHECK ( "indexingDirection" IN ('rightToLeft') ) NOT NULL DEFAULT ('rightToLeft'),
32
+ "statusPurpose" varchar NOT NULL DEFAULT ('revocation'),
33
+ "statusListCredential" text,
34
+ CONSTRAINT "UQ_correlationId" UNIQUE ("correlationId")
35
+ )`,
12
36
  )
13
37
  await queryRunner.query(
14
- `CREATE TABLE "temporary_StatusListEntry" ("statusListId" varchar NOT NULL, "statusListIndex" integer NOT NULL, "credentialId" varchar, "credentialHash" varchar(128), "correlationId" varchar(255), "value" varchar(50), CONSTRAINT "FK_statusListEntry_statusListId" FOREIGN KEY ("statusListId") REFERENCES "StatusList" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION, PRIMARY KEY ("statusListId", "statusListIndex"))`,
38
+ `CREATE TABLE "temporary_StatusListEntry"
39
+ (
40
+ "statusListId" varchar NOT NULL,
41
+ "statusListIndex" integer NOT NULL,
42
+ "credentialId" varchar,
43
+ "credentialHash" varchar(128),
44
+ "correlationId" varchar(255),
45
+ "value" varchar(50),
46
+ CONSTRAINT "FK_statusListEntry_statusListId" FOREIGN KEY ("statusListId") REFERENCES "StatusList" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
47
+ PRIMARY KEY ("statusListId", "statusListIndex")
48
+ )`,
15
49
  )
16
50
  await queryRunner.query(
17
- `INSERT INTO "temporary_StatusListEntry"("statusListId", "statusListIndex", "credentialId", "credentialHash", "correlationId", "value") SELECT "statusListId", "statusListIndex", "credentialId", "credentialHash", "correlationId", "value" FROM "StatusListEntry"`,
51
+ `INSERT INTO "temporary_StatusListEntry"("statusListId", "statusListIndex", "credentialId",
52
+ "credentialHash", "correlationId", "value")
53
+ SELECT "statusListId", "statusListIndex", "credentialId", "credentialHash", "correlationId", "value"
54
+ FROM "StatusListEntry"`,
18
55
  )
19
56
  await queryRunner.query(`DROP TABLE "StatusListEntry"`)
20
57
  await queryRunner.query(`ALTER TABLE "temporary_StatusListEntry" RENAME TO "StatusListEntry"`)
21
58
  }
22
59
 
23
- public async down(queryRunner: QueryRunner): Promise<void> {}
60
+ public async down(queryRunner: QueryRunner): Promise<void> {
61
+ await queryRunner.query(`DROP TABLE "StatusListEntry"`)
62
+ await queryRunner.query(`DROP TABLE "StatusList"`)
63
+ }
24
64
  }
@@ -13,6 +13,7 @@ export class CreatePresentationDefinitions1716475165344 implements MigrationInte
13
13
  "version" varchar NOT NULL,
14
14
  "purpose" varchar,
15
15
  "definition_payload" varchar NOT NULL,
16
+ "dcql_payload" varchar,
16
17
  "created_at" datetime NOT NULL DEFAULT (datetime('now')),
17
18
  "last_updated_at" datetime NOT NULL DEFAULT (datetime('now')))`,
18
19
  )
@@ -0,0 +1,84 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm'
2
+
3
+ export class UpdateStatusList1737110469000 implements MigrationInterface {
4
+ name = 'UpdateStatusList1737110469000'
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ // Create temporary table with new schema
8
+ await queryRunner.query(
9
+ `CREATE TABLE "temporary_StatusList" (
10
+ "id" varchar PRIMARY KEY NOT NULL,
11
+ "correlationId" varchar NOT NULL,
12
+ "length" integer NOT NULL,
13
+ "issuer" text NOT NULL,
14
+ "type" varchar CHECK( "type" IN ('StatusList2021', 'OAuthStatusList') ) NOT NULL DEFAULT ('StatusList2021'),
15
+ "driverType" varchar CHECK( "driverType" IN ('agent_typeorm','agent_kv_store','github','agent_filesystem') ) NOT NULL DEFAULT ('agent_typeorm'),
16
+ "credentialIdMode" varchar CHECK( "credentialIdMode" IN ('ISSUANCE','PERSISTENCE','NEVER') ) NOT NULL DEFAULT ('ISSUANCE'),
17
+ "proofFormat" varchar CHECK( "proofFormat" IN ('lds','jwt') ) NOT NULL DEFAULT ('lds'),
18
+ "indexingDirection" varchar CHECK( "indexingDirection" IN ('rightToLeft') ),
19
+ "statusPurpose" varchar,
20
+ "statusListCredential" text,
21
+ "bitsPerStatus" integer,
22
+ "expiresAt" datetime,
23
+ CONSTRAINT "UQ_correlationId" UNIQUE ("correlationId")
24
+ )`,
25
+ )
26
+
27
+ // Copy data from old table to temporary table
28
+ await queryRunner.query(
29
+ `INSERT INTO "temporary_StatusList"(
30
+ "id", "correlationId", "length", "issuer", "type", "driverType",
31
+ "credentialIdMode", "proofFormat", "indexingDirection", "statusPurpose",
32
+ "statusListCredential"
33
+ )
34
+ SELECT
35
+ "id", "correlationId", "length", "issuer", "type", "driverType",
36
+ "credentialIdMode", "proofFormat", "indexingDirection", "statusPurpose",
37
+ "statusListCredential"
38
+ FROM "StatusList"`,
39
+ )
40
+
41
+ // Drop old table and rename temporary table
42
+ await queryRunner.query(`DROP TABLE "StatusList"`)
43
+ await queryRunner.query(`ALTER TABLE "temporary_StatusList" RENAME TO "StatusList"`)
44
+ }
45
+
46
+ public async down(queryRunner: QueryRunner): Promise<void> {
47
+ // Create temporary table with old schema
48
+ await queryRunner.query(
49
+ `CREATE TABLE "temporary_StatusList" (
50
+ "id" varchar PRIMARY KEY NOT NULL,
51
+ "correlationId" varchar NOT NULL,
52
+ "length" integer NOT NULL,
53
+ "issuer" text NOT NULL,
54
+ "type" varchar CHECK( "type" IN ('StatusList2021') ) NOT NULL DEFAULT ('StatusList2021'),
55
+ "driverType" varchar CHECK( "driverType" IN ('agent_typeorm','agent_kv_store','github','agent_filesystem') ) NOT NULL DEFAULT ('agent_typeorm'),
56
+ "credentialIdMode" varchar CHECK( "credentialIdMode" IN ('ISSUANCE','PERSISTENCE','NEVER') ) NOT NULL DEFAULT ('ISSUANCE'),
57
+ "proofFormat" varchar CHECK( "proofFormat" IN ('lds','jwt') ) NOT NULL DEFAULT ('lds'),
58
+ "indexingDirection" varchar CHECK( "indexingDirection" IN ('rightToLeft') ) NOT NULL DEFAULT ('rightToLeft'),
59
+ "statusPurpose" varchar NOT NULL DEFAULT ('revocation'),
60
+ "statusListCredential" text,
61
+ CONSTRAINT "UQ_correlationId" UNIQUE ("correlationId")
62
+ )`,
63
+ )
64
+
65
+ // Copy data back, excluding new columns
66
+ await queryRunner.query(
67
+ `INSERT INTO "temporary_StatusList"(
68
+ "id", "correlationId", "length", "issuer", "type", "driverType",
69
+ "credentialIdMode", "proofFormat", "indexingDirection", "statusPurpose",
70
+ "statusListCredential"
71
+ )
72
+ SELECT
73
+ "id", "correlationId", "length", "issuer",
74
+ CASE WHEN "type" = 'OAuthStatusList' THEN 'StatusList2021' ELSE "type" END,
75
+ "driverType", "credentialIdMode", "proofFormat", "indexingDirection",
76
+ COALESCE("statusPurpose", 'revocation'), "statusListCredential"
77
+ FROM "StatusList"`,
78
+ )
79
+
80
+ // Drop new table and rename temporary table back
81
+ await queryRunner.query(`DROP TABLE "StatusList"`)
82
+ await queryRunner.query(`ALTER TABLE "temporary_StatusList" RENAME TO "StatusList"`)
83
+ }
84
+ }
@@ -1,4 +1,4 @@
1
- import { StatusListEntryEntity } from '../entities/statusList2021/StatusList2021EntryEntity'
1
+ import { StatusListEntryEntity } from '../entities/statusList/StatusList2021EntryEntity'
2
2
  import {
3
3
  IAddStatusListArgs,
4
4
  IAddStatusListEntryArgs,
@@ -18,7 +18,7 @@ export interface IStatusListStore {
18
18
 
19
19
  getStatusLists(args: IGetStatusListsArgs): Promise<Array<IStatusListEntity>>
20
20
 
21
- removeStatusList(args: IRemoveStatusListArgs): Promise<void>
21
+ removeStatusList(args: IRemoveStatusListArgs): Promise<boolean>
22
22
 
23
23
  addStatusList(args: IAddStatusListArgs): Promise<IStatusListEntity>
24
24