@sphereon/ssi-sdk.data-store 0.30.2-unstable.8 → 0.31.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 (147) hide show
  1. package/dist/contact/ContactStore.d.ts.map +1 -1
  2. package/dist/digitalCredential/DigitalCredentialStore.d.ts.map +1 -1
  3. package/dist/digitalCredential/DigitalCredentialStore.js +1 -3
  4. package/dist/digitalCredential/DigitalCredentialStore.js.map +1 -1
  5. package/dist/entities/digitalCredential/DigitalCredentialEntity.d.ts.map +1 -1
  6. package/dist/entities/digitalCredential/DigitalCredentialEntity.js +1 -1
  7. package/dist/entities/digitalCredential/DigitalCredentialEntity.js.map +1 -1
  8. package/dist/entities/eventLogger/AuditEventEntity.d.ts +8 -4
  9. package/dist/entities/eventLogger/AuditEventEntity.d.ts.map +1 -1
  10. package/dist/entities/eventLogger/AuditEventEntity.js +28 -25
  11. package/dist/entities/eventLogger/AuditEventEntity.js.map +1 -1
  12. package/dist/entities/issuanceBranding/BackgroundAttributesEntity.d.ts +0 -2
  13. package/dist/entities/issuanceBranding/BackgroundAttributesEntity.d.ts.map +1 -1
  14. package/dist/entities/issuanceBranding/BackgroundAttributesEntity.js +1 -8
  15. package/dist/entities/issuanceBranding/BackgroundAttributesEntity.js.map +1 -1
  16. package/dist/entities/issuanceBranding/CredentialBrandingEntity.d.ts +0 -2
  17. package/dist/entities/issuanceBranding/CredentialBrandingEntity.d.ts.map +1 -1
  18. package/dist/entities/issuanceBranding/CredentialBrandingEntity.js +1 -9
  19. package/dist/entities/issuanceBranding/CredentialBrandingEntity.js.map +1 -1
  20. package/dist/entities/issuanceBranding/CredentialClaimsEntity.d.ts +10 -0
  21. package/dist/entities/issuanceBranding/CredentialClaimsEntity.d.ts.map +1 -0
  22. package/dist/entities/issuanceBranding/CredentialClaimsEntity.js +70 -0
  23. package/dist/entities/issuanceBranding/CredentialClaimsEntity.js.map +1 -0
  24. package/dist/entities/issuanceBranding/CredentialLocaleBrandingEntity.d.ts +2 -2
  25. package/dist/entities/issuanceBranding/CredentialLocaleBrandingEntity.d.ts.map +1 -1
  26. package/dist/entities/issuanceBranding/CredentialLocaleBrandingEntity.js +12 -16
  27. package/dist/entities/issuanceBranding/CredentialLocaleBrandingEntity.js.map +1 -1
  28. package/dist/entities/issuanceBranding/ImageAttributesEntity.d.ts +0 -2
  29. package/dist/entities/issuanceBranding/ImageAttributesEntity.d.ts.map +1 -1
  30. package/dist/entities/issuanceBranding/ImageAttributesEntity.js +1 -11
  31. package/dist/entities/issuanceBranding/ImageAttributesEntity.js.map +1 -1
  32. package/dist/entities/issuanceBranding/ImageDimensionsEntity.d.ts +0 -2
  33. package/dist/entities/issuanceBranding/ImageDimensionsEntity.d.ts.map +1 -1
  34. package/dist/entities/issuanceBranding/ImageDimensionsEntity.js +1 -8
  35. package/dist/entities/issuanceBranding/ImageDimensionsEntity.js.map +1 -1
  36. package/dist/entities/issuanceBranding/IssuerBrandingEntity.d.ts +0 -2
  37. package/dist/entities/issuanceBranding/IssuerBrandingEntity.d.ts.map +1 -1
  38. package/dist/entities/issuanceBranding/IssuerBrandingEntity.js +1 -8
  39. package/dist/entities/issuanceBranding/IssuerBrandingEntity.js.map +1 -1
  40. package/dist/entities/issuanceBranding/IssuerLocaleBrandingEntity.d.ts +4 -2
  41. package/dist/entities/issuanceBranding/IssuerLocaleBrandingEntity.d.ts.map +1 -1
  42. package/dist/entities/issuanceBranding/IssuerLocaleBrandingEntity.js +21 -15
  43. package/dist/entities/issuanceBranding/IssuerLocaleBrandingEntity.js.map +1 -1
  44. package/dist/entities/issuanceBranding/TextAttributesEntity.d.ts +0 -2
  45. package/dist/entities/issuanceBranding/TextAttributesEntity.d.ts.map +1 -1
  46. package/dist/entities/issuanceBranding/TextAttributesEntity.js +1 -7
  47. package/dist/entities/issuanceBranding/TextAttributesEntity.js.map +1 -1
  48. package/dist/eventLogger/AbstractEventLoggerStore.d.ts +4 -2
  49. package/dist/eventLogger/AbstractEventLoggerStore.d.ts.map +1 -1
  50. package/dist/eventLogger/AbstractEventLoggerStore.js.map +1 -1
  51. package/dist/eventLogger/EventLoggerStore.d.ts +5 -3
  52. package/dist/eventLogger/EventLoggerStore.d.ts.map +1 -1
  53. package/dist/eventLogger/EventLoggerStore.js +32 -3
  54. package/dist/eventLogger/EventLoggerStore.js.map +1 -1
  55. package/dist/index.d.ts +20 -18
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +17 -26
  58. package/dist/index.js.map +1 -1
  59. package/dist/issuanceBranding/IssuanceBrandingStore.d.ts +1 -1
  60. package/dist/issuanceBranding/IssuanceBrandingStore.d.ts.map +1 -1
  61. package/dist/issuanceBranding/IssuanceBrandingStore.js +5 -5
  62. package/dist/issuanceBranding/IssuanceBrandingStore.js.map +1 -1
  63. package/dist/migrations/internal-migrations-ormconfig.d.ts.map +1 -1
  64. package/dist/migrations/postgres/1685628974232-CreateIssuanceBranding.d.ts.map +1 -1
  65. package/dist/migrations/postgres/1685628974232-CreateIssuanceBranding.js +5 -1
  66. package/dist/migrations/postgres/1685628974232-CreateIssuanceBranding.js.map +1 -1
  67. package/dist/migrations/postgres/1701634812183-CreateAuditEvents.d.ts.map +1 -1
  68. package/dist/migrations/postgres/1701634812183-CreateAuditEvents.js +34 -6
  69. package/dist/migrations/postgres/1701634812183-CreateAuditEvents.js.map +1 -1
  70. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.js +1 -1
  71. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.js.map +1 -1
  72. package/dist/migrations/sqlite/1685628973231-CreateIssuanceBranding.d.ts.map +1 -1
  73. package/dist/migrations/sqlite/1685628973231-CreateIssuanceBranding.js +7 -3
  74. package/dist/migrations/sqlite/1685628973231-CreateIssuanceBranding.js.map +1 -1
  75. package/dist/migrations/sqlite/1701634819487-CreateAuditEvents.d.ts.map +1 -1
  76. package/dist/migrations/sqlite/1701634819487-CreateAuditEvents.js +27 -1
  77. package/dist/migrations/sqlite/1701634819487-CreateAuditEvents.js.map +1 -1
  78. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.js +1 -1
  79. package/dist/presentationDefinition/PDStore.d.ts.map +1 -1
  80. package/dist/statusList/StatusListStore.js.map +1 -1
  81. package/dist/types/contact/contact.d.ts +3 -3
  82. package/dist/types/contact/contact.d.ts.map +1 -1
  83. package/dist/types/digitalCredential/digitalCredential.d.ts +2 -1
  84. package/dist/types/digitalCredential/digitalCredential.d.ts.map +1 -1
  85. package/dist/types/digitalCredential/digitalCredential.js +1 -0
  86. package/dist/types/digitalCredential/digitalCredential.js.map +1 -1
  87. package/dist/types/eventLogger/IAbstractEventLoggerStore.d.ts +9 -2
  88. package/dist/types/eventLogger/IAbstractEventLoggerStore.d.ts.map +1 -1
  89. package/dist/types/eventLogger/eventLogger.d.ts +3 -2
  90. package/dist/types/eventLogger/eventLogger.d.ts.map +1 -1
  91. package/dist/types/issuanceBranding/issuanceBranding.d.ts +21 -4
  92. package/dist/types/issuanceBranding/issuanceBranding.d.ts.map +1 -1
  93. package/dist/utils/SortingUtils.d.ts.map +1 -1
  94. package/dist/utils/contact/MappingUtils.d.ts.map +1 -1
  95. package/dist/utils/contact/MappingUtils.js +2 -2
  96. package/dist/utils/contact/MappingUtils.js.map +1 -1
  97. package/dist/utils/digitalCredential/MappingUtils.d.ts.map +1 -1
  98. package/dist/utils/digitalCredential/MappingUtils.js +4 -4
  99. package/dist/utils/digitalCredential/MappingUtils.js.map +1 -1
  100. package/dist/utils/eventLogger/MappingUtils.d.ts +5 -1
  101. package/dist/utils/eventLogger/MappingUtils.d.ts.map +1 -1
  102. package/dist/utils/eventLogger/MappingUtils.js +62 -2
  103. package/dist/utils/eventLogger/MappingUtils.js.map +1 -1
  104. package/dist/utils/issuanceBranding/MappingUtils.d.ts +17 -1
  105. package/dist/utils/issuanceBranding/MappingUtils.d.ts.map +1 -1
  106. package/dist/utils/issuanceBranding/MappingUtils.js +90 -1
  107. package/dist/utils/issuanceBranding/MappingUtils.js.map +1 -1
  108. package/dist/utils/presentationDefinition/MappingUtils.js +2 -2
  109. package/dist/utils/presentationDefinition/MappingUtils.js.map +1 -1
  110. package/package.json +10 -9
  111. package/src/__tests__/contact.store.test.ts +46 -4
  112. package/src/__tests__/digitalCredential.entities.test.ts +1 -7
  113. package/src/__tests__/digitalCredential.store.test.ts +85 -4
  114. package/src/__tests__/eventLogger.entities.test.ts +60 -5
  115. package/src/__tests__/eventLogger.store.test.ts +461 -3
  116. package/src/__tests__/issuanceBranding.entities.test.ts +129 -0
  117. package/src/digitalCredential/DigitalCredentialStore.ts +1 -3
  118. package/src/entities/digitalCredential/DigitalCredentialEntity.ts +1 -1
  119. package/src/entities/eventLogger/AuditEventEntity.ts +23 -28
  120. package/src/entities/issuanceBranding/BackgroundAttributesEntity.ts +2 -11
  121. package/src/entities/issuanceBranding/CredentialBrandingEntity.ts +1 -13
  122. package/src/entities/issuanceBranding/CredentialClaimsEntity.ts +35 -0
  123. package/src/entities/issuanceBranding/CredentialLocaleBrandingEntity.ts +11 -18
  124. package/src/entities/issuanceBranding/ImageAttributesEntity.ts +2 -14
  125. package/src/entities/issuanceBranding/ImageDimensionsEntity.ts +0 -9
  126. package/src/entities/issuanceBranding/IssuerBrandingEntity.ts +1 -12
  127. package/src/entities/issuanceBranding/IssuerLocaleBrandingEntity.ts +17 -17
  128. package/src/entities/issuanceBranding/TextAttributesEntity.ts +1 -9
  129. package/src/eventLogger/AbstractEventLoggerStore.ts +4 -2
  130. package/src/eventLogger/EventLoggerStore.ts +46 -11
  131. package/src/index.ts +20 -30
  132. package/src/issuanceBranding/IssuanceBrandingStore.ts +15 -9
  133. package/src/migrations/postgres/1685628974232-CreateIssuanceBranding.ts +11 -1
  134. package/src/migrations/postgres/1701634812183-CreateAuditEvents.ts +34 -6
  135. package/src/migrations/postgres/1708525189001-CreateDigitalCredential.ts +1 -1
  136. package/src/migrations/sqlite/1685628973231-CreateIssuanceBranding.ts +11 -3
  137. package/src/migrations/sqlite/1701634819487-CreateAuditEvents.ts +27 -1
  138. package/src/migrations/sqlite/1708525189002-CreateDigitalCredential.ts +1 -1
  139. package/src/statusList/StatusListStore.ts +1 -1
  140. package/src/types/contact/contact.ts +3 -3
  141. package/src/types/digitalCredential/digitalCredential.ts +1 -0
  142. package/src/types/eventLogger/IAbstractEventLoggerStore.ts +12 -2
  143. package/src/types/eventLogger/eventLogger.ts +3 -2
  144. package/src/types/issuanceBranding/issuanceBranding.ts +24 -6
  145. package/src/utils/contact/MappingUtils.ts +5 -2
  146. package/src/utils/eventLogger/MappingUtils.ts +91 -2
  147. package/src/utils/issuanceBranding/MappingUtils.ts +115 -2
