@sphereon/ssi-sdk.data-store 0.29.1-next.106 → 0.29.1-next.174

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/digitalCredential/DigitalCredentialStore.d.ts +5 -1
  2. package/dist/digitalCredential/DigitalCredentialStore.d.ts.map +1 -1
  3. package/dist/digitalCredential/DigitalCredentialStore.js +57 -8
  4. package/dist/digitalCredential/DigitalCredentialStore.js.map +1 -1
  5. package/dist/entities/digitalCredential/DigitalCredentialEntity.d.ts +9 -1
  6. package/dist/entities/digitalCredential/DigitalCredentialEntity.d.ts.map +1 -1
  7. package/dist/entities/digitalCredential/DigitalCredentialEntity.js +32 -0
  8. package/dist/entities/digitalCredential/DigitalCredentialEntity.js.map +1 -1
  9. package/dist/eventLogger/EventLoggerStore.d.ts +1 -0
  10. package/dist/eventLogger/EventLoggerStore.d.ts.map +1 -1
  11. package/dist/eventLogger/EventLoggerStore.js +5 -3
  12. package/dist/eventLogger/EventLoggerStore.js.map +1 -1
  13. package/dist/index.d.ts +1 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/issuanceBranding/IssuanceBrandingStore.d.ts +4 -0
  18. package/dist/issuanceBranding/IssuanceBrandingStore.d.ts.map +1 -1
  19. package/dist/issuanceBranding/IssuanceBrandingStore.js +42 -13
  20. package/dist/issuanceBranding/IssuanceBrandingStore.js.map +1 -1
  21. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.d.ts.map +1 -1
  22. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.js +16 -4
  23. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.js.map +1 -1
  24. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.d.ts.map +1 -1
  25. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.js +15 -5
  26. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.js.map +1 -1
  27. package/dist/statusList/StatusListStore.d.ts +2 -2
  28. package/dist/statusList/StatusListStore.d.ts.map +1 -1
  29. package/dist/statusList/StatusListStore.js +4 -4
  30. package/dist/statusList/StatusListStore.js.map +1 -1
  31. package/dist/types/contact/contact.d.ts +2 -2
  32. package/dist/types/contact/contact.d.ts.map +1 -1
  33. package/dist/types/digitalCredential/IAbstractDigitalCredentialStore.d.ts +5 -1
  34. package/dist/types/digitalCredential/IAbstractDigitalCredentialStore.d.ts.map +1 -1
  35. package/dist/types/digitalCredential/digitalCredential.d.ts +20 -3
  36. package/dist/types/digitalCredential/digitalCredential.d.ts.map +1 -1
  37. package/dist/types/digitalCredential/digitalCredential.js +13 -5
  38. package/dist/types/digitalCredential/digitalCredential.js.map +1 -1
  39. package/dist/utils/contact/MappingUtils.d.ts.map +1 -1
  40. package/dist/utils/contact/MappingUtils.js +12 -25
  41. package/dist/utils/contact/MappingUtils.js.map +1 -1
  42. package/dist/utils/digitalCredential/MappingUtils.d.ts +4 -0
  43. package/dist/utils/digitalCredential/MappingUtils.d.ts.map +1 -1
  44. package/dist/utils/digitalCredential/MappingUtils.js +45 -9
  45. package/dist/utils/digitalCredential/MappingUtils.js.map +1 -1
  46. package/dist/utils/hasher.d.ts +3 -0
  47. package/dist/utils/hasher.d.ts.map +1 -0
  48. package/dist/utils/hasher.js +20 -0
  49. package/dist/utils/hasher.js.map +1 -0
  50. package/dist/utils/presentationDefinition/MappingUtils.d.ts.map +1 -1
  51. package/dist/utils/presentationDefinition/MappingUtils.js +1 -3
  52. package/dist/utils/presentationDefinition/MappingUtils.js.map +1 -1
  53. package/package.json +11 -8
  54. package/src/__tests__/digitalCredential.entities.test.ts +12 -0
  55. package/src/__tests__/digitalCredential.store.test.ts +22 -0
  56. package/src/digitalCredential/DigitalCredentialStore.ts +66 -10
  57. package/src/entities/digitalCredential/DigitalCredentialEntity.ts +25 -0
  58. package/src/eventLogger/EventLoggerStore.ts +25 -3
  59. package/src/index.ts +2 -0
  60. package/src/issuanceBranding/IssuanceBrandingStore.ts +62 -14
  61. package/src/migrations/postgres/1708525189001-CreateDigitalCredential.ts +17 -4
  62. package/src/migrations/sqlite/1708525189002-CreateDigitalCredential.ts +15 -5
  63. package/src/statusList/StatusListStore.ts +5 -6
  64. package/src/types/contact/contact.ts +2 -2
  65. package/src/types/digitalCredential/IAbstractDigitalCredentialStore.ts +5 -1
  66. package/src/types/digitalCredential/digitalCredential.ts +21 -5
  67. package/src/utils/contact/MappingUtils.ts +16 -39
  68. package/src/utils/digitalCredential/MappingUtils.ts +51 -10
  69. package/src/utils/hasher.ts +19 -0
  70. package/src/utils/presentationDefinition/MappingUtils.ts +1 -4
  71. package/dist/utils/FormattingUtils.d.ts +0 -2
  72. package/dist/utils/FormattingUtils.d.ts.map +0 -1
  73. package/dist/utils/FormattingUtils.js +0 -23
  74. package/dist/utils/FormattingUtils.js.map +0 -1
  75. package/dist/utils/eventLogger/MappingUtils.d.ts +0 -4
  76. package/dist/utils/eventLogger/MappingUtils.d.ts.map +0 -1
  77. package/dist/utils/eventLogger/MappingUtils.js +0 -10
  78. package/dist/utils/eventLogger/MappingUtils.js.map +0 -1
  79. package/dist/utils/issuanceBranding/MappingUtils.d.ts +0 -8
  80. package/dist/utils/issuanceBranding/MappingUtils.d.ts.map +0 -1
  81. package/dist/utils/issuanceBranding/MappingUtils.js +0 -20
  82. package/dist/utils/issuanceBranding/MappingUtils.js.map +0 -1
  83. package/src/utils/FormattingUtils.ts +0 -21
  84. package/src/utils/eventLogger/MappingUtils.ts +0 -28
  85. package/src/utils/issuanceBranding/MappingUtils.ts +0 -32
