@sphereon/ssi-sdk.data-store 0.18.2-unstable.97 → 0.19.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 (84) hide show
  1. package/dist/contact/AbstractContactStore.d.ts.map +1 -1
  2. package/dist/contact/AbstractContactStore.js.map +1 -1
  3. package/dist/contact/ContactStore.d.ts.map +1 -1
  4. package/dist/contact/ContactStore.js +12 -6
  5. package/dist/contact/ContactStore.js.map +1 -1
  6. package/dist/index.d.ts +2 -5
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -10
  9. package/dist/index.js.map +1 -1
  10. package/dist/issuanceBranding/IssuanceBrandingStore.d.ts.map +1 -1
  11. package/dist/issuanceBranding/IssuanceBrandingStore.js.map +1 -1
  12. package/dist/migrations/generic/index.d.ts +0 -2
  13. package/dist/migrations/generic/index.d.ts.map +1 -1
  14. package/dist/migrations/generic/index.js +1 -4
  15. package/dist/migrations/generic/index.js.map +1 -1
  16. package/dist/migrations/index.d.ts +1 -1
  17. package/dist/migrations/index.d.ts.map +1 -1
  18. package/dist/migrations/index.js +1 -2
  19. package/dist/migrations/index.js.map +1 -1
  20. package/dist/types/contact/contact.d.ts.map +1 -1
  21. package/dist/types/contact/contact.js.map +1 -1
  22. package/package.json +4 -5
  23. package/src/__tests__/contact.entities.test.ts +32 -15
  24. package/src/__tests__/contact.store.test.ts +71 -28
  25. package/src/contact/AbstractContactStore.ts +3 -2
  26. package/src/contact/ContactStore.ts +15 -9
  27. package/src/entities/contact/PhysicalAddressEntity.ts +1 -1
  28. package/src/index.ts +0 -9
  29. package/src/issuanceBranding/IssuanceBrandingStore.ts +6 -8
  30. package/src/migrations/generic/index.ts +0 -3
  31. package/src/migrations/index.ts +0 -1
  32. package/src/types/contact/contact.ts +13 -2
  33. package/dist/digitalCredential/AbstractDigitalCredentialStore.d.ts +0 -10
  34. package/dist/digitalCredential/AbstractDigitalCredentialStore.d.ts.map +0 -1
  35. package/dist/digitalCredential/AbstractDigitalCredentialStore.js +0 -7
  36. package/dist/digitalCredential/AbstractDigitalCredentialStore.js.map +0 -1
  37. package/dist/digitalCredential/DigitalCredentialStore.d.ts +0 -15
  38. package/dist/digitalCredential/DigitalCredentialStore.d.ts.map +0 -1
  39. package/dist/digitalCredential/DigitalCredentialStore.js +0 -116
  40. package/dist/digitalCredential/DigitalCredentialStore.js.map +0 -1
  41. package/dist/entities/digitalCredential/DigitalCredentialEntity.d.ts +0 -23
  42. package/dist/entities/digitalCredential/DigitalCredentialEntity.d.ts.map +0 -1
  43. package/dist/entities/digitalCredential/DigitalCredentialEntity.js +0 -93
  44. package/dist/entities/digitalCredential/DigitalCredentialEntity.js.map +0 -1
  45. package/dist/migrations/generic/6-CreateDigitalCredential.d.ts +0 -7
  46. package/dist/migrations/generic/6-CreateDigitalCredential.d.ts.map +0 -1
  47. package/dist/migrations/generic/6-CreateDigitalCredential.js +0 -78
  48. package/dist/migrations/generic/6-CreateDigitalCredential.js.map +0 -1
  49. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.d.ts +0 -7
  50. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.d.ts.map +0 -1
  51. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.js +0 -59
  52. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.js.map +0 -1
  53. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.d.ts +0 -7
  54. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.d.ts.map +0 -1
  55. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.js +0 -50
  56. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.js.map +0 -1
  57. package/dist/types/digitalCredential/IAbstractDigitalCredentialStore.d.ts +0 -40
  58. package/dist/types/digitalCredential/IAbstractDigitalCredentialStore.d.ts.map +0 -1
  59. package/dist/types/digitalCredential/IAbstractDigitalCredentialStore.js +0 -3
  60. package/dist/types/digitalCredential/IAbstractDigitalCredentialStore.js.map +0 -1
  61. package/dist/types/digitalCredential/digitalCredential.d.ts +0 -42
  62. package/dist/types/digitalCredential/digitalCredential.d.ts.map +0 -1
  63. package/dist/types/digitalCredential/digitalCredential.js +0 -28
  64. package/dist/types/digitalCredential/digitalCredential.js.map +0 -1
  65. package/dist/utils/SortingUtils.d.ts +0 -3
  66. package/dist/utils/SortingUtils.d.ts.map +0 -1
  67. package/dist/utils/SortingUtils.js +0 -18
  68. package/dist/utils/SortingUtils.js.map +0 -1
  69. package/dist/utils/digitalCredential/MappingUtils.d.ts +0 -7
  70. package/dist/utils/digitalCredential/MappingUtils.d.ts.map +0 -1
  71. package/dist/utils/digitalCredential/MappingUtils.js +0 -99
  72. package/dist/utils/digitalCredential/MappingUtils.js.map +0 -1
  73. package/src/__tests__/digitalCredential.entities.test.ts +0 -251
  74. package/src/__tests__/digitalCredential.store.test.ts +0 -289
  75. package/src/digitalCredential/AbstractDigitalCredentialStore.ts +0 -17
  76. package/src/digitalCredential/DigitalCredentialStore.ts +0 -124
  77. package/src/entities/digitalCredential/DigitalCredentialEntity.ts +0 -64
  78. package/src/migrations/generic/6-CreateDigitalCredential.ts +0 -66
  79. package/src/migrations/postgres/1708525189001-CreateDigitalCredential.ts +0 -44
  80. package/src/migrations/sqlite/1708525189002-CreateDigitalCredential.ts +0 -34
  81. package/src/types/digitalCredential/IAbstractDigitalCredentialStore.ts +0 -35
  82. package/src/types/digitalCredential/digitalCredential.ts +0 -46
  83. package/src/utils/SortingUtils.ts +0 -16
  84. package/src/utils/digitalCredential/MappingUtils.ts +0 -122