@@ -74,6 +74,16 @@ describe('Database entities tests', (): void => {
74
74
  text: {
75
75
  color: '#000000',
76
76
  },
77
+ claims: [
78
+ {
79
+ key: 'given_name',
80
+ name: 'Given Name',
81
+ },
82
+ {
83
+ key: 'family_name',
84
+ name: 'Surname',
85
+ },
86
+ ],
77
87
  },
78
88
  ],
79
89
  }
@@ -112,6 +122,8 @@ describe('Database entities tests', (): void => {
112
122
  )
113
123
  expect(fromDb?.localeBranding[0].text).toBeDefined()
114
124
  expect(fromDb?.localeBranding[0].text!.color).toEqual(credentialBranding.localeBranding[0].text!.color)
125
+ expect(fromDb?.localeBranding[0].claims).toBeDefined()
126
+ expect(fromDb?.localeBranding[0].claims.length).toEqual(credentialBranding.localeBranding[0].claims!.length)
115
127
  expect(fromDb?.createdAt).toBeDefined()
116
128
  expect(fromDb?.lastUpdatedAt).toBeDefined()
117
129
  })
@@ -460,6 +472,115 @@ describe('Database entities tests', (): void => {
460
472
  expect(result?.lastUpdatedAt).not.toEqual(fromDb?.localeBranding[0].lastUpdatedAt)
461
473
  })
