@sphereon/ssi-sdk.data-store 0.30.2-unstable.13 → 0.30.2-unstable.14

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 (68) hide show
  1. package/dist/digitalCredential/DigitalCredentialStore.d.ts.map +1 -1
  2. package/dist/digitalCredential/DigitalCredentialStore.js +1 -3
  3. package/dist/digitalCredential/DigitalCredentialStore.js.map +1 -1
  4. package/dist/entities/eventLogger/AuditEventEntity.d.ts +9 -3
  5. package/dist/entities/eventLogger/AuditEventEntity.d.ts.map +1 -1
  6. package/dist/entities/eventLogger/AuditEventEntity.js +52 -1
  7. package/dist/entities/eventLogger/AuditEventEntity.js.map +1 -1
  8. package/dist/eventLogger/AbstractEventLoggerStore.d.ts +4 -2
  9. package/dist/eventLogger/AbstractEventLoggerStore.d.ts.map +1 -1
  10. package/dist/eventLogger/AbstractEventLoggerStore.js.map +1 -1
  11. package/dist/eventLogger/EventLoggerStore.d.ts +4 -3
  12. package/dist/eventLogger/EventLoggerStore.d.ts.map +1 -1
  13. package/dist/eventLogger/EventLoggerStore.js +34 -6
  14. package/dist/eventLogger/EventLoggerStore.js.map +1 -1
  15. package/dist/issuanceBranding/IssuanceBrandingStore.d.ts +0 -4
  16. package/dist/issuanceBranding/IssuanceBrandingStore.d.ts.map +1 -1
  17. package/dist/issuanceBranding/IssuanceBrandingStore.js +13 -42
  18. package/dist/issuanceBranding/IssuanceBrandingStore.js.map +1 -1
  19. package/dist/migrations/postgres/1701634812183-CreateAuditEvents.d.ts.map +1 -1
  20. package/dist/migrations/postgres/1701634812183-CreateAuditEvents.js +29 -1
  21. package/dist/migrations/postgres/1701634812183-CreateAuditEvents.js.map +1 -1
  22. package/dist/migrations/sqlite/1701634819487-CreateAuditEvents.d.ts.map +1 -1
  23. package/dist/migrations/sqlite/1701634819487-CreateAuditEvents.js +25 -1
  24. package/dist/migrations/sqlite/1701634819487-CreateAuditEvents.js.map +1 -1
  25. package/dist/types/eventLogger/IAbstractEventLoggerStore.d.ts +9 -2
  26. package/dist/types/eventLogger/IAbstractEventLoggerStore.d.ts.map +1 -1
  27. package/dist/types/eventLogger/eventLogger.d.ts +2 -1
  28. package/dist/types/eventLogger/eventLogger.d.ts.map +1 -1
  29. package/dist/utils/FormattingUtils.d.ts +2 -0
  30. package/dist/utils/FormattingUtils.d.ts.map +1 -0
  31. package/dist/utils/FormattingUtils.js +23 -0
  32. package/dist/utils/FormattingUtils.js.map +1 -0
  33. package/dist/utils/contact/MappingUtils.d.ts.map +1 -1
  34. package/dist/utils/contact/MappingUtils.js +25 -12
  35. package/dist/utils/contact/MappingUtils.js.map +1 -1
  36. package/dist/utils/digitalCredential/MappingUtils.d.ts.map +1 -1
  37. package/dist/utils/digitalCredential/MappingUtils.js +3 -1
  38. package/dist/utils/digitalCredential/MappingUtils.js.map +1 -1
  39. package/dist/utils/eventLogger/MappingUtils.d.ts +5 -0
  40. package/dist/utils/eventLogger/MappingUtils.d.ts.map +1 -0
  41. package/dist/utils/eventLogger/MappingUtils.js +15 -0
  42. package/dist/utils/eventLogger/MappingUtils.js.map +1 -0
  43. package/dist/utils/issuanceBranding/MappingUtils.d.ts +8 -0
  44. package/dist/utils/issuanceBranding/MappingUtils.d.ts.map +1 -0
  45. package/dist/utils/issuanceBranding/MappingUtils.js +20 -0
  46. package/dist/utils/issuanceBranding/MappingUtils.js.map +1 -0
  47. package/dist/utils/presentationDefinition/MappingUtils.d.ts.map +1 -1
  48. package/dist/utils/presentationDefinition/MappingUtils.js +3 -1
  49. package/dist/utils/presentationDefinition/MappingUtils.js.map +1 -1
  50. package/package.json +6 -6
  51. package/src/__tests__/digitalCredential.store.test.ts +77 -2
  52. package/src/__tests__/eventLogger.entities.test.ts +3 -2
  53. package/src/__tests__/eventLogger.store.test.ts +4 -1
  54. package/src/digitalCredential/DigitalCredentialStore.ts +1 -3
  55. package/src/entities/eventLogger/AuditEventEntity.ts +50 -3
  56. package/src/eventLogger/AbstractEventLoggerStore.ts +4 -2
  57. package/src/eventLogger/EventLoggerStore.ts +38 -27
  58. package/src/issuanceBranding/IssuanceBrandingStore.ts +14 -62
  59. package/src/migrations/postgres/1701634812183-CreateAuditEvents.ts +29 -1
  60. package/src/migrations/sqlite/1701634819487-CreateAuditEvents.ts +25 -1
  61. package/src/types/eventLogger/IAbstractEventLoggerStore.ts +12 -2
  62. package/src/types/eventLogger/eventLogger.ts +2 -1
  63. package/src/utils/FormattingUtils.ts +21 -0
  64. package/src/utils/contact/MappingUtils.ts +39 -16
  65. package/src/utils/digitalCredential/MappingUtils.ts +4 -1
  66. package/src/utils/eventLogger/MappingUtils.ts +56 -0
  67. package/src/utils/issuanceBranding/MappingUtils.ts +32 -0
  68. package/src/utils/presentationDefinition/MappingUtils.ts +4 -1
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isPresentationDefinitionEqual = exports.presentationDefinitionEntityItemFrom = exports.presentationDefinitionItemFrom = void 0;
4
4
  const PresentationDefinitionItemEntity_1 = require("../../entities/presentationDefinition/PresentationDefinitionItemEntity");
5
5
  const blakejs_1 = require("blakejs");