@@ -45,6 +45,8 @@ describe('Database entities tests', (): void => {
45
45
  rawDocument: rawCredential,
46
46
  issuerCorrelationType: CredentialCorrelationType.DID,
47
47
  subjectCorrelationType: CredentialCorrelationType.DID,
48
+ kmsKeyRef: 'testRef',
49
+ identifierMethod: 'did',
48
50
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
49
51
  subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
50
52
  credentialRole: CredentialRole.VERIFIER,
@@ -59,6 +61,8 @@ describe('Database entities tests', (): void => {
59
61
  const digitalCredential: AddCredentialArgs = {
60
62
  rawDocument:
61
63
  'eyJhbGciOiJFZERTQSIsInR5cCI6InZjK3NkLWp3dCIsImtpZCI6IiN6Nk1rdHF0WE5HOENEVVk5UHJydG9TdEZ6ZUNuaHBNbWd4WUwxZ2lrY1czQnp2TlcifQ.eyJ2Y3QiOiJJZGVudGl0eUNyZWRlbnRpYWwiLCJmYW1pbHlfbmFtZSI6IkRvZSIsInBob25lX251bWJlciI6IisxLTIwMi01NTUtMDEwMSIsImFkZHJlc3MiOnsic3RyZWV0X2FkZHJlc3MiOiIxMjMgTWFpbiBTdCIsImxvY2FsaXR5IjoiQW55dG93biIsIl9zZCI6WyJOSm5tY3QwQnFCTUUxSmZCbEM2alJRVlJ1ZXZwRU9OaVl3N0E3TUh1SnlRIiwib201Wnp0WkhCLUdkMDBMRzIxQ1ZfeE00RmFFTlNvaWFPWG5UQUpOY3pCNCJdfSwiY25mIjp7Imp3ayI6eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5IiwieCI6Im9FTlZzeE9VaUg1NFg4d0pMYVZraWNDUmswMHdCSVE0c1JnYms1NE44TW8ifX0sImlzcyI6ImRpZDprZXk6ejZNa3RxdFhORzhDRFVZOVBycnRvU3RGemVDbmhwTW1neFlMMWdpa2NXM0J6dk5XIiwiaWF0IjoxNjk4MTUxNTMyLCJfc2RfYWxnIjoic2hhLTI1NiIsIl9zZCI6WyIxQ3VyMmsyQTJvSUI1Q3NoU0lmX0FfS2ctbDI2dV9xS3VXUTc5UDBWZGFzIiwiUjF6VFV2T1lIZ2NlcGowakh5cEdIejlFSHR0VktmdDB5c3diYzlFVFBiVSIsImVEcVFwZFRYSlhiV2hmLUVzSTd6dzVYNk92WW1GTi1VWlFRTWVzWHdLUHciLCJwZERrMl9YQUtIbzdnT0Fmd0YxYjdPZENVVlRpdDJrSkhheFNFQ1E5eGZjIiwicHNhdUtVTldFaTA5bnUzQ2w4OXhLWGdtcFdFTlpsNXV5MU4xbnluX2pNayIsInNOX2dlMHBIWEY2cW1zWW5YMUE5U2R3SjhjaDhhRU5reGJPRHNUNzRZd0kiXX0.coOK8NzJmEWz4qx-qRhjo-RK7aejrSkQM9La9Cw3eWmzcja9DXrkBoQZKbIJtNoSzSPLjwK2V71W78z0miZsDQ~WyJzYWx0IiwiaXNfb3Zlcl82NSIsdHJ1ZV0~WyJzYWx0IiwiaXNfb3Zlcl8yMSIsdHJ1ZV0~WyJzYWx0IiwiZW1haWwiLCJqb2huZG9lQGV4YW1wbGUuY29tIl0~WyJzYWx0IiwiY291bnRyeSIsIlVTIl0~WyJzYWx0IiwiZ2l2ZW5fbmFtZSIsIkpvaG4iXQ~eyJhbGciOiJFZERTQSIsInR5cCI6ImtiK2p3dCJ9.eyJpYXQiOjE2OTgxNTE1MzIsIm5vbmNlIjoic2FsdCIsImF1ZCI6ImRpZDprZXk6elVDNzRWRXFxaEVIUWNndjR6YWdTUGtxRkp4dU5XdW9CUEtqSnVIRVRFVWVITG9TcVd0OTJ2aVNzbWFXank4MnkiLCJfc2RfaGFzaCI6Ii1kTUd4OGZhUnpOQm91a2EwU0R6V2JkS3JYckw1TFVmUlNQTHN2Q2xPMFkifQ.TQQLqc4ZzoKjQfAghAzC_4aaU3KCS8YqzxAJtzT124guzkv9XSHtPN8d3z181_v-ca2ATXjTRoRciozitE6wBA',
64
+ kmsKeyRef: 'testRef',
65
+ identifierMethod: 'did',
62
66
  issuerCorrelationType: CredentialCorrelationType.DID,
63
67
  subjectCorrelationType: CredentialCorrelationType.DID,
64
68
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -76,6 +80,8 @@ describe('Database entities tests', (): void => {
76
80
  const addCredentialArgs1: AddCredentialArgs = {
77
81
  rawDocument:
78
82
  'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw',
83
+ kmsKeyRef: 'testRef',
84
+ identifierMethod: 'did',
79
85
  issuerCorrelationType: CredentialCorrelationType.DID,
80
86
  subjectCorrelationType: CredentialCorrelationType.DID,
81
87
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -86,6 +92,8 @@ describe('Database entities tests', (): void => {
86
92
  const addCredentialArgs2: AddCredentialArgs = {
87
93
  rawDocument:
88
94
  'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDkyMTQxNzgsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJHdWVzdENyZWRlbnRpYWwiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiZmlyc3ROYW1lIjoiUyIsImxhc3ROYW1lIjoiSyIsIkUtbWFpbCI6IiIsInR5cGUiOiJTcGhlcmVvbiBHdWVzdCIsImlkIjoiZGlkOmp3azpleUpoYkdjaU9pSkZVekkxTmtzaUxDSjFjMlVpT2lKemFXY2lMQ0pyZEhraU9pSkZReUlzSW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW5naU9pSldjWGhIZVhWUk5WUTBXVEpzZGpKSFkybE9TaTFEYURCVWFGVm1kVk5RWm0wdFJYVlNZbGRNWlVOM0lpd2llU0k2SW01T1FWQnBiR0V5VDBRNGRXOXBXbk5LVm1aUmFrbDJTMUZUZWxBelFqVlBXbVZSYkVoQ1VUbHliVFFpZlEifX0sIkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJHdWVzdENyZWRlbnRpYWwiXSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI0LTAyLTI5VDEzOjQyOjU4LjgzNVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiRS1tYWlsIjoiIiwidHlwZSI6IlNwaGVyZW9uIEd1ZXN0IiwiaWQiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOa3NpTENKMWMyVWlPaUp6YVdjaUxDSnJkSGtpT2lKRlF5SXNJbU55ZGlJNkluTmxZM0F5TlRack1TSXNJbmdpT2lKV2NYaEhlWFZSTlZRMFdUSnNkakpIWTJsT1NpMURhREJVYUZWbWRWTlFabTB0UlhWU1lsZE1aVU4zSWl3aWVTSTZJbTVPUVZCcGJHRXlUMFE0ZFc5cFduTktWbVpSYWtsMlMxRlRlbEF6UWpWUFdtVlJiRWhDVVRseWJUUWlmUSJ9LCJpc3N1ZXIiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOaUlzSW5WelpTSTZJbk5wWnlJc0ltdDBlU0k2SWtWRElpd2lZM0oySWpvaVVDMHlOVFlpTENKNElqb2lWRWN5U0RKNE1tUlhXRTR6ZFVOeFduQnhSakY1YzBGUVVWWkVTa1ZPWDBndFEwMTBZbWRxWWkxT1p5SXNJbmtpT2lJNVRUaE9lR1F3VUU0eU1rMDViRkJFZUdSd1JIQnZWRXg2TVRWM1pubGFTbk0yV21oTFNWVktNek00SW4wIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0yMlQxMzo0Mjo1OC44MzVaIiwic3ViIjoiZGlkOmp3azpleUpoYkdjaU9pSkZVekkxTmtzaUxDSjFjMlVpT2lKemFXY2lMQ0pyZEhraU9pSkZReUlzSW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW5naU9pSldjWGhIZVhWUk5WUTBXVEpzZGpKSFkybE9TaTFEYURCVWFGVm1kVk5RWm0wdFJYVlNZbGRNWlVOM0lpd2llU0k2SW01T1FWQnBiR0V5VDBRNGRXOXBXbk5LVm1aUmFrbDJTMUZUZWxBelFqVlBXbVZSYkVoQ1VUbHliVFFpZlEiLCJuYmYiOjE3MDg2MDkzNzgsImlzcyI6ImRpZDpqd2s6ZXlKaGJHY2lPaUpGVXpJMU5pSXNJblZ6WlNJNkluTnBaeUlzSW10MGVTSTZJa1ZESWl3aVkzSjJJam9pVUMweU5UWWlMQ0o0SWpvaVZFY3lTREo0TW1SWFdFNHpkVU54V25CeFJqRjVjMEZRVVZaRVNrVk9YMGd0UTAxMFltZHFZaTFPWnlJc0lua2lPaUk1VFRoT2VHUXdVRTR5TWswNWJGQkVlR1J3UkhCdlZFeDZNVFYzWm5sYVNuTTJXbWhMU1ZWS016TTRJbjAifQ.GgLRWHO674wu6QF_xUGbCi_2zDD8jNf_xoWNvH5K605xvBoz6qKx0ndmxLeGQWWUA-4VuAkznf3ROcp9wpgbEw',
95
+ kmsKeyRef: 'testRef',
96
+ identifierMethod: 'did',
89
97
  issuerCorrelationType: CredentialCorrelationType.DID,
90
98
  subjectCorrelationType: CredentialCorrelationType.DID,
91
99
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -107,6 +115,8 @@ describe('Database entities tests', (): void => {
107
115
  const addCredentialArgs1: AddCredentialArgs = {
108
116
  rawDocument:
109
117
  'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw',
118
+ kmsKeyRef: 'testRef',
119
+ identifierMethod: 'did',
110
120
  issuerCorrelationType: CredentialCorrelationType.DID,
111
121
  subjectCorrelationType: CredentialCorrelationType.DID,
112
122
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -155,6 +165,8 @@ describe('Database entities tests', (): void => {
155
165
  }
156
166
  const addCredentialArgs2: AddCredentialArgs = {
157
167
  rawDocument: JSON.stringify(sampleVP),
168
+ kmsKeyRef: 'testRef',
169
+ identifierMethod: 'did',
158
170
  issuerCorrelationType: CredentialCorrelationType.DID,
159
171
  issuerCorrelationId: 'did:example:holder',
160
172
  subjectCorrelationType: CredentialCorrelationType.DID,
@@ -165,6 +177,8 @@ describe('Database entities tests', (): void => {
165
177
  const addCredentialArgs3: AddCredentialArgs = {
166
178
  rawDocument:
167
179
  'eyJhbGciOiJFZERTQSIsInR5cCI6InZjK3NkLWp3dCIsImtpZCI6IiN6Nk1rdHF0WE5HOENEVVk5UHJydG9TdEZ6ZUNuaHBNbWd4WUwxZ2lrY1czQnp2TlcifQ.eyJ2Y3QiOiJJZGVudGl0eUNyZWRlbnRpYWwiLCJmYW1pbHlfbmFtZSI6IkRvZSIsInBob25lX251bWJlciI6IisxLTIwMi01NTUtMDEwMSIsImFkZHJlc3MiOnsic3RyZWV0X2FkZHJlc3MiOiIxMjMgTWFpbiBTdCIsImxvY2FsaXR5IjoiQW55dG93biIsIl9zZCI6WyJOSm5tY3QwQnFCTUUxSmZCbEM2alJRVlJ1ZXZwRU9OaVl3N0E3TUh1SnlRIiwib201Wnp0WkhCLUdkMDBMRzIxQ1ZfeE00RmFFTlNvaWFPWG5UQUpOY3pCNCJdfSwiY25mIjp7Imp3ayI6eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5IiwieCI6Im9FTlZzeE9VaUg1NFg4d0pMYVZraWNDUmswMHdCSVE0c1JnYms1NE44TW8ifX0sImlzcyI6ImRpZDprZXk6ejZNa3RxdFhORzhDRFVZOVBycnRvU3RGemVDbmhwTW1neFlMMWdpa2NXM0J6dk5XIiwiaWF0IjoxNjk4MTUxNTMyLCJfc2RfYWxnIjoic2hhLTI1NiIsIl9zZCI6WyIxQ3VyMmsyQTJvSUI1Q3NoU0lmX0FfS2ctbDI2dV9xS3VXUTc5UDBWZGFzIiwiUjF6VFV2T1lIZ2NlcGowakh5cEdIejlFSHR0VktmdDB5c3diYzlFVFBiVSIsImVEcVFwZFRYSlhiV2hmLUVzSTd6dzVYNk92WW1GTi1VWlFRTWVzWHdLUHciLCJwZERrMl9YQUtIbzdnT0Fmd0YxYjdPZENVVlRpdDJrSkhheFNFQ1E5eGZjIiwicHNhdUtVTldFaTA5bnUzQ2w4OXhLWGdtcFdFTlpsNXV5MU4xbnluX2pNayIsInNOX2dlMHBIWEY2cW1zWW5YMUE5U2R3SjhjaDhhRU5reGJPRHNUNzRZd0kiXX0.coOK8NzJmEWz4qx-qRhjo-RK7aejrSkQM9La9Cw3eWmzcja9DXrkBoQZKbIJtNoSzSPLjwK2V71W78z0miZsDQ~WyJzYWx0IiwiaXNfb3Zlcl82NSIsdHJ1ZV0~WyJzYWx0IiwiaXNfb3Zlcl8yMSIsdHJ1ZV0~WyJzYWx0IiwiZW1haWwiLCJqb2huZG9lQGV4YW1wbGUuY29tIl0~WyJzYWx0IiwiY291bnRyeSIsIlVTIl0~WyJzYWx0IiwiZ2l2ZW5fbmFtZSIsIkpvaG4iXQ~eyJhbGciOiJFZERTQSIsInR5cCI6ImtiK2p3dCJ9.eyJpYXQiOjE2OTgxNTE1MzIsIm5vbmNlIjoic2FsdCIsImF1ZCI6ImRpZDprZXk6elVDNzRWRXFxaEVIUWNndjR6YWdTUGtxRkp4dU5XdW9CUEtqSnVIRVRFVWVITG9TcVd0OTJ2aVNzbWFXank4MnkiLCJfc2RfaGFzaCI6Ii1kTUd4OGZhUnpOQm91a2EwU0R6V2JkS3JYckw1TFVmUlNQTHN2Q2xPMFkifQ.TQQLqc4ZzoKjQfAghAzC_4aaU3KCS8YqzxAJtzT124guzkv9XSHtPN8d3z181_v-ca2ATXjTRoRciozitE6wBA',
180
+ kmsKeyRef: 'testRef',
181
+ identifierMethod: 'did',
168
182
  issuerCorrelationType: CredentialCorrelationType.DID,
169
183
  subjectCorrelationType: CredentialCorrelationType.DID,
170
184
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -218,6 +232,8 @@ describe('Database entities tests', (): void => {
218
232
  'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
219
233
  const digitalCredential: AddCredentialArgs = {
220
234
  rawDocument: rawCredential,
235
+ kmsKeyRef: 'testRef',
236
+ identifierMethod: 'did',
221
237
  issuerCorrelationType: CredentialCorrelationType.DID,
222
238
  subjectCorrelationType: CredentialCorrelationType.DID,
223
239
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -241,6 +257,8 @@ describe('Database entities tests', (): void => {
241
257
  'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
242
258
  const digitalCredential: AddCredentialArgs = {
243
259
  rawDocument: rawCredential,
260
+ kmsKeyRef: 'testRef',
261
+ identifierMethod: 'did',
244
262
  issuerCorrelationType: CredentialCorrelationType.DID,
245
263
  subjectCorrelationType: CredentialCorrelationType.DID,
246
264
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -264,6 +282,8 @@ describe('Database entities tests', (): void => {
264
282
  'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
265
283
  const digitalCredential: AddCredentialArgs = {
266
284
  rawDocument: rawCredential,
285
+ kmsKeyRef: 'testRef',
286
+ identifierMethod: 'did',
267
287
  issuerCorrelationType: CredentialCorrelationType.DID,
268
288
  subjectCorrelationType: CredentialCorrelationType.DID,
269
289
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -287,6 +307,8 @@ describe('Database entities tests', (): void => {
287
307
  'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
288
308
  const digitalCredential: AddCredentialArgs = {
289
309
  rawDocument: rawCredential,
310
+ kmsKeyRef: 'testRef',
311
+ identifierMethod: 'did',
290
312
  issuerCorrelationType: CredentialCorrelationType.DID,
291
313
  subjectCorrelationType: CredentialCorrelationType.DID,
292
314
  issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
@@ -1,14 +1,15 @@
1
1
  import { AbstractDigitalCredentialStore } from './AbstractDigitalCredentialStore'
2
2
  import {
3
3
  AddCredentialArgs,
4
+ CredentialRole,
5
+ CredentialStateType,
6
+ DigitalCredential,
4
7
  GetCredentialArgs,
5
8
  GetCredentialsArgs,
6
9
  GetCredentialsResponse,
10
+ NonPersistedDigitalCredential,
7
11
  RemoveCredentialArgs,
8
12
  UpdateCredentialStateArgs,
9
- CredentialStateType,
10
- DigitalCredential,
11
- NonPersistedDigitalCredential,
12
13
  } from '../types'
13
14
  import { OrPromise } from '@sphereon/ssi-types'
14
15
  import { DataSource, FindOptionsOrder, Repository } from 'typeorm'
@@ -26,6 +27,7 @@ const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:credential-store')
26
27
 
27
28
  export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
28
29
  private readonly dbConnection: OrPromise<DataSource>
30
+ private dcRepo: Repository<DigitalCredentialEntity> | undefined
29
31
 
30
32
  constructor(dbConnection: OrPromise<DataSource>) {
31
33
  super()
@@ -34,14 +36,19 @@ export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
34
36
 
35
37
  addCredential = async (args: AddCredentialArgs): Promise<DigitalCredential> => {
36
38
  debug('Adding credential', args)
37
- const digitalCredentialEntityRepository: Repository<DigitalCredentialEntity> = (await this.dbConnection).getRepository(DigitalCredentialEntity)
38
39
  const credentialEntity: NonPersistedDigitalCredential = nonPersistedDigitalCredentialEntityFromAddArgs(args)
39
- const createdResult: DigitalCredentialEntity = await digitalCredentialEntityRepository.save(credentialEntity)
40
+ const validationError = this.assertValidDigitalCredential(credentialEntity)
41
+ if (validationError) {
42
+ return Promise.reject(validationError)
43
+ }
44
+ const dcRepo = await this.getRepository()
45
+ const createdResult: DigitalCredentialEntity = await dcRepo.save(credentialEntity)
40
46
  return Promise.resolve(digitalCredentialFrom(createdResult))
41
47
  }
42
48
 
43
49
  getCredential = async (args: GetCredentialArgs): Promise<DigitalCredential> => {
44
- const result: DigitalCredentialEntity | null = await (await this.dbConnection).getRepository(DigitalCredentialEntity).findOne({
50
+ const dcRepo = await this.getRepository()
51
+ const result: DigitalCredentialEntity | null = await dcRepo.findOne({
45
52
  where: args,
46
53
  })
47
54
 
@@ -57,7 +64,8 @@ export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
57
64
  order && typeof order === 'string'
58
65
  ? parseAndValidateOrderOptions<DigitalCredentialEntity>(order)
59
66
  : <FindOptionsOrder<DigitalCredentialEntity>>order
60
- const [result, total] = await (await this.dbConnection).getRepository(DigitalCredentialEntity).findAndCount({
67
+ const dcRepo = await this.getRepository()
68
+ const [result, total] = await dcRepo.findAndCount({
61
69
  where: filter,
62
70
  skip: offset,
63
71
  take: limit,
@@ -84,15 +92,42 @@ export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
84
92
  return false
85
93
  }
86
94
  try {
87
- const connection = await this.dbConnection
88
- const result = await connection.getRepository(DigitalCredentialEntity).delete(query)
89
- return result.affected === 1
95
+ const dcRepo = await this.getRepository()
96
+ // TODO create a flag whether we want to delete recursively or return an error when there are child credentials?
97
+ const affected = await this.deleteTree(dcRepo, query)
98
+ return affected > 0
90
99
  } catch (error) {
91
100
  console.error('Error removing digital credential:', error)
92
101
  return false
93
102
  }
94
103
  }
95
104
 
105
+ private async deleteTree(dcRepo: Repository<DigitalCredentialEntity>, query: FindOptionsWhere<DigitalCredentialEntity>): Promise<number> {
106
+ let affected: number = 0
107
+ const findResult = await dcRepo.findBy(query)
108
+ for (const dc of findResult) {
109
+ if (dc.parentId !== null && dc.parentId !== undefined) {
110
+ affected += await this.deleteTree(dcRepo, { id: dc.parentId })
111
+ }
112
+ const result = await dcRepo.delete(dc.id)
113
+ if (result.affected) {
114
+ affected += result.affected
115
+ }
116
+ }
117
+ return affected
118
+ }
119
+
120
+ private async getRepository(): Promise<Repository<DigitalCredentialEntity>> {
121
+ if (this.dcRepo !== undefined) {
122
+ return Promise.resolve(this.dcRepo)
123
+ }
124
+ this.dcRepo = (await this.dbConnection).getRepository(DigitalCredentialEntity)
125
+ if (this.dcRepo === undefined) {
126
+ return Promise.reject(Error('Could not get DigitalCredentialEntity repository'))
127
+ }
128
+ return this.dcRepo
129
+ }
130
+
96
131
  updateCredentialState = async (args: UpdateCredentialStateArgs): Promise<DigitalCredential> => {
97
132
  const credentialRepository: Repository<DigitalCredentialEntity> = (await this.dbConnection).getRepository(DigitalCredentialEntity)
98
133
  const whereClause: Record<string, any> = {}
@@ -123,6 +158,7 @@ export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
123
158
  ...credential,
124
159
  ...(args.verifiedState !== CredentialStateType.REVOKED && { verifiedAt: args.verifiedAt }),
125
160
  ...(args.verifiedState === CredentialStateType.REVOKED && { revokedAt: args.revokedAt }),
161
+ identifierMethod: credential.identifierMethod,
126
162
  lastUpdatedAt: new Date(),
127
163
  verifiedState: args.verifiedState,
128
164
  }
@@ -130,4 +166,24 @@ export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
130
166
  const updatedResult: DigitalCredentialEntity = await credentialRepository.save(updatedCredential, { transaction: true })
131
167
  return digitalCredentialFrom(updatedResult)
132
168
  }
169
+
170
+ private assertValidDigitalCredential(credentialEntity: NonPersistedDigitalCredential): Error | undefined {
171
+ const { kmsKeyRef, identifierMethod, credentialRole, isIssuerSigned } = credentialEntity
172
+
173
+ const isRoleInvalid = credentialRole === CredentialRole.ISSUER || (credentialRole === CredentialRole.HOLDER && !isIssuerSigned)
174
+
175
+ if (isRoleInvalid && (!kmsKeyRef || !identifierMethod)) {
176
+ const missingFields = []
177
+
178
+ if (!kmsKeyRef) missingFields.push('kmsKeyRef')
179
+ if (!identifierMethod) missingFields.push('identifierMethod')
180
+
181
+ const fields = missingFields.join(' and ')
182
+ return new Error(
183
+ `DigitalCredential field(s) ${fields} is/are required for credential role ${credentialRole} with isIssuerSigned=${isIssuerSigned}.`,
184
+ )
185
+ }
186
+
187
+ return undefined
188
+ }
133
189
  }
@@ -6,6 +6,7 @@ import {
6
6
  CredentialStateType,
7
7
  DigitalCredential,
8
8
  DocumentType,
9
+ RegulationType,
9
10
  } from '../../types'
10
11
  import { typeormDate, typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
11
12
 
@@ -14,9 +15,15 @@ export class DigitalCredentialEntity extends BaseEntity implements DigitalCreden
14
15
  @PrimaryGeneratedColumn('uuid')
15
16
  id!: string
16
17
 
18
+ @Column('text', { name: 'parent_id', nullable: true })
19
+ parentId?: string
20
+
17
21
  @Column('simple-enum', { name: 'document_type', enum: DocumentType, nullable: false })
18
22
  documentType!: DocumentType
19
23
 
24
+ @Column('simple-enum', { name: 'regulation_type', enum: RegulationType, nullable: false })
25
+ regulationType!: RegulationType
26
+
20
27
  @Column('simple-enum', { name: 'document_format', enum: CredentialDocumentFormat, nullable: false })
21
28
  documentFormat!: CredentialDocumentFormat
22
29
 
@@ -35,18 +42,33 @@ export class DigitalCredentialEntity extends BaseEntity implements DigitalCreden
35
42
  @Column('text', { name: 'hash', nullable: false, unique: true })
36
43
  hash!: string
37
44
 
45
+ @Column('text', { name: 'kms_key_ref', nullable: true })
46
+ kmsKeyRef!: string
47
+
48
+ @Column('text', { name: 'identifier_method', nullable: true })
49
+ identifierMethod!: string
50
+
38
51
  @Column('simple-enum', { name: 'issuer_correlation_type', enum: CredentialCorrelationType, nullable: false })
39
52
  issuerCorrelationType!: CredentialCorrelationType
40
53
 
41
54
  @Column('simple-enum', { name: 'subject_correlation_type', enum: CredentialCorrelationType, nullable: true })
42
55
  subjectCorrelationType?: CredentialCorrelationType
43
56
 
57
+ @Column('simple-enum', { name: 'rp_correlation_type', enum: CredentialCorrelationType, nullable: true })
58
+ rpCorrelationType?: CredentialCorrelationType
59
+
60
+ @Column('boolean', { name: 'issuer_signed', nullable: true })
61
+ isIssuerSigned?: boolean
62
+
44
63
  @Column('text', { name: 'issuer_correlation_id', nullable: false })
45
64
  issuerCorrelationId!: string
46
65
 
47
66
  @Column('text', { name: 'subject_correlation_id', nullable: true })
48
67
  subjectCorrelationId?: string
49
68
 
69
+ @Column('text', { name: 'rp_correlation_id', nullable: true })
70
+ rpCorrelationId?: string
71
+
50
72
  @Column('simple-enum', { name: 'verified_state', enum: CredentialStateType, nullable: true })
51
73
  verifiedState?: CredentialStateType
52
74
 
@@ -56,6 +78,9 @@ export class DigitalCredentialEntity extends BaseEntity implements DigitalCreden
56
78
  @CreateDateColumn({ name: 'created_at', nullable: false, type: typeOrmDateTime() })
57
79
  createdAt!: Date
58
80
 
81
+ @Column({ name: 'presented_at', nullable: true, type: typeormDate() })
82
+ presentedAt?: Date
83
+
59
84
  @UpdateDateColumn({ name: 'last_updated_at', nullable: false, type: typeOrmDateTime() })
60
85
  lastUpdatedAt!: Date
61
86
 
@@ -4,7 +4,6 @@ import { AuditLoggingEvent } from '@sphereon/ssi-sdk.core'
4
4
  import { OrPromise } from '@sphereon/ssi-types'
5
5
  import { AbstractEventLoggerStore } from './AbstractEventLoggerStore'
6
6
  import { AuditEventEntity, auditEventEntityFrom } from '../entities/eventLogger/AuditEventEntity'
7
- import { auditEventFrom } from '../utils/eventLogger/MappingUtils'
8
7
  import { GetAuditEventsArgs, StoreAuditEventArgs } from '../types'
9
8
 
10
9
  const debug: Debugger = Debug('sphereon:ssi-sdk:event-store')
@@ -24,7 +23,7 @@ export class EventLoggerStore extends AbstractEventLoggerStore {
24
23
  ...(args?.filter && { where: args?.filter }),
25
24
  })
26
25
 
27
- return result.map((event: AuditEventEntity) => auditEventFrom(event))
26
+ return result.map((event: AuditEventEntity) => this.auditEventFrom(event))
28
27
  }
29
28
 
30
29
  storeAuditEvent = async (args: StoreAuditEventArgs): Promise<AuditLoggingEvent> => {
@@ -35,6 +34,29 @@ export class EventLoggerStore extends AbstractEventLoggerStore {
35
34
  debug('Storing audit event', auditEventEntity)
36
35
  const createdResult: AuditEventEntity = await connection.getRepository(AuditEventEntity).save(auditEventEntity)
37
36
 
38
- return auditEventFrom(createdResult)
37
+ return this.auditEventFrom(createdResult)
38
+ }
39
+
40
+ private auditEventFrom = (event: AuditEventEntity): AuditLoggingEvent => {
41
+ return {
42
+ id: event.id,
43
+ description: event.description,
44
+ timestamp: event.timestamp,
45
+ level: event.level,
46
+ correlationId: event.correlationId,
47
+ actionType: event.actionType,
48
+ actionSubType: event.actionSubType,
49
+ initiatorType: event.initiatorType,
50
+ partyAlias: event.partyAlias,
51
+ partyCorrelationId: event.partyCorrelationId,
52
+ partyCorrelationType: event.partyCorrelationType,
53
+ subSystemType: event.subSystemType,
54
+ system: event.system,
55
+ systemAlias: event.systemAlias,
56
+ systemCorrelationId: event.systemCorrelationId,
57
+ systemCorrelationIdType: event.systemCorrelationIdType,
58
+ ...(event.data && { data: JSON.parse(event.data) }),
59
+ ...(event.diagnosticData && { diagnosticData: JSON.parse(event.diagnosticData) }),
60
+ }
39
61
  }
40
62
  }
package/src/index.ts CHANGED
@@ -156,3 +156,5 @@ export {
156
156
  isPresentationDefinitionEqual,
157
157
  ContactMetadataItemEntity,
158
158
  }
159
+
160
+ export * from './utils/hasher'
@@ -11,7 +11,6 @@ import { IssuerLocaleBrandingEntity, issuerLocaleBrandingEntityFrom } from '../e
11
11
  import { BaseLocaleBrandingEntity } from '../entities/issuanceBranding/BaseLocaleBrandingEntity'
12
12
  import { TextAttributesEntity } from '../entities/issuanceBranding/TextAttributesEntity'
13
13
  import { AbstractIssuanceBrandingStore } from './AbstractIssuanceBrandingStore'
14
- import { credentialBrandingFrom, issuerBrandingFrom, localeBrandingFrom } from '../utils/issuanceBranding/MappingUtils'
15
14
  import {
16
15
  IAddCredentialBrandingArgs,
17
16
  IAddCredentialLocaleBrandingArgs,
@@ -31,6 +30,7 @@ import {
31
30
  IIssuerBrandingFilter,
32
31
  IIssuerLocaleBranding,
33
32
  IIssuerLocaleBrandingFilter,
33
+ ILocaleBranding,
34
34
  IRemoveCredentialBrandingArgs,
35
35
  IRemoveCredentialLocaleBrandingArgs,
36
36
  IRemoveIssuerBrandingArgs,
@@ -42,7 +42,6 @@ import {
42
42
  ICredentialBrandingFilter,
43
43
  } from '../types'
44
44
 
45
-
46
45
  const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:issuance-branding-store')
47
46
 
48
47
  export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
@@ -72,7 +71,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
72
71
  debug('Adding credential branding', credentialBrandingEntity)
73
72
  const createdResult: CredentialBrandingEntity = await repository.save(credentialBrandingEntity)
74
73
 
75
- return credentialBrandingFrom(createdResult)
74
+ return this.credentialBrandingFrom(createdResult)
76
75
  }
77
76
 
78
77
  public getCredentialBranding = async (args?: IGetCredentialBrandingArgs): Promise<Array<ICredentialBranding>> => {
@@ -90,7 +89,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
90
89
  ...(filter && { where: filter }),
91
90
  })
92
91
 
93
- return result.map((credentialBranding: CredentialBrandingEntity) => credentialBrandingFrom(credentialBranding))
92
+ return result.map((credentialBranding: CredentialBrandingEntity) => this.credentialBrandingFrom(credentialBranding))
94
93
  }
95
94
 
96
95
  public removeCredentialBranding = async (args: IRemoveCredentialBrandingArgs): Promise<void> => {
@@ -134,7 +133,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
134
133
  debug('Updating credential branding', branding)
135
134
  const result: CredentialBrandingEntity = await repository.save(branding, { transaction: true })
136
135
 
137
- return credentialBrandingFrom(result)
136
+ return this.credentialBrandingFrom(result)
138
137
  }
139
138
 
140
139
  public addCredentialLocaleBranding = async (args: IAddCredentialLocaleBrandingArgs): Promise<ICredentialBranding> => {
@@ -189,7 +188,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
189
188
  return Promise.reject(Error('Unable to get updated credential branding'))
190
189
  }
191
190
 
192
- return credentialBrandingFrom(result)
191
+ return this.credentialBrandingFrom(result)
193
192
  }
194
193
 
195
194
  public getCredentialLocaleBranding = async (args?: IGetCredentialLocaleBrandingArgs): Promise<Array<ICredentialLocaleBranding>> => {
@@ -212,7 +211,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
212
211
  return credentialBrandingLocale
213
212
  ? credentialBrandingLocale.map(
214
213
  (credentialLocaleBranding: CredentialLocaleBrandingEntity) =>
215
- localeBrandingFrom(credentialLocaleBranding) as ICredentialLocaleBranding,
214
+ this.localeBrandingFrom(credentialLocaleBranding) as ICredentialLocaleBranding,
216
215
  )
217
216
  : []
218
217
  }
@@ -260,7 +259,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
260
259
  debug('Updating credential locale branding', localeBranding)
261
260
  const updatedResult: CredentialLocaleBrandingEntity = await repository.save(localeBranding, { transaction: true })
262
261
 
263
- return localeBrandingFrom(updatedResult) as ICredentialLocaleBranding
262
+ return this.localeBrandingFrom(updatedResult) as ICredentialLocaleBranding
264
263
  }
265
264
 
266
265
  public addIssuerBranding = async (args: IAddIssuerBrandingArgs): Promise<IIssuerBranding> => {
@@ -282,7 +281,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
282
281
  debug('Adding issuer branding', issuerBrandingEntity)
283
282
  const createdResult: IssuerBrandingEntity = await repository.save(issuerBrandingEntity)
284
283
 
285
- return issuerBrandingFrom(createdResult)
284
+ return this.issuerBrandingFrom(createdResult)
286
285
  }
287
286
 
288
287
  public getIssuerBranding = async (args?: IGetIssuerBrandingArgs): Promise<Array<IIssuerBranding>> => {
@@ -300,7 +299,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
300
299
  ...(filter && { where: filter }),
301
300
  })
302
301
 
303
- return result.map((issuerBranding: IssuerBrandingEntity) => issuerBrandingFrom(issuerBranding))
302
+ return result.map((issuerBranding: IssuerBrandingEntity) => this.issuerBrandingFrom(issuerBranding))
304
303
  }
305
304
 
306
305
  public removeIssuerBranding = async (args: IRemoveIssuerBrandingArgs): Promise<void> => {
@@ -344,7 +343,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
344
343
  debug('Updating issuer branding', branding)
345
344
  const result: IssuerBrandingEntity = await repository.save(branding, { transaction: true })
346
345
 
347
- return issuerBrandingFrom(result)
346
+ return this.issuerBrandingFrom(result)
348
347
  }
349
348
 
350
349
  public addIssuerLocaleBranding = async (args: IAddIssuerLocaleBrandingArgs): Promise<IIssuerBranding> => {
@@ -395,7 +394,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
395
394
  return Promise.reject(Error('Unable to get updated issuer branding'))
396
395
  }
397
396
 
398
- return issuerBrandingFrom(result)
397
+ return this.issuerBrandingFrom(result)
399
398
  }
400
399
 
401
400
  public getIssuerLocaleBranding = async (args?: IGetIssuerLocaleBrandingArgs): Promise<Array<IIssuerLocaleBranding>> => {
@@ -417,7 +416,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
417
416
 
418
417
  return issuerLocaleBranding
419
418
  ? issuerLocaleBranding.map(
420
- (issuerLocaleBranding: IssuerLocaleBrandingEntity) => localeBrandingFrom(issuerLocaleBranding) as IIssuerLocaleBranding,
419
+ (issuerLocaleBranding: IssuerLocaleBrandingEntity) => this.localeBrandingFrom(issuerLocaleBranding) as IIssuerLocaleBranding,
421
420
  )
422
421
  : []
423
422
  }
@@ -463,7 +462,56 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
463
462
  debug('Updating issuer locale branding', localeBranding)
464
463
  const updatedResult: IssuerLocaleBrandingEntity = await repository.save(localeBranding, { transaction: true })
465
464
 
466
- return localeBrandingFrom(updatedResult) as IIssuerLocaleBranding
465
+ return this.localeBrandingFrom(updatedResult) as IIssuerLocaleBranding
466
+ }
467
+
468
+ private credentialBrandingFrom = (credentialBranding: CredentialBrandingEntity): ICredentialBranding => {
469
+ const result: ICredentialBranding = {
470
+ ...credentialBranding,
471
+ localeBranding: credentialBranding.localeBranding.map((localeBranding: BaseLocaleBrandingEntity) => this.localeBrandingFrom(localeBranding)),
472
+ }
473
+
474
+ return this.replaceNullWithUndefined(result)
475
+ }
476
+
477
+ private issuerBrandingFrom = (issuerBranding: IssuerBrandingEntity): IIssuerBranding => {
478
+ const result: IIssuerBranding = {
479
+ ...issuerBranding,
480
+ localeBranding: issuerBranding.localeBranding.map((localeBranding: BaseLocaleBrandingEntity) => this.localeBrandingFrom(localeBranding)),
481
+ }
482
+
483
+ return this.replaceNullWithUndefined(result)
484
+ }
485
+
486
+ private localeBrandingFrom = (localeBranding: BaseLocaleBrandingEntity): ILocaleBranding => {
487
+ const result: ILocaleBranding = {
488
+ ...localeBranding,
489
+ locale: localeBranding.locale === '' ? undefined : localeBranding.locale,
490
+ }
491
+
492
+ return this.replaceNullWithUndefined(result)
493
+ }
494
+
495
+ private replaceNullWithUndefined(obj: any): any {
496
+ if (obj === null) {
497
+ return undefined
498
+ }
499
+
500
+ if (typeof obj !== 'object' || obj instanceof Date) {
501
+ return obj
502
+ }
503
+
504
+ if (Array.isArray(obj)) {
505
+ return obj.map((value: any) => this.replaceNullWithUndefined(value))
506
+ }
507
+
508
+ const result: any = {}
509
+ for (const key in obj) {
510
+ if (obj.hasOwnProperty(key)) {
511
+ result[key] = this.replaceNullWithUndefined(obj[key])
512
+ }
513
+ }
514
+ return result
467
515
  }
468
516
 
469
517
  private hasDuplicateLocales = async (localeBranding: Array<IBasicCredentialLocaleBranding | IBasicIssuerLocaleBranding>): Promise<boolean> => {
@@ -5,34 +5,46 @@ export class CreateDigitalCredential1708525189001 implements MigrationInterface
5
5
 
6
6
  public async up(queryRunner: QueryRunner): Promise<void> {
7
7
  await queryRunner.query(`CREATE TYPE "digital_document_type" AS ENUM('VC', 'VP', 'C', 'P')`)
8
- await queryRunner.query(`CREATE TYPE "digital_credential_document_format" AS ENUM('JSON_LD', 'JWT', 'SD_JWT', 'MDOC')`)
8
+ await queryRunner.query(`CREATE TYPE "digital_regulation_type" AS ENUM('PID', 'QEAA', 'EAA', 'NON_REGULATED')`)
9
+ await queryRunner.query(`CREATE TYPE "digital_credential_document_format" AS ENUM('JSON_LD', 'JWT', 'SD_JWT', 'MSO_MDOC')`)
9
10
  await queryRunner.query(`CREATE TYPE "digital_credential_credential_role" AS ENUM('ISSUER', 'VERIFIER', 'HOLDER')`)
10
- await queryRunner.query(`CREATE TYPE "digital_credential_correlation_type" AS ENUM('DID', 'URL', 'X509_CN')`)
11
+ await queryRunner.query(`CREATE TYPE "digital_credential_correlation_type" AS ENUM('DID', 'KID', 'URL', 'X509_SAN')`)
11
12
  await queryRunner.query(`CREATE TYPE "digital_credential_state_type" AS ENUM('REVOKED', 'VERIFIED', 'EXPIRED')`)
12
13
 
14
+ // TODO FK for parent
15
+
13
16
  await queryRunner.query(`
14
17
  CREATE TABLE "DigitalCredential" (
15
18
  "id" uuid NOT NULL DEFAULT uuid_generate_v4(),
19
+ "parent_id" text,
16
20
  "document_type" "digital_document_type" NOT NULL,
21
+ "regulation_type" "digital_regulation_type" NOT NULL DEFAULT 'NON_REGULATED'::"digital_regulation_type",
17
22
  "document_format" "digital_credential_document_format" NOT NULL,
18
23
  "credential_role" "digital_credential_credential_role" NOT NULL,
19
24
  "raw_document" text NOT NULL,
20
25
  "uniform_document" text NOT NULL,
21
26
  "credential_id" text,
22
- "hash" text NOT NULL UNIQUE,
27
+ "hash" text NOT NULL,
28
+ "kms_key_ref" text,
29
+ "identifier_method" text,
23
30
  "issuer_correlation_type" "digital_credential_correlation_type" NOT NULL,
24
31
  "subject_correlation_type" "digital_credential_correlation_type",
25
32
  "issuer_correlation_id" text NOT NULL,
26
33
  "subject_correlation_id" text,
27
34
  "verified_state" "digital_credential_state_type",
35
+ "issuer_signed" boolean,
36
+ "rp_correlation_id" text,
37
+ "rp_correlation_type" "digital_credential_correlation_type",
28
38
  "tenant_id" text,
29
39
  "created_at" TIMESTAMP NOT NULL DEFAULT now(),
30
40
  "last_updated_at" TIMESTAMP NOT NULL DEFAULT now(),
41
+ "presented_at" DATE,
31
42
  "valid_from" DATE,
32
43
  "valid_until" DATE,
33
44
  "verified_at" DATE,
34
45
  "revoked_at" DATE,
35
- PRIMARY KEY ("id")
46
+ PRIMARY KEY ("id"),
47
+ UNIQUE ("hash", "credential_role")
36
48
  )
37
49
  `)
38
50
  }
@@ -43,6 +55,7 @@ export class CreateDigitalCredential1708525189001 implements MigrationInterface
43
55
  await queryRunner.query(`DROP TYPE "digital_credential_correlation_type"`)
44
56
  await queryRunner.query(`DROP TYPE "digital_credential_document_format"`)
45
57
  await queryRunner.query(`DROP TYPE "digital_credential_credential_role"`)
58
+ await queryRunner.query(`DROP TYPE "digital_regulation_type"`)
46
59
  await queryRunner.query(`DROP TYPE "digital_document_type"`)
47
60
  }
48
61
  }
@@ -4,28 +4,38 @@ export class CreateDigitalCredential1708525189002 implements MigrationInterface
4
4
  name = 'CreateDigitalCredential1708525189002'
5
5
 
6
6
  public async up(queryRunner: QueryRunner): Promise<void> {
7
+ // TODO FK for parent
7
8
  await queryRunner.query(`
8
9
  CREATE TABLE "DigitalCredential" (
9
10
  "id" varchar PRIMARY KEY NOT NULL,
11
+ "parent_id" text,
10
12
  "document_type" varchar CHECK( "document_type" IN ('VC', 'VP', 'C', 'P') ) NOT NULL,
11
- "document_format" varchar CHECK( "document_format" IN ('JSON_LD', 'JWT', 'SD_JWT', 'MDOC') ) NOT NULL,
13
+ "regulation_type" varchar CHECK( "regulation_type" IN ('PID', 'QEAA', 'EAA', 'NON_REGULATED') ) NOT NULL DEFAULT 'NON_REGULATED',
14
+ "document_format" varchar CHECK( "document_format" IN ('JSON_LD', 'JWT', 'SD_JWT', 'MSO_MDOC') ) NOT NULL,
12
15
  "credential_role" varchar CHECK( "credential_role" IN ('ISSUER', 'VERIFIER', 'HOLDER') ) NOT NULL,
13
16
  "raw_document" text NOT NULL,
14
17
  "uniform_document" text NOT NULL,
15
18
  "credential_id" text,
16
- "hash" text NOT NULL UNIQUE,
17
- "issuer_correlation_type" varchar CHECK( "issuer_correlation_type" IN ('DID', 'URL', 'X509_CN') ) NOT NULL,
18
- "subject_correlation_type" varchar CHECK( "subject_correlation_type" IN ('DID', 'URL', 'X509_CN') ),
19
+ "hash" text NOT NULL,
20
+ "kms_key_ref" text,
21
+ "identifier_method" text,
22
+ "issuer_correlation_type" varchar CHECK( "issuer_correlation_type" IN ('DID', 'KID', 'URL', 'X509_SAN') ) NOT NULL,
23
+ "subject_correlation_type" varchar CHECK( "subject_correlation_type" IN ('DID', 'KID', 'URL', 'X509_SAN') ),
19
24
  "issuer_correlation_id" text NOT NULL,
20
25
  "subject_correlation_id" text,
26
+ "issuer_signed" boolean,
27
+ "rp_correlation_id" text,
28
+ "rp_correlation_type" varchar CHECK( "issuer_correlation_type" IN ('DID', 'KID', 'URL', 'X509_SAN') ),
21
29
  "verified_state" varchar CHECK( "verified_state" IN ('REVOKED', 'VERIFIED', 'EXPIRED') ),
22
30
  "tenant_id" text,
23
31
  "created_at" datetime NOT NULL DEFAULT (datetime('now')),
24
32
  "last_updated_at" datetime NOT NULL DEFAULT (datetime('now')),
33
+ "presented_at" datetime,
25
34
  "valid_from" datetime,
26
35
  "valid_until" datetime,
27
36
  "verified_at" datetime,
28
- "revoked_at" datetime
37
+ "revoked_at" datetime,
38
+ UNIQUE ("hash", "credential_role")
29
39
  )
30
40
  `)
31
41
  }