462
474
 
475
+ it('Should save only claims branding to database', async (): Promise<void> => {
476
+ const credentialBranding: IBasicCredentialBranding = {
477
+ issuerCorrelationId: 'issuerCorrelationId',
478
+ vcHash: 'vcHash',
479
+ localeBranding: [
480
+ {
481
+ claims: [
482
+ {
483
+ key: 'given_name',
484
+ name: 'Given Name',
485
+ },
486
+ {
487
+ key: 'family_name',
488
+ name: 'Surname',
489
+ },
490
+ ],
491
+ },
492
+ ],
493
+ }
494
+
495
+ const credentialBrandingEntity: CredentialBrandingEntity = credentialBrandingEntityFrom(credentialBranding)
496
+ const fromDb: CredentialBrandingEntity = await dbConnection.getRepository(CredentialBrandingEntity).save(credentialBrandingEntity)
497
+
498
+ expect(fromDb).toBeDefined()
499
+ expect(fromDb?.id).toBeDefined()
500
+ expect(fromDb?.issuerCorrelationId).toEqual(credentialBranding.issuerCorrelationId)
501
+ expect(fromDb?.vcHash).toEqual(credentialBranding.vcHash)
502
+ expect(fromDb?.localeBranding).toBeDefined()
503
+ expect(fromDb?.localeBranding.length).toEqual(1)
504
+ expect(fromDb?.localeBranding[0].claims).toBeDefined()
505
+ expect(fromDb?.localeBranding[0].claims.length).toEqual(credentialBranding.localeBranding[0].claims!.length)
506
+ expect(fromDb?.createdAt).toBeDefined()
507
+ expect(fromDb?.lastUpdatedAt).toBeDefined()
508
+ })
509
+
510
+ it('Should enforce unique locale for a credential claim key', async (): Promise<void> => {
511
+ const credentialBranding: IBasicCredentialBranding = {
512
+ issuerCorrelationId: 'issuerCorrelationId',
513
+ vcHash: 'vcHash',
514
+ localeBranding: [
515
+ {
516
+ locale: 'en-US',
517
+ claims: [
518
+ {
519
+ key: 'given_name',
520
+ name: 'Given Name',
521
+ },
522
+ {
523
+ key: 'given_name',
524
+ name: 'Given Name',
525
+ },
526
+ ],
527
+ },
528
+ ],
529
+ }
530
+
531
+ const credentialBrandingEntity: CredentialBrandingEntity = credentialBrandingEntityFrom(credentialBranding)
532
+
533
+ await expect(dbConnection.getRepository(CredentialBrandingEntity).save(credentialBrandingEntity)).rejects.toThrowError(
534
+ 'SQLITE_CONSTRAINT: UNIQUE constraint failed: CredentialClaims.credentialLocaleBrandingId, CredentialClaims.key',
535
+ )
536
+ })
537
+
538
+ it('should throw error when saving credential branding with blank claim key', async (): Promise<void> => {
539
+ const credentialBranding: IBasicCredentialBranding = {
540
+ issuerCorrelationId: 'issuerCorrelationId',
541
+ vcHash: 'vcHash',
542
+ localeBranding: [
543
+ {
544
+ claims: [
545
+ {
546
+ key: '',
547
+ name: 'Given Name',
548
+ },
549
+ ],
550
+ },
551
+ ],
552
+ }
553
+
554
+ const credentialBrandingEntity: CredentialBrandingEntity = credentialBrandingEntityFrom(credentialBranding)
555
+
556
+ await expect(dbConnection.getRepository(CredentialBrandingEntity).save(credentialBrandingEntity)).rejects.toThrowError(
557
+ 'Blank claim keys are not allowed',
558
+ )
559
+ })
560
+
561
+ it('should throw error when saving credential branding with blank claim name', async (): Promise<void> => {
562
+ const credentialBranding: IBasicCredentialBranding = {
563
+ issuerCorrelationId: 'issuerCorrelationId',
564
+ vcHash: 'vcHash',
565
+ localeBranding: [
566
+ {
567
+ claims: [
568
+ {
569
+ key: 'given_name',
570
+ name: '',
571
+ },
572
+ ],
573
+ },
574
+ ],
575
+ }
576
+
577
+ const credentialBrandingEntity: CredentialBrandingEntity = credentialBrandingEntityFrom(credentialBranding)
578
+
579
+ await expect(dbConnection.getRepository(CredentialBrandingEntity).save(credentialBrandingEntity)).rejects.toThrowError(
580
+ 'Blank claim names are not allowed',
581
+ )
582
+ })
583
+
463
584
  // Issuer tests