6
+ const FormattingUtils_1 = require("../FormattingUtils");
6
7
  const presentationDefinitionItemFrom = (entity) => {
7
- return {
8
+ const result = {
8
9
  id: entity.id,
9
10
  tenantId: entity.tenantId,
10
11
  definitionId: entity.definitionId,
@@ -15,6 +16,7 @@ const presentationDefinitionItemFrom = (entity) => {
15
16
  createdAt: entity.createdAt,
16
17
  lastUpdatedAt: entity.lastUpdatedAt,
17
18
  };
19
+ return (0, FormattingUtils_1.replaceNullWithUndefined)(result);
18
20
  };
19
21
  exports.presentationDefinitionItemFrom = presentationDefinitionItemFrom;
20
22
  const presentationDefinitionEntityItemFrom = (item) => {
@@ -1 +1 @@
1
- {"version":3,"file":"MappingUtils.js","sourceRoot":"","sources":["../../../src/utils/presentationDefinition/MappingUtils.ts"],"names":[],"mappings":";;;AAAA,6HAAyH;AAGzH,qCAAoC;AAE7B,MAAM,8BAA8B,GAAG,CAAC,MAAwC,EAA8B,EAAE;IACrH,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAA4B;QAClF,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAA;AACH,CAAC,CAAA;AAZY,QAAA,8BAA8B,kCAY1C;AAEM,MAAM,oCAAoC,GAAG,CAAC,IAA4C,EAAoC,EAAE;IACrI,MAAM,MAAM,GAAG,IAAI,mEAAgC,EAAE,CAAA;IAErD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAC/B,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAa,CAAA;IACxC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC7B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IACvB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC7B,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAkB,CAAC,CAAA;IAClE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAVY,QAAA,oCAAoC,wCAUhD;AAED,SAAS,WAAW,CAAC,OAAgC;IACnD,OAAO,IAAA,oBAAU,EAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,SAAgB,6BAA6B,CAAC,IAAuC,EAAE,OAA0C;IAC/H,IACE,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY;QAC1C,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QACjC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;QAChC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;QACzB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAC/B,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACxD,OAAO,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACvF,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAhBD,sEAgBC"}
1
+ {"version":3,"file":"MappingUtils.js","sourceRoot":"","sources":["../../../src/utils/presentationDefinition/MappingUtils.ts"],"names":[],"mappings":";;;AAAA,6HAAyH;AAGzH,qCAAoC;AACpC,wDAA6D;AAEtD,MAAM,8BAA8B,GAAG,CAAC,MAAwC,EAA8B,EAAE;IACrH,MAAM,MAAM,GAA+B;QACzC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAA4B;QAClF,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAA;IAED,OAAO,IAAA,0CAAwB,EAAC,MAAM,CAAC,CAAA;AACzC,CAAC,CAAA;AAdY,QAAA,8BAA8B,kCAc1C;AAEM,MAAM,oCAAoC,GAAG,CAAC,IAA4C,EAAoC,EAAE;IACrI,MAAM,MAAM,GAAG,IAAI,mEAAgC,EAAE,CAAA;IAErD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAC/B,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAa,CAAA;IACxC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC7B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;IACvB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC7B,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAkB,CAAC,CAAA;IAClE,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAVY,QAAA,oCAAoC,wCAUhD;AAED,SAAS,WAAW,CAAC,OAAgC;IACnD,OAAO,IAAA,oBAAU,EAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;AAC5C,CAAC;AAED,SAAgB,6BAA6B,CAAC,IAAuC,EAAE,OAA0C;IAC/H,IACE,IAAI,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY;QAC1C,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;QACjC,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;QAChC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI;QACzB,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAC/B,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,IAAI,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACxD,OAAO,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACvF,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAhBD,sEAgBC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.data-store",
3
- "version": "0.30.2-unstable.13+4acf8775",
3
+ "version": "0.30.2-unstable.14+710884f6",
4
4
  "source": "src/index.ts",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,12 +15,12 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@sphereon/kmp-mdl-mdoc": "0.2.0-SNAPSHOT.22",
18
- "@sphereon/pex": "5.0.0-unstable.14",
18
+ "@sphereon/pex": "5.0.0-unstable.9",
19
19
  "@sphereon/ssi-sdk-ext.did-utils": "0.24.1-unstable.130",
20
20
  "@sphereon/ssi-sdk-ext.identifier-resolution": "0.24.1-unstable.130",
21
- "@sphereon/ssi-sdk.agent-config": "0.30.2-unstable.13+4acf8775",
22
- "@sphereon/ssi-sdk.core": "0.30.2-unstable.13+4acf8775",
23
- "@sphereon/ssi-types": "0.30.2-unstable.13+4acf8775",
21
+ "@sphereon/ssi-sdk.agent-config": "0.30.2-unstable.14+710884f6",
22
+ "@sphereon/ssi-sdk.core": "0.30.2-unstable.14+710884f6",
23
+ "@sphereon/ssi-types": "0.30.2-unstable.14+710884f6",
24
24
  "@veramo/core": "4.2.0",
25
25
  "@veramo/utils": "4.2.0",
26
26
  "blakejs": "^1.2.1",
@@ -53,5 +53,5 @@
53
53
  "PostgreSQL",
54
54
  "Contact Store"
55
55
  ],
56
- "gitHead": "4acf8775577f5f56fa9efdbd043b506cdbe09ccf"
56
+ "gitHead": "710884f670a48a38c9b3d4ca1386c9602f189951"
57
57
  }
@@ -4,13 +4,15 @@ import { DataStoreDigitalCredentialMigrations } from '../migrations'
4
4
  import { CredentialRole, DataStoreDigitalCredentialEntities } from '../index'
5
5
  import { DigitalCredentialStore } from '../digitalCredential/DigitalCredentialStore'
6
6
  import {
7
+ AddCredentialArgs,
7
8
  CredentialCorrelationType,
8
9
  CredentialDocumentFormat,
9
10
  CredentialStateType,
10
11
  DocumentType,
11
12
  DigitalCredential,
12
- } from '../types/digitalCredential/digitalCredential'
13
- import { AddCredentialArgs, GetCredentialsArgs, GetCredentialsResponse } from '../types/digitalCredential/IAbstractDigitalCredentialStore'
13
+ GetCredentialsArgs,
14
+ GetCredentialsResponse,
15
+ } from '../types'
14
16
  import { IVerifiablePresentation } from '@sphereon/ssi-types'
15
17
  import { createHash } from 'crypto'
16
18
 
@@ -247,6 +249,79 @@ describe('Database entities tests', (): void => {
247
249
  expect(result).toEqual(true)
248
250
  })
249
251
 
252
+ it('should delete stored digital credential with children', async (): Promise<void> => {
253
+ const rawCredential: string =
254
+ 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
255
+ const digitalCredential1: AddCredentialArgs = {
256
+ rawDocument: rawCredential,
257
+ kmsKeyRef: 'testRef',
258
+ identifierMethod: 'did',
259
+ issuerCorrelationType: CredentialCorrelationType.DID,
260
+ subjectCorrelationType: CredentialCorrelationType.DID,
261
+ issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
262
+ subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
263
+ credentialRole: CredentialRole.VERIFIER,
264
+ tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
265
+ }
266
+
267
+ const parentCredential: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential1)
268
+
269
+ const digitalCredential2: AddCredentialArgs = {
270
+ rawDocument:
271
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6dmVsb2NpdHk6djI6MHhjMTY3MTUxNmMyMTQ1ZDcwYjM0MGY1NjBhYjFjYjU4Y2M0ZDhhMDUyOjE2Mzc4MjY4NTEwMzM4MToxOTg2I2tleS0xIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIk9wZW5CYWRnZUNyZWRlbnRpYWwiLCJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlZlcmlmaWFibGVDcmVkZW50aWFsIl0sImlkIjoiZGlkOnZlbG9jaXR5OnYyOjB4YzE2NzE1MTZjMjE0NWQ3MGIzNDBmNTYwYWIxY2I1OGNjNGQ4YTA1MjoxNjM3ODI2ODUxMDMzODE6MTk4NiIsImNyZWRlbnRpYWxTdGF0dXMiOnsidHlwZSI6IlZlbG9jaXR5UmV2b2NhdGlvbkxpc3RKYW4yMDIxIiwiaWQiOiJldGhlcmV1bToweDFDMjk0NjFDNzQ4MGQxZDg1NzBkZjdjMEE0RjMxNEQwYkU4Y0Q1QmYvZ2V0UmV2b2tlZFN0YXR1cz9hZGRyZXNzPTB4YzE2NzE1MTZDMjE0NUQ3MEIzNDBGNTYwQUIxQ0I1OENjNEQ4YTA1MiZsaXN0SWQ9NTI5NDcyODgxNzIzMTQmaW5kZXg9NTYyNCJ9LCJsaW5rQ29kZUNvbW1pdG1lbnQiOnsidHlwZSI6IlZlbG9jaXR5Q3JlZGVudGlhbExpbmtDb2RlQ29tbWl0bWVudDIwMjIiLCJ2YWx1ZSI6IkVpQ3dJQmRUcmE4MVkyMjEzSVNJSXo0UDh5ejNvNDlXMStYczRmczVIc1BvMXc9PSJ9LCJpc3N1ZXIiOnsiaWQiOiJkaWQ6aW9uOkVpQmFLaWRocEhma2ZzZWpaT1UxY09YVnlhdnE4WUtfaFJfTGgwX1dCNTVQX0EifSwiY29udGVudEhhc2giOnsidHlwZSI6IlZlbG9jaXR5Q29udGVudEhhc2gyMDIwIiwidmFsdWUiOiJkNWUzMGI5Y2FlNDljYjM5MjRjZjVhZjIwMDUwOTE4ZWZjZDQ4ZTk2MzAzZTZhMDQ4NmQzZmE0ODk4NjQ1NDFlIn0sImNyZWRlbnRpYWxTY2hlbWEiOnsiaWQiOiJodHRwczovL3N0YWdpbmdyZWdpc3RyYXIudmVsb2NpdHluZXR3b3JrLmZvdW5kYXRpb24vc2NoZW1hcy9vcGVuLWJhZGdlLWNyZWRlbnRpYWwuc2NoZW1hLmpzb24iLCJ0eXBlIjoiSnNvblNjaGVtYVZhbGlkYXRvcjIwMTgifSwiY29uc2VudGVkQXQiOiIyMDIyLTExLTA3VDIxOjI0OjQ3LjcwM1oiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpqd2s6ZXlKamNuWWlPaUp6WldOd01qVTJhekVpTENKcmRIa2lPaUpGUXlJc0luVnpaU0k2SW5OcFp5SXNJbmdpT2lKRFdVdEdjbmxOVWpOc2RubHpiemQ0UjBKeVN6QnJRMkZZYUdwSGFXdFdMV3MxT0dGSE1GSTBTWGh6SWl3aWVTSTZJakV0TkhoTFowcFBkRlZyYjNablJqVnFjVWMxTm1KeGFtbG5UMEpUTVdGT09FZEJOMUV5YURsUlJtc2lmUSJ9LCJpc3N1YW5jZURhdGUiOiIyMDIyLTExLTA3VDIxOjI5OjI5LjIzNVoifSwibmJmIjoxNjY3ODU2NTY5LCJqdGkiOiJkaWQ6dmVsb2NpdHk6djI6MHhjMTY3MTUxNmMyMTQ1ZDcwYjM0MGY1NjBhYjFjYjU4Y2M0ZDhhMDUyOjE2Mzc4MjY4NTEwMzM4MToxOTg2IiwiaXNzIjoiZGlkOmlvbjpFaUJhS2lkaHBIZmtmc2VqWk9VMWNPWFZ5YXZxOFlLX2hSX0xoMF9XQjU1UF9BIiwic3ViIjoiZGlkOmp3azpleUpqY25ZaU9pSnpaV053TWpVMmF6RWlMQ0pyZEhraU9pSkZReUlzSW5WelpTSTZJbk5wWnlJc0luZ2lPaUpEV1V0R2NubE5Vak5zZG5semJ6ZDRSMEp5U3pCclEyRllhR3BIYVd0V0xXczFPR0ZITUZJMFNYaHpJaXdpZVNJNklqRXROSGhMWjBwUGRGVnJiM1puUmpWcWNVYzFObUp4YW1sblQwSlRNV0ZPT0VkQk4xRXlhRGxSUm1zaWZRIiwiaWF0IjoxNjY3ODU2NTY5fQ.-SiM5d7UrYn1gdj2hU5T5LnLQzhIklOtoexbyebLMeha0K89vkujsbFN4HNFP2TSfRYFt0-jXwDaZ8RNKESwFA',
272
+ parentId: parentCredential.id,
273
+ kmsKeyRef: 'testRef',
274
+ identifierMethod: 'did',
275
+ issuerCorrelationType: CredentialCorrelationType.DID,
276
+ subjectCorrelationType: CredentialCorrelationType.DID,
277
+ issuerCorrelationId: 'did:key:z1Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
278
+ subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
279
+ credentialRole: CredentialRole.VERIFIER,
280
+ tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
281
+ }
282
+ const savedDigitalCredential2: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential2)
283
+ let deleteResult: boolean = await digitalCredentialStore.removeCredential({ id: parentCredential.id })
284
+ expect(deleteResult).toEqual(true)
285
+ await expect(() => digitalCredentialStore.getCredential({ id: savedDigitalCredential2.id })).rejects.toThrowError('No credential found for arg:')
286
+ })
287
+
288
+ it('should not delete stored parent digital credential if a child gets deleted', async (): Promise<void> => {
289
+ const rawCredential: string =
290
+ 'eyJraWQiOiJkaWQ6a2V5Ono2TWtyaGt5M3B1c20yNk1laUZhWFUzbjJuZWtyYW13RlVtZ0dyZUdHa0RWNnpRaiN6Nk1rcmhreTNwdXNtMjZNZWlGYVhVM24ybmVrcmFtd0ZVbWdHcmVHR2tEVjZ6UWoiLCJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vc3BoZXJlb24tb3BlbnNvdXJjZS5naXRodWIuaW8vc3NpLW1vYmlsZS13YWxsZXQvY29udGV4dC9zcGhlcmVvbi13YWxsZXQtaWRlbnRpdHktdjEuanNvbmxkIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTcGhlcmVvbldhbGxldElkZW50aXR5Q3JlZGVudGlhbCJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJmaXJzdE5hbWUiOiJTIiwibGFzdE5hbWUiOiJLIiwiZW1haWxBZGRyZXNzIjoic0BrIn19LCJzdWIiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJqdGkiOiJ1cm46dXVpZDpkZGE3YmYyNC04ZTdhLTQxZjgtYjY2Yy1hNDhkYmM1YjEwZmEiLCJuYmYiOjE3MDg0NDA4MDgsImlzcyI6ImRpZDprZXk6ejZNa3Joa3kzcHVzbTI2TWVpRmFYVTNuMm5la3JhbXdGVW1nR3JlR0drRFY2elFqIn0.G0M84XVAxSmzGY-NQuB9NBofNrINSn6lvxW6761Vlq6ypvYgtc2xNdpiRmw8ryVNfnpzrr4Z5cB1RlrC05rJAw'
291
+ const digitalCredential1: AddCredentialArgs = {
292
+ rawDocument: rawCredential,
293
+ kmsKeyRef: 'testRef',
294
+ identifierMethod: 'did',
295
+ issuerCorrelationType: CredentialCorrelationType.DID,
296
+ subjectCorrelationType: CredentialCorrelationType.DID,
297
+ issuerCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
298
+ subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
299
+ credentialRole: CredentialRole.VERIFIER,
300
+ tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
301
+ }
302
+
303
+ const parentCredential: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential1)
304
+
305
+ const digitalCredential2: AddCredentialArgs = {
306
+ rawDocument:
307
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6dmVsb2NpdHk6djI6MHhjMTY3MTUxNmMyMTQ1ZDcwYjM0MGY1NjBhYjFjYjU4Y2M0ZDhhMDUyOjE2Mzc4MjY4NTEwMzM4MToxOTg2I2tleS0xIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIk9wZW5CYWRnZUNyZWRlbnRpYWwiLCJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlZlcmlmaWFibGVDcmVkZW50aWFsIl0sImlkIjoiZGlkOnZlbG9jaXR5OnYyOjB4YzE2NzE1MTZjMjE0NWQ3MGIzNDBmNTYwYWIxY2I1OGNjNGQ4YTA1MjoxNjM3ODI2ODUxMDMzODE6MTk4NiIsImNyZWRlbnRpYWxTdGF0dXMiOnsidHlwZSI6IlZlbG9jaXR5UmV2b2NhdGlvbkxpc3RKYW4yMDIxIiwiaWQiOiJldGhlcmV1bToweDFDMjk0NjFDNzQ4MGQxZDg1NzBkZjdjMEE0RjMxNEQwYkU4Y0Q1QmYvZ2V0UmV2b2tlZFN0YXR1cz9hZGRyZXNzPTB4YzE2NzE1MTZDMjE0NUQ3MEIzNDBGNTYwQUIxQ0I1OENjNEQ4YTA1MiZsaXN0SWQ9NTI5NDcyODgxNzIzMTQmaW5kZXg9NTYyNCJ9LCJsaW5rQ29kZUNvbW1pdG1lbnQiOnsidHlwZSI6IlZlbG9jaXR5Q3JlZGVudGlhbExpbmtDb2RlQ29tbWl0bWVudDIwMjIiLCJ2YWx1ZSI6IkVpQ3dJQmRUcmE4MVkyMjEzSVNJSXo0UDh5ejNvNDlXMStYczRmczVIc1BvMXc9PSJ9LCJpc3N1ZXIiOnsiaWQiOiJkaWQ6aW9uOkVpQmFLaWRocEhma2ZzZWpaT1UxY09YVnlhdnE4WUtfaFJfTGgwX1dCNTVQX0EifSwiY29udGVudEhhc2giOnsidHlwZSI6IlZlbG9jaXR5Q29udGVudEhhc2gyMDIwIiwidmFsdWUiOiJkNWUzMGI5Y2FlNDljYjM5MjRjZjVhZjIwMDUwOTE4ZWZjZDQ4ZTk2MzAzZTZhMDQ4NmQzZmE0ODk4NjQ1NDFlIn0sImNyZWRlbnRpYWxTY2hlbWEiOnsiaWQiOiJodHRwczovL3N0YWdpbmdyZWdpc3RyYXIudmVsb2NpdHluZXR3b3JrLmZvdW5kYXRpb24vc2NoZW1hcy9vcGVuLWJhZGdlLWNyZWRlbnRpYWwuc2NoZW1hLmpzb24iLCJ0eXBlIjoiSnNvblNjaGVtYVZhbGlkYXRvcjIwMTgifSwiY29uc2VudGVkQXQiOiIyMDIyLTExLTA3VDIxOjI0OjQ3LjcwM1oiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpqd2s6ZXlKamNuWWlPaUp6WldOd01qVTJhekVpTENKcmRIa2lPaUpGUXlJc0luVnpaU0k2SW5OcFp5SXNJbmdpT2lKRFdVdEdjbmxOVWpOc2RubHpiemQ0UjBKeVN6QnJRMkZZYUdwSGFXdFdMV3MxT0dGSE1GSTBTWGh6SWl3aWVTSTZJakV0TkhoTFowcFBkRlZyYjNablJqVnFjVWMxTm1KeGFtbG5UMEpUTVdGT09FZEJOMUV5YURsUlJtc2lmUSJ9LCJpc3N1YW5jZURhdGUiOiIyMDIyLTExLTA3VDIxOjI5OjI5LjIzNVoifSwibmJmIjoxNjY3ODU2NTY5LCJqdGkiOiJkaWQ6dmVsb2NpdHk6djI6MHhjMTY3MTUxNmMyMTQ1ZDcwYjM0MGY1NjBhYjFjYjU4Y2M0ZDhhMDUyOjE2Mzc4MjY4NTEwMzM4MToxOTg2IiwiaXNzIjoiZGlkOmlvbjpFaUJhS2lkaHBIZmtmc2VqWk9VMWNPWFZ5YXZxOFlLX2hSX0xoMF9XQjU1UF9BIiwic3ViIjoiZGlkOmp3azpleUpqY25ZaU9pSnpaV053TWpVMmF6RWlMQ0pyZEhraU9pSkZReUlzSW5WelpTSTZJbk5wWnlJc0luZ2lPaUpEV1V0R2NubE5Vak5zZG5semJ6ZDRSMEp5U3pCclEyRllhR3BIYVd0V0xXczFPR0ZITUZJMFNYaHpJaXdpZVNJNklqRXROSGhMWjBwUGRGVnJiM1puUmpWcWNVYzFObUp4YW1sblQwSlRNV0ZPT0VkQk4xRXlhRGxSUm1zaWZRIiwiaWF0IjoxNjY3ODU2NTY5fQ.-SiM5d7UrYn1gdj2hU5T5LnLQzhIklOtoexbyebLMeha0K89vkujsbFN4HNFP2TSfRYFt0-jXwDaZ8RNKESwFA',
308
+ parentId: parentCredential.id,
309
+ kmsKeyRef: 'testRef',
310
+ identifierMethod: 'did',
311
+ issuerCorrelationType: CredentialCorrelationType.DID,
312
+ subjectCorrelationType: CredentialCorrelationType.DID,
313
+ issuerCorrelationId: 'did:key:z1Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
314
+ subjectCorrelationId: 'did:key:z6Mkrhky3pusm26MeiFaXU3n2nekramwFUmgGreGGkDV6zQj',
315
+ credentialRole: CredentialRole.VERIFIER,
316
+ tenantId: 'urn:uuid:nnag4b43-1e7a-98f8-a32c-a48dbc5b10mj',
317
+ }
318
+ const savedDigitalCredential2: DigitalCredential = await digitalCredentialStore.addCredential(digitalCredential2)
319
+ let deleteResult: boolean = await digitalCredentialStore.removeCredential({ id: savedDigitalCredential2.id })
320
+ expect(deleteResult).toEqual(true)
321
+ const fetchedCredential: DigitalCredential = await digitalCredentialStore.getCredential({ id: parentCredential.id })
322
+ expect(fetchedCredential.id).toEqual(parentCredential.id)
323
+ })
324
+
250
325
  it('should not delete stored digital credential if id not found', async (): Promise<void> => {
251
326
  const result = await digitalCredentialStore.removeCredential({ id: 'unknown_id' })
252
327
  expect(result).toEqual(false)
@@ -1,10 +1,10 @@
1
1
  import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
2
  import { PartyCorrelationType } from '@sphereon/ssi-sdk.core'
3
- import { ActionType, InitiatorType, LogLevel, SubSystem, System, SystemCorrelationIdType } from '@sphereon/ssi-types'
3
+ import { ActionType, InitiatorType, LoggingEventType, LogLevel, SubSystem, System, SystemCorrelationIdType } from '@sphereon/ssi-types'
4
4
  import { DataSource } from 'typeorm'
5
5
  import { DataStoreEventLoggerEntities } from '../index'
6
6
  import { DataStoreEventLoggerMigrations } from '../migrations/generic'
7
- import { auditEventEntityFrom, AuditEventEntity } from '../entities/eventLogger/AuditEventEntity'
7
+ import { AuditEventEntity, auditEventEntityFrom } from '../entities/eventLogger/AuditEventEntity'
8
8
  import { NonPersistedAuditLoggingEvent } from '../types'
9
9
 
10
10
  describe('Database entities tests', (): void => {
@@ -31,6 +31,7 @@ describe('Database entities tests', (): void => {
31
31
 
32
32
  it('should save audit event to database', async (): Promise<void> => {
33
33
  const auditEvent: NonPersistedAuditLoggingEvent = {
34
+ type: LoggingEventType.AUDIT,
34
35
  timestamp: new Date(),
35
36
  level: LogLevel.DEBUG,
36
37
  correlationId: 'b40b8474-58a2-4b23-9fde-bd6ee1902cdb',
@@ -1,5 +1,5 @@
1
1
  import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
- import { ActionType, InitiatorType, LogLevel, SubSystem, System, SystemCorrelationIdType } from '@sphereon/ssi-types'
2
+ import { ActionType, InitiatorType, LoggingEventType, LogLevel, SubSystem, System, SystemCorrelationIdType } from '@sphereon/ssi-types'
3
3
  import { DataSource } from 'typeorm'
4
4
  import { DataStoreEventLoggerMigrations } from '../migrations'
5
5
  import { DataStoreEventLoggerEntities } from '../index'
@@ -33,6 +33,7 @@ describe('Database entities tests', (): void => {
33
33
 
34
34
  it('should store audit event', async (): Promise<void> => {
35
35
  const auditEvent: NonPersistedAuditLoggingEvent = {
36
+ type: LoggingEventType.AUDIT,
36
37
  timestamp: new Date(),
37
38
  level: LogLevel.DEBUG,
38
39
  correlationId: 'b40b8474-58a2-4b23-9fde-bd6ee1902cdb',
@@ -58,6 +59,7 @@ describe('Database entities tests', (): void => {
58
59
 
59
60
  it('should get all audit events', async (): Promise<void> => {
60
61
  const auditEvent: NonPersistedAuditLoggingEvent = {
62
+ type: LoggingEventType.AUDIT,
61
63
  timestamp: new Date(),
62
64
  level: LogLevel.DEBUG,
63
65
  correlationId: 'b40b8474-58a2-4b23-9fde-bd6ee1902cdb',
@@ -89,6 +91,7 @@ describe('Database entities tests', (): void => {
89
91
 
90
92
  it('should get audit events by filter', async (): Promise<void> => {
91
93
  const auditEvent: NonPersistedAuditLoggingEvent = {
94
+ type: LoggingEventType.AUDIT,
92
95
  timestamp: new Date(),
93
96
  level: LogLevel.DEBUG,
94
97
  correlationId: 'b40b8474-58a2-4b23-9fde-bd6ee1902cdb',
@@ -106,9 +106,7 @@ export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
106
106
  let affected: number = 0
107
107
  const findResult = await dcRepo.findBy(query)
108
108
  for (const dc of findResult) {
109
- if (dc.parentId !== null && dc.parentId !== undefined) {
110
- affected += await this.deleteTree(dcRepo, { id: dc.parentId })
111
- }
109
+ affected += await this.deleteTree(dcRepo, { parentId: dc.id })
112
110
  const result = await dcRepo.delete(dc.id)
113
111
  if (result.affected) {
114
112
  affected += result.affected
@@ -1,9 +1,11 @@
1
- import { ActionSubType, ActionType, InitiatorType, LogLevel, SubSystem, System, SystemCorrelationIdType } from '@sphereon/ssi-types'
1
+ import { ActionSubType, ActionType, InitiatorType, LoggingEventType, LogLevel, SubSystem, System, SystemCorrelationIdType } from '@sphereon/ssi-types'
2
2
  import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
3
- import { PartyCorrelationType } from '@sphereon/ssi-sdk.core'
4
- import { NonPersistedAuditLoggingEvent } from '../../types'
3
+ import { CredentialType, PartyCorrelationType } from '@sphereon/ssi-sdk.core'
4
+ import { NonPersistedAuditLoggingEvent, NonPersistedActivityLoggingEvent } from '../../types'
5
5
  import { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
6
6
 
7
+ //TODO this entity, also contains some optional fields that are related to another event type (Activity) later we might want to refactor and reorganize this.
8
+ // For now I've added a discriminator value called eventType that can be one of the three types of events: 1. General, 2. Audit, and 3. Activity
7
9
  @Entity('AuditEvents')
8
10
  export class AuditEventEntity extends BaseEntity {
9
11
  @PrimaryGeneratedColumn('uuid')
@@ -12,6 +14,9 @@ export class AuditEventEntity extends BaseEntity {
12
14
  @Column({ name: 'timestamp', nullable: false, unique: false, type: typeOrmDateTime() })
13
15
  timestamp!: Date
14
16
 
17
+ @Column('simple-enum', { name: 'eventType', enum: LoggingEventType, nullable: false, unique: false })
18
+ type!: LoggingEventType
19
+
15
20
  @Column('simple-enum', { name: 'level', enum: LogLevel, nullable: false, unique: false })
16
21
  level!: LogLevel
17
22
 
@@ -54,6 +59,18 @@ export class AuditEventEntity extends BaseEntity {
54
59
  @Column('text', { name: 'description', nullable: false, unique: false })
55
60
  description!: string
56
61
 
62
+ @Column('simple-enum', { name: 'credentialType', enum: CredentialType, nullable: true, unique: false })
63
+ credentialType?: CredentialType
64
+
65
+ @Column('text', { name: 'credentialHash', nullable: true, unique: false })
66
+ credentialHash?: string
67
+
68
+ @Column('text', { name: 'originalCredential', nullable: true, unique: false })
69
+ originalCredential?: string
70
+
71
+ @Column('text', { name: 'sharePurpose', nullable: true, unique: false })
72
+ sharePurpose?: string
73
+
57
74
  @Column('text', { name: 'data', nullable: true, unique: false })
58
75
  data?: string
59
76
 
@@ -69,6 +86,7 @@ export class AuditEventEntity extends BaseEntity {
69
86
 
70
87
  export const auditEventEntityFrom = (args: NonPersistedAuditLoggingEvent): AuditEventEntity => {
71
88
  const auditEventEntity: AuditEventEntity = new AuditEventEntity()
89
+ auditEventEntity.type = LoggingEventType.AUDIT
72
90
  auditEventEntity.timestamp = args.timestamp
73
91
  auditEventEntity.level = args.level
74
92
  auditEventEntity.correlationId = args.correlationId
@@ -90,3 +108,32 @@ export const auditEventEntityFrom = (args: NonPersistedAuditLoggingEvent): Audit
90
108
 
91
109
  return auditEventEntity
92
110
  }
111
+
112
+ export const activityEventEntityFrom = (args: NonPersistedActivityLoggingEvent): AuditEventEntity => {
113
+ const activityEventEntity: AuditEventEntity = new AuditEventEntity()
114
+ activityEventEntity.type = LoggingEventType.ACTIVITY
115
+ activityEventEntity.timestamp = args.timestamp
116
+ activityEventEntity.level = args.level
117
+ activityEventEntity.correlationId = args.correlationId
118
+ activityEventEntity.system = args.system
119
+ activityEventEntity.subSystemType = args.subSystemType
120
+ activityEventEntity.actionType = args.actionType
121
+ activityEventEntity.actionSubType = args.actionSubType
122
+ activityEventEntity.initiatorType = args.initiatorType
123
+ activityEventEntity.systemCorrelationIdType = args.systemCorrelationIdType
124
+ activityEventEntity.systemCorrelationId = args.systemCorrelationId
125
+ activityEventEntity.systemAlias = args.systemAlias
126
+ activityEventEntity.partyCorrelationType = args.partyCorrelationType
127
+ activityEventEntity.partyCorrelationId = args.partyCorrelationId
128
+ activityEventEntity.partyAlias = args.partyAlias
129
+ activityEventEntity.description = args.description
130
+ activityEventEntity.partyCorrelationType = args.partyCorrelationType
131
+ activityEventEntity.data = JSON.stringify(args.data)
132
+ activityEventEntity.sharePurpose = args.sharePurpose
133
+ activityEventEntity.credentialType = args.credentialType
134
+ activityEventEntity.originalCredential = args.originalCredential
135
+ activityEventEntity.credentialHash = args.credentialHash
136
+ activityEventEntity.diagnosticData = JSON.stringify(args.diagnosticData)
137
+
138
+ return activityEventEntity
139
+ }
@@ -1,7 +1,9 @@
1
- import { GetAuditEventsArgs, StoreAuditEventArgs } from '../types'
2
- import { AuditLoggingEvent } from '@sphereon/ssi-sdk.core'
1
+ import { GetAuditEventsArgs, StoreActivityEventArgs, StoreAuditEventArgs } from '../types'
2
+ import { ActivityLoggingEvent, AuditLoggingEvent } from '@sphereon/ssi-sdk.core'
3
3
 
4
4
  export abstract class AbstractEventLoggerStore {
5
5
  abstract getAuditEvents(args: GetAuditEventsArgs): Promise<Array<AuditLoggingEvent>>
6
+ abstract getActivityEvents(args: GetAuditEventsArgs): Promise<Array<AuditLoggingEvent>>
6
7
  abstract storeAuditEvent(args: StoreAuditEventArgs): Promise<AuditLoggingEvent>
8
+ abstract storeActivityEvent(args: StoreActivityEventArgs): Promise<ActivityLoggingEvent>
7
9
  }
@@ -1,10 +1,11 @@
1
1
  import Debug, { Debugger } from 'debug'
2
2
  import { DataSource } from 'typeorm'
3
- import { AuditLoggingEvent } from '@sphereon/ssi-sdk.core'
3
+ import { ActivityLoggingEvent, AuditLoggingEvent } from '@sphereon/ssi-sdk.core'
4
4
  import { OrPromise } from '@sphereon/ssi-types'
5
5
  import { AbstractEventLoggerStore } from './AbstractEventLoggerStore'
6
- import { AuditEventEntity, auditEventEntityFrom } from '../entities/eventLogger/AuditEventEntity'
7
- import { GetAuditEventsArgs, StoreAuditEventArgs } from '../types'
6
+ import { activityEventEntityFrom, AuditEventEntity, auditEventEntityFrom } from '../entities/eventLogger/AuditEventEntity'
7
+ import { activityEventFrom, auditEventFrom } from '../utils/eventLogger/MappingUtils'
8
+ import {GetActivityEventsArgs, GetAuditEventsArgs, StoreActivityEventArgs, StoreAuditEventArgs} from '../types'
8
9
 
9
10
  const debug: Debugger = Debug('sphereon:ssi-sdk:event-store')
10
11
 
@@ -19,11 +20,33 @@ export class EventLoggerStore extends AbstractEventLoggerStore {
19
20
  getAuditEvents = async (args?: GetAuditEventsArgs): Promise<Array<AuditLoggingEvent>> => {
20
21
  const connection: DataSource = await this.dbConnection // TODO apply everywhere
21
22
  debug('Getting audit events', args)
23
+ const where: any = {}
24
+ if (args?.filter) {
25
+ args.filter.forEach((filterCondition) => {
26
+ Object.assign(where, filterCondition)
27
+ })
28
+ }
22
29
  const result: Array<AuditEventEntity> = await connection.getRepository(AuditEventEntity).find({
23
- ...(args?.filter && { where: args?.filter }),
30
+ where,
24
31
  })
25
32
 
26
- return result.map((event: AuditEventEntity) => this.auditEventFrom(event))
33
+ return result.map((event: AuditEventEntity) => auditEventFrom(event))
34
+ }
35
+
36
+ getActivityEvents = async (args?: GetActivityEventsArgs): Promise<Array<ActivityLoggingEvent>> => {
37
+ const connection: DataSource = await this.dbConnection
38
+ debug('Getting activity events', args)
39
+ const where: any = {}
40
+ if (args?.filter) {
41
+ args.filter.forEach((filterCondition) => {
42
+ Object.assign(where, filterCondition)
43
+ })
44
+ }
45
+ const result: Array<AuditEventEntity> = await connection.getRepository(AuditEventEntity).find({
46
+ where,
47
+ })
48
+
49
+ return result.map((event: AuditEventEntity) => activityEventFrom(event))
27
50
  }
28
51
 
29
52
  storeAuditEvent = async (args: StoreAuditEventArgs): Promise<AuditLoggingEvent> => {
@@ -34,29 +57,17 @@ export class EventLoggerStore extends AbstractEventLoggerStore {
34
57
  debug('Storing audit event', auditEventEntity)
35
58
  const createdResult: AuditEventEntity = await connection.getRepository(AuditEventEntity).save(auditEventEntity)
36
59
 
37
- return this.auditEventFrom(createdResult)
60
+ return auditEventFrom(createdResult)
38
61
  }
39
62
 
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) }),
63
+ storeActivityEvent = async (args: StoreActivityEventArgs): Promise<ActivityLoggingEvent> => {
64
+ const { event } = args
65
+
66
+ const activityEventEntity: AuditEventEntity = activityEventEntityFrom(event)
67
+ const connection: DataSource = await this.dbConnection
68
+ debug('Storing activity event', activityEventEntity)
69
+ const createdResult: AuditEventEntity = await connection.getRepository(AuditEventEntity).save(activityEventEntity)
70
+
71
+ return activityEventFrom(createdResult)
60
72
  }
61
- }
62
73
  }
@@ -11,6 +11,7 @@ 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'
14
15
  import {
15
16
  IAddCredentialBrandingArgs,
16
17
  IAddCredentialLocaleBrandingArgs,
@@ -30,7 +31,6 @@ import {
30
31
  IIssuerBrandingFilter,
31
32
  IIssuerLocaleBranding,
32
33
  IIssuerLocaleBrandingFilter,
33
- ILocaleBranding,
34
34
  IRemoveCredentialBrandingArgs,
35
35
  IRemoveCredentialLocaleBrandingArgs,
36
36
  IRemoveIssuerBrandingArgs,
@@ -42,6 +42,7 @@ import {
42
42
  ICredentialBrandingFilter,
43
43
  } from '../types'
44
44
 
45
+
45
46
  const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:issuance-branding-store')
46
47
 
47
48
  export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
@@ -71,7 +72,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
71
72
  debug('Adding credential branding', credentialBrandingEntity)
72
73
  const createdResult: CredentialBrandingEntity = await repository.save(credentialBrandingEntity)
73
74
 
74
- return this.credentialBrandingFrom(createdResult)
75
+ return credentialBrandingFrom(createdResult)
75
76
  }
76
77
 
77
78
  public getCredentialBranding = async (args?: IGetCredentialBrandingArgs): Promise<Array<ICredentialBranding>> => {
@@ -89,7 +90,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
89
90
  ...(filter && { where: filter }),
90
91
  })
91
92
 
92
- return result.map((credentialBranding: CredentialBrandingEntity) => this.credentialBrandingFrom(credentialBranding))
93
+ return result.map((credentialBranding: CredentialBrandingEntity) => credentialBrandingFrom(credentialBranding))
93
94
  }
94
95
 
95
96
  public removeCredentialBranding = async (args: IRemoveCredentialBrandingArgs): Promise<void> => {
@@ -133,7 +134,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
133
134
  debug('Updating credential branding', branding)
134
135
  const result: CredentialBrandingEntity = await repository.save(branding, { transaction: true })
135
136
 
136
- return this.credentialBrandingFrom(result)
137
+ return credentialBrandingFrom(result)
137
138
  }
138
139
 
139
140
  public addCredentialLocaleBranding = async (args: IAddCredentialLocaleBrandingArgs): Promise<ICredentialBranding> => {
@@ -188,7 +189,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
188
189
  return Promise.reject(Error('Unable to get updated credential branding'))
189
190
  }
190
191
 
191
- return this.credentialBrandingFrom(result)
192
+ return credentialBrandingFrom(result)
192
193
  }
193
194
 
194
195
  public getCredentialLocaleBranding = async (args?: IGetCredentialLocaleBrandingArgs): Promise<Array<ICredentialLocaleBranding>> => {
@@ -211,7 +212,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
211
212
  return credentialBrandingLocale
212
213
  ? credentialBrandingLocale.map(
213
214
  (credentialLocaleBranding: CredentialLocaleBrandingEntity) =>
214
- this.localeBrandingFrom(credentialLocaleBranding) as ICredentialLocaleBranding,
215
+ localeBrandingFrom(credentialLocaleBranding) as ICredentialLocaleBranding,
215
216
  )
216
217
  : []
217
218
  }
@@ -259,7 +260,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
259
260
  debug('Updating credential locale branding', localeBranding)
260
261
  const updatedResult: CredentialLocaleBrandingEntity = await repository.save(localeBranding, { transaction: true })
261
262
 
262
- return this.localeBrandingFrom(updatedResult) as ICredentialLocaleBranding
263
+ return localeBrandingFrom(updatedResult) as ICredentialLocaleBranding
263
264
  }
264
265
 
265
266
  public addIssuerBranding = async (args: IAddIssuerBrandingArgs): Promise<IIssuerBranding> => {
@@ -281,7 +282,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
281
282
  debug('Adding issuer branding', issuerBrandingEntity)
282
283
  const createdResult: IssuerBrandingEntity = await repository.save(issuerBrandingEntity)
283
284
 
284
- return this.issuerBrandingFrom(createdResult)
285
+ return issuerBrandingFrom(createdResult)
285
286
  }
286
287
 
287
288
  public getIssuerBranding = async (args?: IGetIssuerBrandingArgs): Promise<Array<IIssuerBranding>> => {
@@ -299,7 +300,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
299
300
  ...(filter && { where: filter }),
300
301
  })
301
302
 
302
- return result.map((issuerBranding: IssuerBrandingEntity) => this.issuerBrandingFrom(issuerBranding))
303
+ return result.map((issuerBranding: IssuerBrandingEntity) => issuerBrandingFrom(issuerBranding))
303
304
  }
304
305
 
305
306
  public removeIssuerBranding = async (args: IRemoveIssuerBrandingArgs): Promise<void> => {
@@ -343,7 +344,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
343
344
  debug('Updating issuer branding', branding)
344
345
  const result: IssuerBrandingEntity = await repository.save(branding, { transaction: true })
345
346
 
346
- return this.issuerBrandingFrom(result)
347
+ return issuerBrandingFrom(result)
347
348
  }
348
349
 
349
350
  public addIssuerLocaleBranding = async (args: IAddIssuerLocaleBrandingArgs): Promise<IIssuerBranding> => {
@@ -394,7 +395,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
394
395
  return Promise.reject(Error('Unable to get updated issuer branding'))
395
396
  }
396
397
 
397
- return this.issuerBrandingFrom(result)
398
+ return issuerBrandingFrom(result)
398
399
  }
399
400
 
400
401
  public getIssuerLocaleBranding = async (args?: IGetIssuerLocaleBrandingArgs): Promise<Array<IIssuerLocaleBranding>> => {
@@ -416,7 +417,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
416
417
 
417
418
  return issuerLocaleBranding
418
419
  ? issuerLocaleBranding.map(
419
- (issuerLocaleBranding: IssuerLocaleBrandingEntity) => this.localeBrandingFrom(issuerLocaleBranding) as IIssuerLocaleBranding,
420
+ (issuerLocaleBranding: IssuerLocaleBrandingEntity) => localeBrandingFrom(issuerLocaleBranding) as IIssuerLocaleBranding,
420
421
  )
421
422
  : []
422
423
  }
@@ -462,56 +463,7 @@ export class IssuanceBrandingStore extends AbstractIssuanceBrandingStore {
462
463
  debug('Updating issuer locale branding', localeBranding)
463
464
  const updatedResult: IssuerLocaleBrandingEntity = await repository.save(localeBranding, { transaction: true })
464
465
 
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
466
+ return localeBrandingFrom(updatedResult) as IIssuerLocaleBranding
515
467
  }
516
468
 
517
469
  private hasDuplicateLocales = async (localeBranding: Array<IBasicCredentialLocaleBranding | IBasicIssuerLocaleBranding>): Promise<boolean> => {
@@ -15,8 +15,36 @@ export class CreateAuditEvents1701634812183 implements MigrationInterface {
15
15
  await queryRunner.query(`CREATE TYPE "public"."Initiator_type_enum" AS ENUM('user', 'system', 'external')`)
16
16
  await queryRunner.query(`CREATE TYPE "public"."System_correlation_id_type_enum" AS ENUM('did', 'email', 'hostname', 'phone', 'user')`)
17
17
  await queryRunner.query(`CREATE TYPE "public"."Party_correlation_type_enum" AS ENUM('did', 'email', 'hostname', 'phone')`)
18
+ await queryRunner.query(`CREATE TYPE "public"."Event_type_enum" AS ENUM('audit', 'activity', 'general')`)
19
+ await queryRunner.query(`CREATE TYPE "public"."Event_credential_type_enum" AS ENUM('JSON_LD', 'JWT', 'SD_JWT', 'MSO_MDOC')`)
18
20
  await queryRunner.query(
19
- `CREATE TABLE "AuditEvents" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "timestamp" TIMESTAMP NOT NULL, "level" "public"."Level_enum" NOT NULL, "correlationId" TEXT NOT NULL, "system" "public"."System_enum" NOT NULL, "subSystemType" "public"."Subsystem_type_enum" NOT NULL, "actionType" "public"."Action_type_enum" NOT NULL, "actionSubType" TEXT NOT NULL, "initiatorType" "public"."Initiator_type_enum" NOT NULL, "systemCorrelationIdType" "public"."System_correlation_id_type_enum", "systemCorrelationId" TEXT, "systemAlias" TEXT, "partyCorrelationType" "public"."Party_correlation_type_enum", "partyCorrelationId" TEXT, "partyAlias" TEXT, "description" TEXT NOT NULL, "data" TEXT, "diagnosticData" TEXT, "created_at" TIMESTAMP NOT NULL DEFAULT now(), "last_updated_at" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_AuditEvents_id" PRIMARY KEY ("id"))`,
21
+ `CREATE TABLE "AuditEvents" (
22
+ "id" uuid NOT NULL DEFAULT uuid_generate_v4(),
23
+ "eventType" "public"."Event_type_enum" NOT NULL,
24
+ "timestamp" TIMESTAMP NOT NULL,
25
+ "level" "public"."Level_enum" NOT NULL,
26
+ "correlationId" TEXT NOT NULL,
27
+ "system" "public"."System_enum" NOT NULL,
28
+ "subSystemType" "public"."Subsystem_type_enum" NOT NULL,
29
+ "actionType" "public"."Action_type_enum" NOT NULL,
30
+ "actionSubType" TEXT NOT NULL,
31
+ "initiatorType" "public"."Initiator_type_enum" NOT NULL,
32
+ "systemCorrelationIdType" "public"."System_correlation_id_type_enum",
33
+ "systemCorrelationId" TEXT,
34
+ "systemAlias" TEXT,
35
+ "partyCorrelationType" "public"."Party_correlation_type_enum",
36
+ "partyCorrelationId" TEXT,
37
+ "partyAlias" TEXT,
38
+ "credentialType" "public"."Event_credential_type_enum",
39
+ "credentialHash" TEXT,
40
+ "originalCredential" TEXT,
41
+ "sharePurpose" TEXT,
42
+ "description" TEXT NOT NULL,
43
+ "data" TEXT,
44
+ "diagnosticData" TEXT,
45
+ "created_at" TIMESTAMP NOT NULL DEFAULT now(),
46
+ "last_updated_at" TIMESTAMP NOT NULL DEFAULT now(),
47
+ CONSTRAINT "PK_AuditEvents_id" PRIMARY KEY ("id"))`,
20
48
  )
21
49
  }
22
50