@@ -1,289 +0,0 @@
1
- import { DataSource } from 'typeorm'
2
- import { DataStoreDigitalCredentialMigrations } from '../migrations'
3
- import { DataStoreDigitalCredentialEntities } from '../index'
4
- import { DigitalCredentialStore } from '../digitalCredential/DigitalCredentialStore'
5
- import {
6
- CredentialCorrelationType,
7
- CredentialDocumentFormat,
8
- CredentialStateType,
9
- CredentialType,
10
- DigitalCredential,
11
- } from '../types/digitalCredential/digitalCredential'
12
- import { AddCredentialArgs, GetCredentialsArgs, GetCredentialsResponse } from '../types/digitalCredential/IAbstractDigitalCredentialStore'
13
- import { IVerifiablePresentation } from '@sphereon/ssi-types'
14
- import { createHash } from 'crypto'
15
-
16
- describe('Database entities tests', (): void => {
17
- let dbConnection: DataSource
18
- let digitalCredentialStore: DigitalCredentialStore
19
-
20
- beforeEach(async (): Promise<void> => {
21
- dbConnection = await new DataSource({
22
- type: 'sqlite',
23
- database: ':memory:',
24
- //logging: 'all',
25
- migrationsRun: false,
26
- migrations: DataStoreDigitalCredentialMigrations,
27
- synchronize: false,
28
- entities: DataStoreDigitalCredentialEntities,
29
- }).initialize()
30
- await dbConnection.runMigrations()
31
- expect(await dbConnection.showMigrations()).toBeFalsy()
32
- digitalCredentialStore = new DigitalCredentialStore(dbConnection)
33
- })
34
-
35
- afterEach(async (): Promise<void> => {
36
- await (await dbConnection).destroy()
37
- })
38
-
39
- it('should store digital credential', async (): Promise<void> => {
40
- const rawCredential: string =
41
- 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
42
- const digitalCredential: AddCredentialArgs = {
43
- raw: rawCredential,
44
- issuerCorrelationType: CredentialCorrelationType.DID,
45
- subjectCorrelationType: CredentialCorrelationType.DID,
46
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
47
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
48
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
49
- }
50
-
51
- const savedDigitalCredential: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential)
52
- expect(savedDigitalCredential).toBeDefined()
53
- })
54
-
55
- it('should throw error on storing digital credential sd_jwt with not-provided hasher', async (): Promise<void> => {
56
- const digitalCredential: AddCredentialArgs = {
57
- raw: 'eyJhbGciOiJFZERTQSIsInR5cCI6InZjK3NkLWp3dCIsImtpZCI6IiN6Nk1rdHF0WE5HOENEVVk5UHJydG9TdEZ6ZUNuaHBNbWd4WUwxZ2lrY1czQnp2TlcifQ.eyJ2Y3QiOiJJZGVudGl0eUNyZWRlbnRpYWwiLCJmYW1pbHlfbmFtZSI6IkRvZSIsInBob25lX251bWJlciI6IisxLTIwMi01NTUtMDEwMSIsImFkZHJlc3MiOnsic3RyZWV0X2FkZHJlc3MiOiIxMjMgTWFpbiBTdCIsImxvY2FsaXR5IjoiQW55dG93biIsIl9zZCI6WyJOSm5tY3QwQnFCTUUxSmZCbEM2alJRVlJ1ZXZwRU9OaVl3N0E3TUh1SnlRIiwib201Wnp0WkhCLUdkMDBMRzIxQ1ZfeE00RmFFTlNvaWFPWG5UQUpOY3pCNCJdfSwiY25mIjp7Imp3ayI6eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5IiwieCI6Im9FTlZzeE9VaUg1NFg4d0pMYVZraWNDUmswMHdCSVE0c1JnYms1NE44TW8ifX0sImlzcyI6ImRpZDprZXk6ejZNa3RxdFhORzhDRFVZOVBycnRvU3RGemVDbmhwTW1neFlMMWdpa2NXM0J6dk5XIiwiaWF0IjoxNjk4MTUxNTMyLCJfc2RfYWxnIjoic2hhLTI1NiIsIl9zZCI6WyIxQ3VyMmsyQTJvSUI1Q3NoU0lmX0FfS2ctbDI2dV9xS3VXUTc5UDBWZGFzIiwiUjF6VFV2T1lIZ2NlcGowakh5cEdIejlFSHR0VktmdDB5c3diYzlFVFBiVSIsImVEcVFwZFRYSlhiV2hmLUVzSTd6dzVYNk92WW1GTi1VWlFRTWVzWHdLUHciLCJwZERrMl9YQUtIbzdnT0Fmd0YxYjdPZENVVlRpdDJrSkhheFNFQ1E5eGZjIiwicHNhdUtVTldFaTA5bnUzQ2w4OXhLWGdtcFdFTlpsNXV5MU4xbnluX2pNayIsInNOX2dlMHBIWEY2cW1zWW5YMUE5U2R3SjhjaDhhRU5reGJPRHNUNzRZd0kiXX0.coOK8NzJmEWz4qx-qRhjo-RK7aejrSkQM9La9Cw3eWmzcja9DXrkBoQZKbIJtNoSzSPLjwK2V71W78z0miZsDQ~WyJzYWx0IiwiaXNfb3Zlcl82NSIsdHJ1ZV0~WyJzYWx0IiwiaXNfb3Zlcl8yMSIsdHJ1ZV0~WyJzYWx0IiwiZW1haWwiLCJqb2huZG9lQGV4YW1wbGUuY29tIl0~WyJzYWx0IiwiY291bnRyeSIsIlVTIl0~WyJzYWx0IiwiZ2l2ZW5fbmFtZSIsIkpvaG4iXQ~eyJhbGciOiJFZERTQSIsInR5cCI6ImtiK2p3dCJ9.eyJpYXQiOjE2OTgxNTE1MzIsIm5vbmNlIjoic2FsdCIsImF1ZCI6ImRpZDprZXk6elVDNzRWRXFxaEVIUWNndjR6YWdTUGtxRkp4dU5XdW9CUEtqSnVIRVRFVWVITG9TcVd0OTJ2aVNzbWFXank4MnkiLCJfc2RfaGFzaCI6Ii1kTUd4OGZhUnpOQm91a2EwU0R6V2JkS3JYckw1TFVmUlNQTHN2Q2xPMFkifQ.TQQLqc4ZzoKjQfAghAzC_4aaU3KCS8YqzxAJtzT124guzkv9XSHtPN8d3z181_v-ca2ATXjTRoRciozitE6wBA',
58
- issuerCorrelationType: CredentialCorrelationType.DID,
59
- subjectCorrelationType: CredentialCorrelationType.DID,
60
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
61
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
62
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
63
- }
64
-
65
- await expect(digitalCredentialStore.addCredential(digitalCredential)).rejects.toThrowError(
66
- 'No hasher function is provided for SD_JWT credential.'
67
- )
68
- })
69
-
70
- it('should get all digital credentials', async (): Promise<void> => {
71
- const addCredentialArgs1: AddCredentialArgs = {
72
- raw: 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw',
73
- issuerCorrelationType: CredentialCorrelationType.DID,
74
- subjectCorrelationType: CredentialCorrelationType.DID,
75
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
76
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
77
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
78
- }
79
- const addCredentialArgs2: AddCredentialArgs = {
80
- raw: 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDkyMTQxNzgsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJHdWVzdENyZWRlbnRpYWwiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiZmlyc3ROYW1lIjoiUyIsImxhc3ROYW1lIjoiSyIsIkUtbWFpbCI6IiIsInR5cGUiOiJTcGhlcmVvbiBHdWVzdCIsImlkIjoiZGlkOmp3azpleUpoYkdjaU9pSkZVekkxTmtzaUxDSjFjMlVpT2lKemFXY2lMQ0pyZEhraU9pSkZReUlzSW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW5naU9pSldjWGhIZVhWUk5WUTBXVEpzZGpKSFkybE9TaTFEYURCVWFGVm1kVk5RWm0wdFJYVlNZbGRNWlVOM0lpd2llU0k2SW01T1FWQnBiR0V5VDBRNGRXOXBXbk5LVm1aUmFrbDJTMUZUZWxBelFqVlBXbVZSYkVoQ1VUbHliVFFpZlEifX0sIkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJHdWVzdENyZWRlbnRpYWwiXSwiZXhwaXJhdGlvbkRhdGUiOiIyMDI0LTAyLTI5VDEzOjQyOjU4LjgzNVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiRS1tYWlsIjoiIiwidHlwZSI6IlNwaGVyZW9uIEd1ZXN0IiwiaWQiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOa3NpTENKMWMyVWlPaUp6YVdjaUxDSnJkSGtpT2lKRlF5SXNJbU55ZGlJNkluTmxZM0F5TlRack1TSXNJbmdpT2lKV2NYaEhlWFZSTlZRMFdUSnNkakpIWTJsT1NpMURhREJVYUZWbWRWTlFabTB0UlhWU1lsZE1aVU4zSWl3aWVTSTZJbTVPUVZCcGJHRXlUMFE0ZFc5cFduTktWbVpSYWtsMlMxRlRlbEF6UWpWUFdtVlJiRWhDVVRseWJUUWlmUSJ9LCJpc3N1ZXIiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOaUlzSW5WelpTSTZJbk5wWnlJc0ltdDBlU0k2SWtWRElpd2lZM0oySWpvaVVDMHlOVFlpTENKNElqb2lWRWN5U0RKNE1tUlhXRTR6ZFVOeFduQnhSakY1YzBGUVVWWkVTa1ZPWDBndFEwMTBZbWRxWWkxT1p5SXNJbmtpT2lJNVRUaE9lR1F3VUU0eU1rMDViRkJFZUdSd1JIQnZWRXg2TVRWM1pubGFTbk0yV21oTFNWVktNek00SW4wIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0yMlQxMzo0Mjo1OC44MzVaIiwic3ViIjoiZGlkOmp3azpleUpoYkdjaU9pSkZVekkxTmtzaUxDSjFjMlVpT2lKemFXY2lMQ0pyZEhraU9pSkZReUlzSW1OeWRpSTZJbk5sWTNBeU5UWnJNU0lzSW5naU9pSldjWGhIZVhWUk5WUTBXVEpzZGpKSFkybE9TaTFEYURCVWFGVm1kVk5RWm0wdFJYVlNZbGRNWlVOM0lpd2llU0k2SW01T1FWQnBiR0V5VDBRNGRXOXBXbk5LVm1aUmFrbDJTMUZUZWxBelFqVlBXbVZSYkVoQ1VUbHliVFFpZlEiLCJuYmYiOjE3MDg2MDkzNzgsImlzcyI6ImRpZDpqd2s6ZXlKaGJHY2lPaUpGVXpJMU5pSXNJblZ6WlNJNkluTnBaeUlzSW10MGVTSTZJa1ZESWl3aVkzSjJJam9pVUMweU5UWWlMQ0o0SWpvaVZFY3lTREo0TW1SWFdFNHpkVU54V25CeFJqRjVjMEZRVVZaRVNrVk9YMGd0UTAxMFltZHFZaTFPWnlJc0lua2lPaUk1VFRoT2VHUXdVRTR5TWswNWJGQkVlR1J3UkhCdlZFeDZNVFYzWm5sYVNuTTJXbWhMU1ZWS016TTRJbjAifQ.GgLRWHO674wu6QF_xUGbCi_2zDD8jNf_xoWNvH5K605xvBoz6qKx0ndmxLeGQWWUA-4VuAkznf3ROcp9wpgbEw',
81
- issuerCorrelationType: CredentialCorrelationType.DID,
82
- subjectCorrelationType: CredentialCorrelationType.DID,
83
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
84
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
85
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
86
- }
87
-
88
- const digitalCredential1: DigitalCredential = await digitalCredentialStore.addCredential(addCredentialArgs1)
89
- expect(digitalCredential1).toBeDefined()
90
- const digitalCredential2: DigitalCredential = await digitalCredentialStore.addCredential(addCredentialArgs2)
91
- expect(digitalCredential2).toBeDefined()
92
-
93
- const result: GetCredentialsResponse = await digitalCredentialStore.getCredentials()
94
- expect(result.total).toEqual(2)
95
- })
96
-
97
- it('should get digital credentials by filters and pagination', async (): Promise<void> => {
98
- const addCredentialArgs1: AddCredentialArgs = {
99
- raw: 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw',
100
- issuerCorrelationType: CredentialCorrelationType.DID,
101
- subjectCorrelationType: CredentialCorrelationType.DID,
102
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
103
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
104
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
105
- }
106
-
107
- const sampleVP: IVerifiablePresentation = {
108
- '@context': ['https://www.w3.org/2018/credentials/v1'],
109
- type: ['VerifiablePresentation'],
110
- verifiableCredential: [
111
- {
112
- '@context': ['https://www.w3.org/2018/credentials/v1', 'https://www.w3.org/2018/credentials/examples/v1'],
113
- id: 'https://example.com/credentials/1872',
114
- type: ['VerifiableCredential', 'IDCardCredential'],
115
- issuer: {
116
- id: 'did:example:issuer',
117
- },
118
- issuanceDate: '2010-01-01T19:23:24Z',
119
- credentialSubject: {
120
- given_name: 'Fredrik',
121
- family_name: 'Strömberg',
122
- birthdate: '1949-01-22',
123
- },
124
- proof: {
125
- type: 'Ed25519Signature2018',
126
- created: '2021-03-19T15:30:15Z',
127
- jws: 'eyJhb...IAoDA',
128
- proofPurpose: 'assertionMethod',
129
- verificationMethod: 'did:example:issuer#keys-1',
130
- },
131
- },
132
- ],
133
- id: 'ebc6f1c2',
134
- holder: 'did:example:holder',
135
- proof: {
136
- type: 'Ed25519Signature2018',
137
- created: '2021-03-19T15:30:15Z',
138
- challenge: 'n-0S6_WzA2Mj',
139
- domain: 'https://client.example.org/cb',
140
- jws: 'eyJhb...JQdBw',
141
- proofPurpose: 'authentication',
142
- verificationMethod: 'did:example:holder#key-1',
143
- },
144
- }
145
- const addCredentialArgs2: AddCredentialArgs = {
146
- raw: JSON.stringify(sampleVP),
147
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
148
- issuerCorrelationType: CredentialCorrelationType.DID,
149
- issuerCorrelationId: 'did:example:holder',
150
- subjectCorrelationType: CredentialCorrelationType.DID,
151
- subjectCorrelationId: 'did:example:holder',
152
- }
153
- const addCredentialArgs3: AddCredentialArgs = {
154
- raw: 'eyJhbGciOiJFZERTQSIsInR5cCI6InZjK3NkLWp3dCIsImtpZCI6IiN6Nk1rdHF0WE5HOENEVVk5UHJydG9TdEZ6ZUNuaHBNbWd4WUwxZ2lrY1czQnp2TlcifQ.eyJ2Y3QiOiJJZGVudGl0eUNyZWRlbnRpYWwiLCJmYW1pbHlfbmFtZSI6IkRvZSIsInBob25lX251bWJlciI6IisxLTIwMi01NTUtMDEwMSIsImFkZHJlc3MiOnsic3RyZWV0X2FkZHJlc3MiOiIxMjMgTWFpbiBTdCIsImxvY2FsaXR5IjoiQW55dG93biIsIl9zZCI6WyJOSm5tY3QwQnFCTUUxSmZCbEM2alJRVlJ1ZXZwRU9OaVl3N0E3TUh1SnlRIiwib201Wnp0WkhCLUdkMDBMRzIxQ1ZfeE00RmFFTlNvaWFPWG5UQUpOY3pCNCJdfSwiY25mIjp7Imp3ayI6eyJrdHkiOiJPS1AiLCJjcnYiOiJFZDI1NTE5IiwieCI6Im9FTlZzeE9VaUg1NFg4d0pMYVZraWNDUmswMHdCSVE0c1JnYms1NE44TW8ifX0sImlzcyI6ImRpZDprZXk6ejZNa3RxdFhORzhDRFVZOVBycnRvU3RGemVDbmhwTW1neFlMMWdpa2NXM0J6dk5XIiwiaWF0IjoxNjk4MTUxNTMyLCJfc2RfYWxnIjoic2hhLTI1NiIsIl9zZCI6WyIxQ3VyMmsyQTJvSUI1Q3NoU0lmX0FfS2ctbDI2dV9xS3VXUTc5UDBWZGFzIiwiUjF6VFV2T1lIZ2NlcGowakh5cEdIejlFSHR0VktmdDB5c3diYzlFVFBiVSIsImVEcVFwZFRYSlhiV2hmLUVzSTd6dzVYNk92WW1GTi1VWlFRTWVzWHdLUHciLCJwZERrMl9YQUtIbzdnT0Fmd0YxYjdPZENVVlRpdDJrSkhheFNFQ1E5eGZjIiwicHNhdUtVTldFaTA5bnUzQ2w4OXhLWGdtcFdFTlpsNXV5MU4xbnluX2pNayIsInNOX2dlMHBIWEY2cW1zWW5YMUE5U2R3SjhjaDhhRU5reGJPRHNUNzRZd0kiXX0.coOK8NzJmEWz4qx-qRhjo-RK7aejrSkQM9La9Cw3eWmzcja9DXrkBoQZKbIJtNoSzSPLjwK2V71W78z0miZsDQ~WyJzYWx0IiwiaXNfb3Zlcl82NSIsdHJ1ZV0~WyJzYWx0IiwiaXNfb3Zlcl8yMSIsdHJ1ZV0~WyJzYWx0IiwiZW1haWwiLCJqb2huZG9lQGV4YW1wbGUuY29tIl0~WyJzYWx0IiwiY291bnRyeSIsIlVTIl0~WyJzYWx0IiwiZ2l2ZW5fbmFtZSIsIkpvaG4iXQ~eyJhbGciOiJFZERTQSIsInR5cCI6ImtiK2p3dCJ9.eyJpYXQiOjE2OTgxNTE1MzIsIm5vbmNlIjoic2FsdCIsImF1ZCI6ImRpZDprZXk6elVDNzRWRXFxaEVIUWNndjR6YWdTUGtxRkp4dU5XdW9CUEtqSnVIRVRFVWVITG9TcVd0OTJ2aVNzbWFXank4MnkiLCJfc2RfaGFzaCI6Ii1kTUd4OGZhUnpOQm91a2EwU0R6V2JkS3JYckw1TFVmUlNQTHN2Q2xPMFkifQ.TQQLqc4ZzoKjQfAghAzC_4aaU3KCS8YqzxAJtzT124guzkv9XSHtPN8d3z181_v-ca2ATXjTRoRciozitE6wBA',
155
- issuerCorrelationType: CredentialCorrelationType.DID,
156
- subjectCorrelationType: CredentialCorrelationType.DID,
157
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
158
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
159
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
160
- opts: {
161
- hasher: (data, algorithm) => createHash(algorithm).update(data).digest(),
162
- },
163
- }
164
-
165
- const savedDigitalCredential1: DigitalCredential = await digitalCredentialStore.addCredential(addCredentialArgs1)
166
- expect(savedDigitalCredential1).toBeDefined()
167
- const savedDigitalCredential2: DigitalCredential = await digitalCredentialStore.addCredential(addCredentialArgs2)
168
- expect(savedDigitalCredential2).toBeDefined()
169
- const savedDigitalCredential3: DigitalCredential = await digitalCredentialStore.addCredential(addCredentialArgs3)
170
- expect(savedDigitalCredential3).toBeDefined()
171
- const args1: GetCredentialsArgs = {
172
- filter: [{ credentialType: CredentialType.VP }],
173
- }
174
- const result1: GetCredentialsResponse = await digitalCredentialStore.getCredentials(args1)
175
- expect(result1.total).toEqual(1)
176
- const args2: GetCredentialsArgs = {
177
- offset: 1,
178
- limit: 10,
179
- }
180
- const result2: GetCredentialsResponse = await digitalCredentialStore.getCredentials(args2)
181
- expect(result2.data.length).toEqual(2)
182
- expect(result2.total).toEqual(3)
183
- const args3: GetCredentialsArgs = {
184
- order: 'createdAt.DESC',
185
- }
186
- const result3: GetCredentialsResponse = await digitalCredentialStore.getCredentials(args3)
187
- expect(result3.data.length).toEqual(3)
188
- expect(result3.data[1].documentFormat).toEqual(CredentialDocumentFormat.JSON_LD)
189
- })
190
-
191
- it('should return no digital credentials if filter does not match', async (): Promise<void> => {
192
- const args: GetCredentialsArgs = {
193
- filter: [{ issuerCorrelationId: 'unknown_id' }],
194
- }
195
- const result: GetCredentialsResponse = await digitalCredentialStore.getCredentials(args)
196
-
197
- expect(result.data.length).toEqual(0)
198
- expect(result.total).toEqual(0)
199
- })
200
-
201
- it('should delete stored digital credential', async (): Promise<void> => {
202
- const rawCredential: string =
203
- 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
204
- const digitalCredential: AddCredentialArgs = {
205
- raw: rawCredential,
206
- issuerCorrelationType: CredentialCorrelationType.DID,
207
- subjectCorrelationType: CredentialCorrelationType.DID,
208
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
209
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
210
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
211
- }
212
-
213
- const savedDigitalCredential: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential)
214
- let result = await digitalCredentialStore.removeCredential({ id: savedDigitalCredential.id })
215
- expect(result).toEqual(true)
216
- })
217
-
218
- it('should not delete stored digital credential if id not found', async (): Promise<void> => {
219
- const result = await digitalCredentialStore.removeCredential({ id: 'unknown_id' })
220
- expect(result).toEqual(false)
221
- })
222
-
223
- it('should update stored digital credential', async (): Promise<void> => {
224
- const rawCredential: string =
225
- 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
226
- const digitalCredential: AddCredentialArgs = {
227
- raw: rawCredential,
228
- issuerCorrelationType: CredentialCorrelationType.DID,
229
- subjectCorrelationType: CredentialCorrelationType.DID,
230
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
231
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
232
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
233
- }
234
-
235
- const savedDigitalCredential: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential)
236
-
237
- const result = await digitalCredentialStore.updateCredentialState({
238
- id: savedDigitalCredential.id,
239
- verifiedState: CredentialStateType.VERIFIED,
240
- verifiedAt: new Date(),
241
- })
242
- expect(result.verifiedState).toEqual(CredentialStateType.VERIFIED)
243
- })
244
-
245
- it('should throw exception on updating stored digital credential to revoked', async (): Promise<void> => {
246
- const rawCredential: string =
247
- 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
248
- const digitalCredential: AddCredentialArgs = {
249
- raw: rawCredential,
250
- issuerCorrelationType: CredentialCorrelationType.DID,
251
- subjectCorrelationType: CredentialCorrelationType.DID,
252
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
253
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
254
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
255
- }
256
-
257
- const savedDigitalCredential: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential)
258
-
259
- await expect(
260
- digitalCredentialStore.updateCredentialState({
261
- id: savedDigitalCredential.id,
262
- verifiedState: CredentialStateType.REVOKED,
263
- })
264
- ).rejects.toThrowError('No revokedAt param is provided.')
265
- })
266
-
267
- it('should revoke stored digital credential', async (): Promise<void> => {
268
- const rawCredential: string =
269
- 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
270
- const digitalCredential: AddCredentialArgs = {
271
- raw: rawCredential,
272
- issuerCorrelationType: CredentialCorrelationType.DID,
273
- subjectCorrelationType: CredentialCorrelationType.DID,
274
- issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
275
- subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
276
- tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
277
- }
278
-
279
- const savedDigitalCredential: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential)
280
- const currentDate = new Date()
281
- const result = await digitalCredentialStore.updateCredentialState({
282
- id: savedDigitalCredential.id,
283
- verifiedState: CredentialStateType.REVOKED,
284
- revokedAt: currentDate,
285
- })
286
- expect(result.verifiedState).toEqual(CredentialStateType.REVOKED)
287
- expect(result.revokedAt).toEqual(currentDate)
288
- })
289
- })
@@ -1,17 +0,0 @@
1
- import {
2
- AddCredentialArgs,
3
- GetCredentialArgs,
4
- GetCredentialsArgs,
5
- GetCredentialsResponse,
6
- RemoveCredentialArgs,
7
- UpdateCredentialStateArgs,
8
- } from '../types/digitalCredential/IAbstractDigitalCredentialStore'
9
- import { DigitalCredentialEntity } from '../entities/digitalCredential/DigitalCredentialEntity'
10
-
11
- export abstract class AbstractDigitalCredentialStore {
12
- abstract getCredential(args: GetCredentialArgs): Promise<DigitalCredentialEntity>
13
- abstract getCredentials(args?: GetCredentialsArgs): Promise<GetCredentialsResponse>
14
- abstract addCredential(args: AddCredentialArgs): Promise<DigitalCredentialEntity>
15
- abstract updateCredentialState(args: UpdateCredentialStateArgs): Promise<DigitalCredentialEntity>
16
- abstract removeCredential(args: RemoveCredentialArgs): Promise<boolean>
17
- }
@@ -1,124 +0,0 @@
1
- import { AbstractDigitalCredentialStore } from './AbstractDigitalCredentialStore'
2
- import {
3
- AddCredentialArgs,
4
- GetCredentialArgs,
5
- GetCredentialsArgs,
6
- GetCredentialsResponse,
7
- RemoveCredentialArgs,
8
- UpdateCredentialStateArgs,
9
- } from '../types/digitalCredential/IAbstractDigitalCredentialStore'
10
- import { OrPromise } from '@sphereon/ssi-types'
11
- import { DataSource, FindOptionsOrder, Repository } from 'typeorm'
12
- import Debug from 'debug'
13
- import { DigitalCredentialEntity } from '../entities/digitalCredential/DigitalCredentialEntity'
14
- import { nonPersistedDigitalCredentialEntityFromAddArgs } from '../utils/digitalCredential/MappingUtils'
15
- import { FindOptionsWhere } from 'typeorm/find-options/FindOptionsWhere'
16
- import { CredentialStateType, DigitalCredential, NonPersistedDigitalCredential } from '../types/digitalCredential/digitalCredential'
17
- import { parseAndValidateOrderOptions } from '../utils/SortingUtils'
18
-
19
- const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:credential-store')
20
-
21
- export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
22
- private readonly dbConnection: OrPromise<DataSource>
23
-
24
- constructor(dbConnection: OrPromise<DataSource>) {
25
- super()
26
- this.dbConnection = dbConnection
27
- }
28
-
29
- addCredential = async (args: AddCredentialArgs): Promise<DigitalCredentialEntity> => {
30
- debug('Adding credential', args)
31
- const digitalCredentialEntityRepository: Repository<DigitalCredentialEntity> = (await this.dbConnection).getRepository(DigitalCredentialEntity)
32
- const credentialEntity: NonPersistedDigitalCredential = nonPersistedDigitalCredentialEntityFromAddArgs(args)
33
- const createdResult: DigitalCredentialEntity = await digitalCredentialEntityRepository.save(credentialEntity)
34
- return Promise.resolve(createdResult)
35
- }
36
-
37
- getCredential = async (args: GetCredentialArgs): Promise<DigitalCredentialEntity> => {
38
- const result: DigitalCredentialEntity | null = await (await this.dbConnection).getRepository(DigitalCredentialEntity).findOne({
39
- where: args,
40
- })
41
-
42
- if (!result) {
43
- return Promise.reject(Error(`No credential found for arg: ${args.toString()}`))
44
- }
45
- return result
46
- }
47
-
48
- getCredentials = async (args?: GetCredentialsArgs): Promise<GetCredentialsResponse> => {
49
- const { filter = {}, offset, limit, order = 'id.asc' } = args ?? {}
50
- const sortOptions: FindOptionsOrder<DigitalCredentialEntity> = parseAndValidateOrderOptions<DigitalCredentialEntity>(order)
51
- const [result, total] = await (await this.dbConnection).getRepository(DigitalCredentialEntity).findAndCount({
52
- where: filter,
53
- skip: offset,
54
- take: limit,
55
- order: sortOptions,
56
- })
57
- return {
58
- data: result,
59
- total,
60
- }
61
- }
62
-
63
- removeCredential = async (args: RemoveCredentialArgs): Promise<boolean> => {
64
- if (!args) {
65
- return false
66
- }
67
-
68
- let query: FindOptionsWhere<DigitalCredentialEntity> = {}
69
-
70
- if ('id' in args) {
71
- query.id = args.id
72
- } else if ('hash' in args) {
73
- query.hash = args.hash
74
- } else {
75
- return false
76
- }
77
- try {
78
- const connection = await this.dbConnection
79
- const result = await connection.getRepository(DigitalCredentialEntity).delete(query)
80
- return result.affected === 1
81
- } catch (error) {
82
- console.error('Error removing digital credential:', error)
83
- return false
84
- }
85
- }
86
-
87
- updateCredentialState = async (args: UpdateCredentialStateArgs): Promise<DigitalCredentialEntity> => {
88
- const credentialRepository: Repository<DigitalCredentialEntity> = (await this.dbConnection).getRepository(DigitalCredentialEntity)
89
- const whereClause: Record<string, any> = {}
90
- if ('id' in args) {
91
- whereClause.id = args.id
92
- } else if ('hash' in args) {
93
- whereClause.hash = args.hash
94
- } else {
95
- throw new Error('No id or hash param is provided.')
96
- }
97
- if (!args.verifiedState) {
98
- throw new Error('No verifiedState param is provided.')
99
- }
100
- if (args.verifiedState === CredentialStateType.REVOKED && !args.revokedAt) {
101
- throw new Error('No revokedAt param is provided.')
102
- }
103
- if (args.verifiedState !== CredentialStateType.REVOKED && !args.verifiedAt) {
104
- throw new Error('No verifiedAt param is provided.')
105
- }
106
- const credential: DigitalCredentialEntity | null = await credentialRepository.findOne({
107
- where: whereClause,
108
- })
109
-
110
- if (!credential) {
111
- return Promise.reject(Error(`No credential found for args: ${whereClause}`))
112
- }
113
- const updatedCredential: DigitalCredential = {
114
- ...credential,
115
- ...(args.verifiedState !== CredentialStateType.REVOKED && { verifiedAt: args.verifiedAt }),
116
- ...(args.verifiedState === CredentialStateType.REVOKED && { revokedAt: args.revokedAt }),
117
- lastUpdatedAt: new Date(),
118
- verifiedState: args.verifiedState,
119
- }
120
- debug('Updating credential', credential)
121
- const updatedResult: DigitalCredentialEntity = await credentialRepository.save(updatedCredential, { transaction: true })
122
- return updatedResult
123
- }
124
- }
@@ -1,64 +0,0 @@
1
- import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
2
- import {
3
- CredentialCorrelationType,
4
- CredentialDocumentFormat,
5
- CredentialStateType,
6
- CredentialType,
7
- } from '../../types/digitalCredential/digitalCredential'
8
-
9
- @Entity('DigitalCredential')
10
- export class DigitalCredentialEntity extends BaseEntity {
11
- @PrimaryGeneratedColumn('uuid')
12
- id!: string
13
-
14
- @Column('simple-enum', { name: 'credential_type', enum: CredentialType, nullable: false })
15
- credentialType!: CredentialType
16
-
17
- @Column('simple-enum', { name: 'document_format', enum: CredentialDocumentFormat, nullable: false })
18
- documentFormat!: CredentialDocumentFormat
19
-
20
- @Column('text', { name: 'raw', nullable: false })
21
- raw!: string
22
-
23
- @Column('text', { name: 'uniform_document', nullable: false })
24
- uniformDocument!: string
25
-
26
- @Column('text', { name: 'hash', nullable: false, unique: true })
27
- hash!: string
28
-
29
- @Column('simple-enum', { name: 'issuer_correlation_type', enum: CredentialCorrelationType, nullable: false })
30
- issuerCorrelationType!: CredentialCorrelationType
31
-
32
- @Column('simple-enum', { name: 'subject_correlation_type', enum: CredentialCorrelationType, nullable: true })
33
- subjectCorrelationType?: CredentialCorrelationType
34
-
35
- @Column('text', { name: 'issuer_correlation_id', nullable: false })
36
- issuerCorrelationId!: string
37
-
38
- @Column('text', { name: 'subject_correlation_id', nullable: true })
39
- subjectCorrelationId?: string
40
-
41
- @Column('simple-enum', { name: 'verified_state', enum: CredentialStateType, nullable: true })
42
- verifiedState?: CredentialStateType
43
-
44
- @Column('text', { name: 'tenant_id', nullable: true })
45
- tenantId?: string
46
-
47
- @CreateDateColumn({ name: 'created_at', nullable: false })
48
- createdAt!: Date
49
-
50
- @UpdateDateColumn({ name: 'last_updated_at', nullable: false })
51
- lastUpdatedAt!: Date
52
-
53
- @Column('date', { name: 'valid_until', nullable: true })
54
- validUntil?: Date
55
-
56
- @Column('date', { name: 'valid_from', nullable: true })
57
- validFrom?: Date
58
-
59
- @Column('date', { name: 'verified_at', nullable: true })
60
- verifiedAt?: Date
61
-
62
- @Column('date', { name: 'revoked_at', nullable: true })
63
- revokedAt?: Date
64
- }
@@ -1,66 +0,0 @@
1
- import { DatabaseType, MigrationInterface, QueryRunner } from 'typeorm'
2
- import Debug, { Debugger } from 'debug'
3
- import { CreateDigitalCredential1708525189001 } from '../postgres/1708525189001-CreateDigitalCredential'
4
- import { CreateDigitalCredential1708525189002 } from '../sqlite/1708525189002-CreateDigitalCredential'
5
-
6
- const debug: Debugger = Debug('sphereon:ssi-sdk:migrations')
7
-
8
- export class CreateDigitalCredential1708525189000 implements MigrationInterface {
9
- name: string = 'CreateDigitalCredential1708525189000'
10
-
11
- public async up(queryRunner: QueryRunner): Promise<void> {
12
- debug('migration: creating DigitalCredential tables')
13
- const dbType: DatabaseType = queryRunner.connection.driver.options.type
14
-
15
- switch (dbType) {
16
- case 'postgres': {
17
- debug('using postgres migration file for DigitalCredential')
18
- const mig: CreateDigitalCredential1708525189001 = new CreateDigitalCredential1708525189001()
19
- await mig.up(queryRunner)
20
- debug('Postgres Migration statements for DigitalCredential executed')
21
- return
22
- }
23
- case 'sqlite':
24
- case 'expo':
25
- case 'react-native': {
26
- debug('using sqlite/react-native migration file for DigitalCredential')
27
- const mig: CreateDigitalCredential1708525189002 = new CreateDigitalCredential1708525189002()
28
- await mig.up(queryRunner)
29
- debug('SQLite Migration statements for DigitalCredential executed')
30
- return
31
- }
32
- default:
33
- return Promise.reject(
34
- `Migrations are currently only supported for sqlite, react-native, expo, and postgres for UniformCredential. Was ${dbType}. Please run your database without migrations and with 'migrationsRun: false' and 'synchronize: true' for now`
35
- )
36
- }
37
- }
38
-
39
- public async down(queryRunner: QueryRunner): Promise<void> {
40
- debug('migration: reverting DigitalCredential tables')
41
- const dbType: DatabaseType = queryRunner.connection.driver.options.type
42
-
43
- switch (dbType) {
44
- case 'postgres': {
45
- debug('using postgres migration file for DigitalCredential')
46
- const mig: CreateDigitalCredential1708525189001 = new CreateDigitalCredential1708525189001()
47
- await mig.down(queryRunner)
48
- debug('Postgres Migration statements for DigitalCredential reverted')
49
- return
50
- }
51
- case 'sqlite':
52
- case 'expo':
53
- case 'react-native': {
54
- debug('using sqlite/react-native migration file for DigitalCredential')
55
- const mig: CreateDigitalCredential1708525189002 = new CreateDigitalCredential1708525189002()
56
- await mig.down(queryRunner)
57
- debug('SQLite Migration statements for DigitalCredential reverted')
58
- return
59
- }
60
- default:
61
- return Promise.reject(
62
- `Migrations are currently only supported for sqlite, react-native, expo, and postgres for DigitalCredential. Was ${dbType}. Please run your database without migrations and with 'migrationsRun: false' and 'synchronize: true' for now`
63
- )
64
- }
65
- }
66
- }
@@ -1,44 +0,0 @@
1
- import { MigrationInterface, QueryRunner } from 'typeorm'
2
-
3
- export class CreateDigitalCredential1708525189001 implements MigrationInterface {
4
- name = 'CreateDigitalCredential1708525189001'
5
-
6
- public async up(queryRunner: QueryRunner): Promise<void> {
7
- await queryRunner.query(`CREATE TYPE "digital_credential_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')`)
9
- await queryRunner.query(`CREATE TYPE "digital_credential_correlation_type" AS ENUM('DID')`)
10
- await queryRunner.query(`CREATE TYPE "digital_credential_state_type" AS ENUM('REVOKED', 'VERIFIED', 'EXPIRED')`)
11
-
12
- await queryRunner.query(`
13
- CREATE TABLE "DigitalCredential" (
14
- "id" uuid NOT NULL DEFAULT uuid_generate_v4(),
15
- "credential_type" "digital_credential_type" NOT NULL,
16
- "document_format" "digital_credential_document_format" NOT NULL,
17
- "raw" text NOT NULL,
18
- "uniform_document" text NOT NULL,
19
- "hash" text NOT NULL UNIQUE,
20
- "issuer_correlation_type" "digital_credential_correlation_type" NOT NULL,
21
- "subject_correlation_type" "digital_credential_correlation_type",
22
- "issuer_correlation_id" text NOT NULL,
23
- "subject_correlation_id" text,
24
- "verified_state" "digital_credential_state_type",
25
- "tenant_id" text,
26
- "created_at" TIMESTAMP NOT NULL DEFAULT now(),
27
- "last_updated_at" TIMESTAMP NOT NULL DEFAULT now(),
28
- "valid_from" DATE,
29
- "valid_until" DATE,
30
- "verified_at" DATE,
31
- "revoked_at" DATE,
32
- PRIMARY KEY ("id")
33
- )
34
- `)
35
- }
36
-
37
- public async down(queryRunner: QueryRunner): Promise<void> {
38
- await queryRunner.query(`DROP TABLE "DigitalCredential"`)
39
- await queryRunner.query(`DROP TYPE "digital_credential_state_type"`)
40
- await queryRunner.query(`DROP TYPE "digital_credential_correlation_type"`)
41
- await queryRunner.query(`DROP TYPE "digital_credential_document_format"`)
42
- await queryRunner.query(`DROP TYPE "digital_credential_type"`)
43
- }
44
- }
@@ -1,34 +0,0 @@
1
- import { MigrationInterface, QueryRunner } from 'typeorm'
2
-
3
- export class CreateDigitalCredential1708525189002 implements MigrationInterface {
4
- name = 'CreateDigitalCredential1708525189002'
5
-
6
- public async up(queryRunner: QueryRunner): Promise<void> {
7
- await queryRunner.query(`
8
- CREATE TABLE "DigitalCredential" (
9
- "id" varchar PRIMARY KEY NOT NULL,
10
- "credential_type" varchar CHECK( "credential_type" IN ('VC', 'VP', 'C', 'P') ) NOT NULL,
11
- "document_format" varchar CHECK( "document_format" IN ('JSON_LD', 'JWT', 'SD_JWT', 'MDOC') ) NOT NULL,
12
- "raw" text NOT NULL,
13
- "uniform_document" text NOT NULL,
14
- "hash" text NOT NULL UNIQUE,
15
- "issuer_correlation_type" varchar CHECK( "issuer_correlation_type" IN ('DID') ) NOT NULL,
16
- "subject_correlation_type" varchar CHECK( "subject_correlation_type" IN ('DID') ),
17
- "issuer_correlation_id" text NOT NULL,
18
- "subject_correlation_id" text,
19
- "verified_state" varchar CHECK( "verified_state" IN ('REVOKED', 'VERIFIED', 'EXPIRED') ),
20
- "tenant_id" text,
21
- "created_at" datetime NOT NULL DEFAULT (datetime('now')),
22
- "last_updated_at" datetime NOT NULL DEFAULT (datetime('now')),
23
- "valid_from" datetime,
24
- "valid_until" datetime,
25
- "verified_at" datetime,
26
- "revoked_at" datetime
27
- )
28
- `)
29
- }
30
-
31
- public async down(queryRunner: QueryRunner): Promise<void> {
32
- await queryRunner.query(`DROP TABLE "DigitalCredential"`)
33
- }
34
- }