464
585
 
465
586
  it('Should save issuer branding to database', async (): Promise<void> => {
@@ -468,6 +589,10 @@ describe('Database entities tests', (): void => {
468
589
  localeBranding: [
469
590
  {
470
591
  alias: 'issuerAlias',
592
+ clientUri: 'test_uri',
593
+ tosUri: 'test_uri',
594
+ policyUri: 'test_uri',
595
+ contacts: ['test_email_address1', 'test_email_address2'],
471
596
  locale: 'en-US',
472
597
  logo: {
473
598
  uri: 'data:image/jpeg;base64,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',
@@ -507,6 +632,10 @@ describe('Database entities tests', (): void => {
507
632
  expect(fromDb?.localeBranding).toBeDefined()
508
633
  expect(fromDb?.localeBranding.length).toEqual(1)
509
634
  expect(fromDb?.localeBranding[0].alias).toEqual(issuerBranding.localeBranding[0].alias)
635
+ expect(fromDb?.localeBranding[0].clientUri).toEqual(issuerBranding.localeBranding[0].clientUri)
636
+ expect(fromDb?.localeBranding[0].tosUri).toEqual(issuerBranding.localeBranding[0].tosUri)
637
+ expect(fromDb?.localeBranding[0].policyUri).toEqual(issuerBranding.localeBranding[0].policyUri)
638
+ expect(fromDb?.localeBranding[0].contacts).toEqual(issuerBranding.localeBranding[0].contacts)
510
639
  expect(fromDb?.localeBranding[0].locale).toEqual(issuerBranding.localeBranding[0].locale)
511
640
  expect(fromDb?.localeBranding[0].description).toEqual(issuerBranding.localeBranding[0].description)
512
641
  expect(fromDb?.localeBranding[0].logo).toBeDefined()
@@ -106,9 +106,7 @@ export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
106
106
  let affected: number = 0
107
107
  const findResult = await dcRepo.findBy(query)
108
108
  for (const dc of findResult) {
109
- if (dc.parentId !== null && dc.parentId !== undefined) {
110
- affected += await this.deleteTree(dcRepo, { id: dc.parentId })
111
- }
109
+ affected += await this.deleteTree(dcRepo, { parentId: dc.id })
112
110
  const result = await dcRepo.delete(dc.id)
113
111
  if (result.affected) {
114
112
  affected += result.affected
@@ -1,3 +1,4 @@
1
+ import { typeormDate, typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
1
2
  import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
2
3
  import {
3
4
  CredentialCorrelationType,
@@ -8,7 +9,6 @@ import {
8
9
  DocumentType,
9
10
  RegulationType,
10
11
  } from '../../types'
11
- import { typeormDate, typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
12
12
 
13
13
  @Entity('DigitalCredential')
14
14
  export class DigitalCredentialEntity extends BaseEntity implements DigitalCredential {
@@ -1,9 +1,10 @@
1
- import { ActionSubType, ActionType, InitiatorType, LogLevel, SubSystem, System, SystemCorrelationIdType } from '@sphereon/ssi-types'
2
- import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
3
- import { PartyCorrelationType } from '@sphereon/ssi-sdk.core'
4
- import { NonPersistedAuditLoggingEvent } from '../../types'
1
+ import { ActionSubType, ActionType, InitiatorType, LoggingEventType, LogLevel, SubSystem, System, SystemCorrelationIdType } from '@sphereon/ssi-types'
2
+ import { CredentialType, PartyCorrelationType } from '@sphereon/ssi-sdk.core'
5
3
  import { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
4
+ import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
6
5
 
6
+ //TODO this entity, also contains some optional fields that are related to another event type (Activity) later we might want to refactor and reorganize this.
7
+ // For now I've added a discriminator value called eventType that can be one of the three types of events: 1. General, 2. Audit, and 3. Activity
7
8
  @Entity('AuditEvents')
8
9
  export class AuditEventEntity extends BaseEntity {
9
10
  @PrimaryGeneratedColumn('uuid')
@@ -12,6 +13,9 @@ export class AuditEventEntity extends BaseEntity {
12
13
  @Column({ name: 'timestamp', nullable: false, unique: false, type: typeOrmDateTime() })
13
14
  timestamp!: Date
14
15
 
16
+ @Column('simple-enum', { name: 'eventType', enum: LoggingEventType, nullable: false, unique: false })
17
+ type!: LoggingEventType
18
+
15
19
  @Column('simple-enum', { name: 'level', enum: LogLevel, nullable: false, unique: false })
16
20
  level!: LogLevel
17
21
 
@@ -54,6 +58,21 @@ export class AuditEventEntity extends BaseEntity {
54
58
  @Column('text', { name: 'description', nullable: false, unique: false })
55
59
  description!: string
56
60
 
61
+ @Column('simple-enum', { name: 'credentialType', enum: CredentialType, nullable: true, unique: false })
62
+ credentialType?: CredentialType
63
+
64
+ @Column('text', { name: 'credentialHash', nullable: true, unique: false })
65
+ credentialHash?: string
66
+
67
+ @Column('text', { name: 'parentCredentialHash', nullable: true, unique: false })
68
+ parentCredentialHash?: string
69
+
70
+ @Column('text', { name: 'originalCredential', nullable: true, unique: false })
71
+ originalCredential?: string
72
+
73
+ @Column('text', { name: 'sharePurpose', nullable: true, unique: false })
74
+ sharePurpose?: string
75
+
57
76
  @Column('text', { name: 'data', nullable: true, unique: false })
58
77
  data?: string
59
78
 
@@ -66,27 +85,3 @@ export class AuditEventEntity extends BaseEntity {
66
85
  @UpdateDateColumn({ name: 'last_updated_at', nullable: false, type: typeOrmDateTime() })
67
86
  lastUpdatedAt!: Date
68
87
  }
69
-
70
- export const auditEventEntityFrom = (args: NonPersistedAuditLoggingEvent): AuditEventEntity => {
71
- const auditEventEntity: AuditEventEntity = new AuditEventEntity()
72
- auditEventEntity.timestamp = args.timestamp
73
- auditEventEntity.level = args.level
74
- auditEventEntity.correlationId = args.correlationId
75
- auditEventEntity.system = args.system
76
- auditEventEntity.subSystemType = args.subSystemType
77
- auditEventEntity.actionType = args.actionType
78
- auditEventEntity.actionSubType = args.actionSubType
79
- auditEventEntity.initiatorType = args.initiatorType
80
- auditEventEntity.systemCorrelationIdType = args.systemCorrelationIdType
81
- auditEventEntity.systemCorrelationId = args.systemCorrelationId
82
- auditEventEntity.systemAlias = args.systemAlias
83
- auditEventEntity.partyCorrelationType = args.partyCorrelationType
84
- auditEventEntity.partyCorrelationId = args.partyCorrelationId
85
- auditEventEntity.partyAlias = args.partyAlias
86
- auditEventEntity.description = args.description
87
- auditEventEntity.partyCorrelationType = args.partyCorrelationType
88
- auditEventEntity.data = JSON.stringify(args.data)
89
- auditEventEntity.diagnosticData = JSON.stringify(args.diagnosticData)
90
-
91
- return auditEventEntity
92
- }
@@ -1,8 +1,7 @@
1
1
  import { BaseEntity, BeforeInsert, BeforeUpdate, Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'
2
- import { IBasicBackgroundAttributes } from '../../types'
3
- import { ImageAttributesEntity, imageAttributesEntityFrom } from './ImageAttributesEntity'
2
+ import { ImageAttributesEntity } from './ImageAttributesEntity'
4
3
  import { validate, Validate, ValidationError } from 'class-validator'
5
- import { isEmptyString, IsNonEmptyStringConstraint } from '../validators'
4
+ import { IsNonEmptyStringConstraint } from '../validators'
6
5
 
7
6
  @Entity('BackgroundAttributes')
8
7
  export class BackgroundAttributesEntity extends BaseEntity {
@@ -32,11 +31,3 @@ export class BackgroundAttributesEntity extends BaseEntity {
32
31
  return
33
32
  }
34
33
  }
35
-
36
- export const backgroundAttributesEntityFrom = (args: IBasicBackgroundAttributes): BackgroundAttributesEntity => {
37
- const backgroundAttributesEntity: BackgroundAttributesEntity = new BackgroundAttributesEntity()
38
- backgroundAttributesEntity.color = isEmptyString(args.color) ? undefined : args.color
39
- backgroundAttributesEntity.image = args.image ? imageAttributesEntityFrom(args.image) : undefined
40
-
41
- return backgroundAttributesEntity
42
- }
@@ -12,8 +12,7 @@ import {
12
12
  } from 'typeorm'
13
13
  import { ArrayMinSize, IsNotEmpty, validate, ValidationError } from 'class-validator'
14
14
  import { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
15
- import { CredentialLocaleBrandingEntity, credentialLocaleBrandingEntityFrom } from './CredentialLocaleBrandingEntity'
16
- import { IBasicCredentialBranding, IBasicCredentialLocaleBranding } from '../../types'
15
+ import { CredentialLocaleBrandingEntity } from './CredentialLocaleBrandingEntity'
17
16
 
18
17
  @Entity('CredentialBranding')
19
18
  @Index('IDX_CredentialBrandingEntity_vcHash', ['vcHash'])
@@ -66,14 +65,3 @@ export class CredentialBrandingEntity extends BaseEntity {
66
65
  return
67
66
  }
68
67
  }
69
-
70
- export const credentialBrandingEntityFrom = (args: IBasicCredentialBranding): CredentialBrandingEntity => {
71
- const credentialBrandingEntity: CredentialBrandingEntity = new CredentialBrandingEntity()
72
- credentialBrandingEntity.issuerCorrelationId = args.issuerCorrelationId
73
- credentialBrandingEntity.vcHash = args.vcHash
74
- credentialBrandingEntity.localeBranding = args.localeBranding.map((localeBranding: IBasicCredentialLocaleBranding) =>
75
- credentialLocaleBrandingEntityFrom(localeBranding),
76
- )
77
-
78
- return credentialBrandingEntity
79
- }
@@ -0,0 +1,35 @@
1
+ import { BaseEntity, BeforeInsert, BeforeUpdate, Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'
2
+ import { CredentialLocaleBrandingEntity } from './CredentialLocaleBrandingEntity'
3
+ import { validate, Validate, ValidationError } from 'class-validator'
4
+ import { IsNonEmptyStringConstraint } from '../validators'
5
+
6
+ @Entity('CredentialClaims')
7
+ @Index('IDX_CredentialClaimsEntity_credentialLocaleBranding_locale', ['credentialLocaleBranding', 'key'], { unique: true })
8
+ export class CredentialClaimsEntity extends BaseEntity {
9
+ @PrimaryGeneratedColumn('uuid')
10
+ id!: string
11
+
12
+ @Column('varchar', { name: 'key', length: 255, nullable: false, unique: false })
13
+ @Validate(IsNonEmptyStringConstraint, { message: 'Blank claim keys are not allowed' })
14
+ key!: string
15
+
16
+ @Column('varchar', { name: 'name', length: 255, nullable: false, unique: false })
17
+ @Validate(IsNonEmptyStringConstraint, { message: 'Blank claim names are not allowed' })
18
+ name!: string
19
+
20
+ @ManyToOne(() => CredentialLocaleBrandingEntity, (credentialLocaleBranding: CredentialLocaleBrandingEntity) => credentialLocaleBranding.claims, {
21
+ cascade: ['insert', 'update'],
22
+ onDelete: 'CASCADE',
23
+ })
24
+ credentialLocaleBranding!: CredentialLocaleBrandingEntity
25
+
26
+ @BeforeInsert()
27
+ @BeforeUpdate()
28
+ async validate(): Promise<undefined> {
29
+ const validation: Array<ValidationError> = await validate(this)
30
+ if (validation.length > 0) {
31
+ return Promise.reject(Error(Object.values(validation[0].constraints!)[0]))
32
+ }
33
+ return
34
+ }
35
+ }
@@ -1,11 +1,7 @@
1
- import { ChildEntity, Column, JoinColumn, ManyToOne, Index } from 'typeorm'
2
- import { IBasicCredentialLocaleBranding } from '../../types'
3
- import { backgroundAttributesEntityFrom } from './BackgroundAttributesEntity'
1
+ import { ChildEntity, Column, JoinColumn, ManyToOne, Index, OneToMany } from 'typeorm'
4
2
  import { CredentialBrandingEntity } from './CredentialBrandingEntity'
5
- import { imageAttributesEntityFrom } from './ImageAttributesEntity'
6
3
  import { BaseLocaleBrandingEntity } from './BaseLocaleBrandingEntity'
7
- import { textAttributesEntityFrom } from './TextAttributesEntity'
8
- import { isEmptyString } from '../validators'
4
+ import { CredentialClaimsEntity } from './CredentialClaimsEntity'
9
5
 
10
6
  @ChildEntity('CredentialLocaleBranding')
11
7
  @Index('IDX_CredentialLocaleBrandingEntity_credentialBranding_locale', ['credentialBranding', 'locale'], { unique: true })
@@ -16,18 +12,15 @@ export class CredentialLocaleBrandingEntity extends BaseLocaleBrandingEntity {
16
12
  @JoinColumn({ name: 'credentialBrandingId' })
17
13
  credentialBranding!: CredentialBrandingEntity
18
14
 
15
+ @OneToMany(() => CredentialClaimsEntity, (claims: CredentialClaimsEntity) => claims.credentialLocaleBranding, {
16
+ cascade: true,
17
+ onDelete: 'CASCADE',
18
+ eager: true,
19
+ nullable: false,
20
+ })
21
+ @JoinColumn({ name: 'claim_id' })
22
+ claims!: Array<CredentialClaimsEntity>
23
+
19
24
  @Column('text', { name: 'credentialBrandingId', nullable: false })
20
25
  credentialBrandingId!: string
21
26
  }
22
-
23
- export const credentialLocaleBrandingEntityFrom = (args: IBasicCredentialLocaleBranding): CredentialLocaleBrandingEntity => {
24
- const credentialLocaleBrandingEntity: CredentialLocaleBrandingEntity = new CredentialLocaleBrandingEntity()
25
- credentialLocaleBrandingEntity.alias = isEmptyString(args.alias) ? undefined : args.alias
26
- credentialLocaleBrandingEntity.locale = args.locale ? args.locale : ''
27
- credentialLocaleBrandingEntity.logo = args.logo ? imageAttributesEntityFrom(args.logo) : undefined
28
- credentialLocaleBrandingEntity.description = isEmptyString(args.description) ? undefined : args.description
29
- credentialLocaleBrandingEntity.background = args.background ? backgroundAttributesEntityFrom(args.background) : undefined
30
- credentialLocaleBrandingEntity.text = args.text ? textAttributesEntityFrom(args.text) : undefined
31
-
32
- return credentialLocaleBrandingEntity
33
- }
@@ -1,8 +1,7 @@
1
1
  import { BaseEntity, BeforeInsert, BeforeUpdate, Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'
2
- import { IBasicImageAttributes } from '../../types'
3
- import { ImageDimensionsEntity, imageDimensionsEntityFrom } from './ImageDimensionsEntity'
2
+ import { ImageDimensionsEntity } from './ImageDimensionsEntity'
4
3
  import { validate, Validate, ValidationError } from 'class-validator'
5
- import { isEmptyString, IsNonEmptyStringConstraint } from '../validators'
4
+ import { IsNonEmptyStringConstraint } from '../validators'
6
5
 
7
6
  @Entity('ImageAttributes')
8
7
  export class ImageAttributesEntity extends BaseEntity {
@@ -44,14 +43,3 @@ export class ImageAttributesEntity extends BaseEntity {
44
43
  return
45
44
  }
46
45
  }
47
-
48
- export const imageAttributesEntityFrom = (args: IBasicImageAttributes): ImageAttributesEntity => {
49
- const imageAttributesEntity: ImageAttributesEntity = new ImageAttributesEntity()
50
- imageAttributesEntity.uri = isEmptyString(args.uri) ? undefined : args.uri
51
- imageAttributesEntity.dataUri = isEmptyString(args.dataUri) ? undefined : args.dataUri
52
- imageAttributesEntity.mediaType = isEmptyString(args.mediaType) ? undefined : args.mediaType
53
- imageAttributesEntity.alt = isEmptyString(args.alt) ? undefined : args.alt
54
- imageAttributesEntity.dimensions = args.dimensions ? imageDimensionsEntityFrom(args.dimensions) : undefined
55
-
56
- return imageAttributesEntity
57
- }
@@ -1,5 +1,4 @@
1
1
  import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm'
2
- import { IBasicImageDimensions } from '../../types'
3
2
 
4
3
  @Entity('ImageDimensions')
5
4
  export class ImageDimensionsEntity extends BaseEntity {
@@ -12,11 +11,3 @@ export class ImageDimensionsEntity extends BaseEntity {
12
11
  @Column('integer', { name: 'height', nullable: false, unique: false })
13
12
  height!: number
14
13
  }
15
-
16
- export const imageDimensionsEntityFrom = (args: IBasicImageDimensions): ImageDimensionsEntity => {
17
- const imageDimensionsEntity: ImageDimensionsEntity = new ImageDimensionsEntity()
18
- imageDimensionsEntity.width = args.width
19
- imageDimensionsEntity.height = args.height
20
-
21
- return imageDimensionsEntity
22
- }
@@ -12,8 +12,7 @@ import {
12
12
  } from 'typeorm'
13
13
  import { ArrayMinSize, IsNotEmpty, validate, ValidationError } from 'class-validator'
14
14
  import { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
15
- import { IssuerLocaleBrandingEntity, issuerLocaleBrandingEntityFrom } from './IssuerLocaleBrandingEntity'
16
- import { IBasicIssuerBranding, IBasicIssuerLocaleBranding } from '../../types'
15
+ import { IssuerLocaleBrandingEntity } from './IssuerLocaleBrandingEntity'
17
16
 
18
17
  @Entity('IssuerBranding')
19
18
  @Index('IDX_IssuerBrandingEntity_issuerCorrelationId', ['issuerCorrelationId'])
@@ -61,13 +60,3 @@ export class IssuerBrandingEntity extends BaseEntity {
61
60
  return
62
61
  }
63
62
  }
64
-
65
- export const issuerBrandingEntityFrom = (args: IBasicIssuerBranding): IssuerBrandingEntity => {
66
- const issuerBrandingEntity: IssuerBrandingEntity = new IssuerBrandingEntity()
67
- issuerBrandingEntity.issuerCorrelationId = args.issuerCorrelationId
68
- issuerBrandingEntity.localeBranding = args.localeBranding.map((localeBranding: IBasicIssuerLocaleBranding) =>
69
- issuerLocaleBrandingEntityFrom(localeBranding),
70
- )
71
-
72
- return issuerBrandingEntity
73
- }
@@ -1,11 +1,8 @@
1
1
  import { ChildEntity, Column, Index, JoinColumn, ManyToOne } from 'typeorm'
2
- import { IBasicIssuerLocaleBranding } from '../../types'
3
- import { backgroundAttributesEntityFrom } from './BackgroundAttributesEntity'
4
- import { imageAttributesEntityFrom } from './ImageAttributesEntity'
5
2
  import { IssuerBrandingEntity } from './IssuerBrandingEntity'
6
3
  import { BaseLocaleBrandingEntity } from './BaseLocaleBrandingEntity'
7
- import { textAttributesEntityFrom } from './TextAttributesEntity'
8
- import { isEmptyString } from '../validators'
4
+ import { IsNonEmptyStringConstraint } from '../validators'
5
+ import { Validate } from 'class-validator'
9
6
 
10
7
  @ChildEntity('IssuerLocaleBranding')
11
8
  @Index('IDX_IssuerLocaleBrandingEntity_issuerBranding_locale', ['issuerBranding', 'locale'], { unique: true })
@@ -16,18 +13,21 @@ export class IssuerLocaleBrandingEntity extends BaseLocaleBrandingEntity {
16
13
  @JoinColumn({ name: 'issuerBrandingId' })
17
14
  issuerBranding!: IssuerBrandingEntity
18
15
 
19
- @Column('text', { name: 'issuerBrandingId', nullable: false })
20
- issuerBrandingId!: string
21
- }
16
+ @Column('text', { name: 'client_uri', nullable: true, unique: false })
17
+ @Validate(IsNonEmptyStringConstraint, { message: 'Blank client uris are not allowed' })
18
+ clientUri?: string
19
+
20
+ @Column('text', { name: 'tos_uri', nullable: true, unique: false })
21
+ @Validate(IsNonEmptyStringConstraint, { message: 'Blank tos uris are not allowed' })
22
+ tosUri?: string
22
23
 
23
- export const issuerLocaleBrandingEntityFrom = (args: IBasicIssuerLocaleBranding): IssuerLocaleBrandingEntity => {
24
- const issuerLocaleBrandingEntity: IssuerLocaleBrandingEntity = new IssuerLocaleBrandingEntity()
25
- issuerLocaleBrandingEntity.alias = isEmptyString(args.alias) ? undefined : args.alias
26
- issuerLocaleBrandingEntity.locale = args.locale ? args.locale : ''
27
- issuerLocaleBrandingEntity.logo = args.logo ? imageAttributesEntityFrom(args.logo) : undefined
28
- issuerLocaleBrandingEntity.description = isEmptyString(args.description) ? undefined : args.description
29
- issuerLocaleBrandingEntity.background = args.background ? backgroundAttributesEntityFrom(args.background) : undefined
30
- issuerLocaleBrandingEntity.text = args.text ? textAttributesEntityFrom(args.text) : undefined
24
+ @Column('text', { name: 'policy_uri', nullable: true, unique: false })
25
+ @Validate(IsNonEmptyStringConstraint, { message: 'Blank policy uris are not allowed' })
26
+ policyUri?: string
31
27
 
32
- return issuerLocaleBrandingEntity
28
+ @Column('simple-array', { name: 'contacts', nullable: true, unique: false })
29
+ contacts?: Array<string>
30
+
31
+ @Column('text', { name: 'issuerBrandingId', nullable: false })
32
+ issuerBrandingId!: string
33
33
  }
@@ -1,7 +1,6 @@
1
1
  import { BaseEntity, BeforeInsert, BeforeUpdate, Column, Entity, PrimaryGeneratedColumn } from 'typeorm'
2
- import { IBasicTextAttributes } from '../../types'
3
2
  import { validate, Validate, ValidationError } from 'class-validator'
4
- import { isEmptyString, IsNonEmptyStringConstraint } from '../validators'
3
+ import { IsNonEmptyStringConstraint } from '../validators'
5
4
 
6
5
  @Entity('TextAttributes')
7
6
  export class TextAttributesEntity extends BaseEntity {
@@ -22,10 +21,3 @@ export class TextAttributesEntity extends BaseEntity {
22
21
  return
23
22
  }
24
23
  }
25
-
26
- export const textAttributesEntityFrom = (args: IBasicTextAttributes): TextAttributesEntity => {
27
- const textAttributesEntity: TextAttributesEntity = new TextAttributesEntity()
28
- textAttributesEntity.color = isEmptyString(args.color) ? undefined : args.color
29
-
30
- return textAttributesEntity
31
- }
@@ -1,7 +1,9 @@
1
- import { GetAuditEventsArgs, StoreAuditEventArgs } from '../types'
2
- import { AuditLoggingEvent } from '@sphereon/ssi-sdk.core'
1
+ import { ActivityLoggingEvent, AuditLoggingEvent } from '@sphereon/ssi-sdk.core'
2
+ import { GetActivityEventsArgs, GetAuditEventsArgs, StoreActivityEventArgs, StoreAuditEventArgs } from '../types'
3
3
 
4
4
  export abstract class AbstractEventLoggerStore {
5
5
  abstract getAuditEvents(args: GetAuditEventsArgs): Promise<Array<AuditLoggingEvent>>
6
+ abstract getActivityEvents(args: GetActivityEventsArgs): Promise<Array<ActivityLoggingEvent>>
6
7
  abstract storeAuditEvent(args: StoreAuditEventArgs): Promise<AuditLoggingEvent>
8
+ abstract storeActivityEvent(args: StoreActivityEventArgs): Promise<ActivityLoggingEvent>
7
9
  }