@sphereon/ssi-sdk.data-store 0.30.1-unstable.4 → 0.30.1
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.
- package/LICENSE +201 -201
- package/README.md +77 -77
- package/dist/contact/ContactStore.d.ts.map +1 -1
- package/dist/digitalCredential/DigitalCredentialStore.d.ts.map +1 -1
- package/dist/eventLogger/EventLoggerStore.d.ts.map +1 -1
- package/dist/issuanceBranding/IssuanceBrandingStore.d.ts.map +1 -1
- package/dist/migrations/internal-migrations-ormconfig.d.ts.map +1 -1
- package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.js +33 -33
- package/dist/migrations/postgres/1708797018115-CreateMachineStateStore.js +16 -16
- package/dist/migrations/postgres/1715761125001-CreateContacts.js +33 -33
- package/dist/migrations/postgres/1716475165345-CreatePresentationDefinitions.js +12 -12
- package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.js +32 -32
- package/dist/migrations/sqlite/1708796002272-CreateMachineStateStore.js +15 -15
- package/dist/migrations/sqlite/1710438363002-CreateContacts.js +13 -13
- package/dist/migrations/sqlite/1715761125002-CreateContacts.js +32 -32
- package/dist/migrations/sqlite/1716475165344-CreatePresentationDefinitions.js +9 -9
- package/dist/presentationDefinition/PDStore.d.ts.map +1 -1
- package/dist/utils/SortingUtils.d.ts.map +1 -1
- package/dist/utils/contact/MappingUtils.d.ts.map +1 -1
- package/dist/utils/digitalCredential/MappingUtils.d.ts.map +1 -1
- package/dist/utils/digitalCredential/MappingUtils.js +4 -4
- package/dist/utils/digitalCredential/MappingUtils.js.map +1 -1
- package/dist/utils/presentationDefinition/MappingUtils.js +2 -2
- package/dist/utils/presentationDefinition/MappingUtils.js.map +1 -1
- package/package.json +8 -8
- package/src/__tests__/contact.entities.test.ts +2642 -2642
- package/src/__tests__/contact.store.test.ts +2649 -2649
- package/src/__tests__/digitalCredential.entities.test.ts +274 -274
- package/src/__tests__/digitalCredential.store.test.ts +330 -330
- package/src/__tests__/eventLogger.entities.test.ts +76 -76
- package/src/__tests__/eventLogger.store.test.ts +130 -130
- package/src/__tests__/issuanceBranding.entities.test.ts +846 -846
- package/src/__tests__/issuanceBranding.store.test.ts +1886 -1886
- package/src/__tests__/machineState.entities.test.ts +53 -53
- package/src/__tests__/machineState.store.test.ts +176 -176
- package/src/__tests__/pd-manager.entities.test.ts +73 -73
- package/src/__tests__/pd-manager.store.test.ts +193 -193
- package/src/contact/AbstractContactStore.ts +71 -71
- package/src/contact/ContactStore.ts +768 -768
- package/src/digitalCredential/AbstractDigitalCredentialStore.ts +21 -21
- package/src/digitalCredential/DigitalCredentialStore.ts +189 -189
- package/src/entities/contact/BaseContactEntity.ts +51 -51
- package/src/entities/contact/ConnectionEntity.ts +35 -35
- package/src/entities/contact/ContactMetadataItemEntity.ts +51 -51
- package/src/entities/contact/CorrelationIdentifierEntity.ts +43 -43
- package/src/entities/contact/DidAuthConfigEntity.ts +20 -20
- package/src/entities/contact/ElectronicAddressEntity.ts +70 -70
- package/src/entities/contact/IdentityEntity.ts +107 -107
- package/src/entities/contact/IdentityMetadataItemEntity.ts +48 -48
- package/src/entities/contact/NaturalPersonEntity.ts +44 -44
- package/src/entities/contact/OpenIdConfigEntity.ts +32 -32
- package/src/entities/contact/OrganizationEntity.ts +35 -35
- package/src/entities/contact/PartyEntity.ts +117 -117
- package/src/entities/contact/PartyRelationshipEntity.ts +68 -68
- package/src/entities/contact/PartyTypeEntity.ts +63 -63
- package/src/entities/contact/PhysicalAddressEntity.ts +95 -95
- package/src/entities/digitalCredential/DigitalCredentialEntity.ts +98 -98
- package/src/entities/eventLogger/AuditEventEntity.ts +92 -92
- package/src/entities/issuanceBranding/BackgroundAttributesEntity.ts +42 -42
- package/src/entities/issuanceBranding/BaseLocaleBrandingEntity.ts +87 -87
- package/src/entities/issuanceBranding/CredentialBrandingEntity.ts +79 -79
- package/src/entities/issuanceBranding/CredentialLocaleBrandingEntity.ts +33 -33
- package/src/entities/issuanceBranding/ImageAttributesEntity.ts +57 -57
- package/src/entities/issuanceBranding/ImageDimensionsEntity.ts +22 -22
- package/src/entities/issuanceBranding/IssuerBrandingEntity.ts +73 -73
- package/src/entities/issuanceBranding/IssuerLocaleBrandingEntity.ts +33 -33
- package/src/entities/issuanceBranding/TextAttributesEntity.ts +31 -31
- package/src/entities/machineState/MachineStateInfoEntity.ts +59 -59
- package/src/entities/presentationDefinition/PresentationDefinitionItemEntity.ts +44 -44
- package/src/entities/statusList2021/StatusList2021Entity.ts +96 -96
- package/src/entities/statusList2021/StatusList2021EntryEntity.ts +29 -29
- package/src/eventLogger/AbstractEventLoggerStore.ts +7 -7
- package/src/eventLogger/EventLoggerStore.ts +62 -62
- package/src/index.ts +160 -160
- package/src/issuanceBranding/IssuanceBrandingStore.ts +559 -559
- package/src/machineState/IAbstractMachineStateStore.ts +65 -65
- package/src/machineState/MachineStateStore.ts +149 -149
- package/src/migrations/generic/1-CreateContacts.ts +66 -66
- package/src/migrations/generic/10-CreatePresentationDefinitions.ts +66 -66
- package/src/migrations/generic/2-CreateIssuanceBranding.ts +64 -64
- package/src/migrations/generic/3-CreateContacts.ts +66 -66
- package/src/migrations/generic/4-CreateStatusList.ts +54 -54
- package/src/migrations/generic/5-CreateAuditEvents.ts +66 -66
- package/src/migrations/generic/6-CreateDigitalCredential.ts +66 -66
- package/src/migrations/generic/7-CreateMachineStateStore.ts +66 -66
- package/src/migrations/generic/8-CreateContacts.ts +66 -66
- package/src/migrations/generic/9-CreateContacts.ts +66 -66
- package/src/migrations/generic/index.ts +43 -43
- package/src/migrations/index.ts +10 -10
- package/src/migrations/postgres/1659463079428-CreateContacts.ts +63 -63
- package/src/migrations/postgres/1685628974232-CreateIssuanceBranding.ts +85 -85
- package/src/migrations/postgres/1690925872592-CreateContacts.ts +158 -158
- package/src/migrations/postgres/1693866470001-CreateStatusList.ts +24 -24
- package/src/migrations/postgres/1701634812183-CreateAuditEvents.ts +33 -33
- package/src/migrations/postgres/1708525189001-CreateDigitalCredential.ts +61 -61
- package/src/migrations/postgres/1708797018115-CreateMachineStateStore.ts +29 -29
- package/src/migrations/postgres/1710438363001-CreateContacts.ts +63 -63
- package/src/migrations/postgres/1715761125001-CreateContacts.ts +60 -60
- package/src/migrations/postgres/1716475165345-CreatePresentationDefinitions.ts +25 -25
- package/src/migrations/sqlite/1659463069549-CreateContacts.ts +110 -110
- package/src/migrations/sqlite/1685628973231-CreateIssuanceBranding.ts +119 -119
- package/src/migrations/sqlite/1690925872693-CreateContacts.ts +228 -228
- package/src/migrations/sqlite/1693866470000-CreateStatusList.ts +24 -24
- package/src/migrations/sqlite/1701634819487-CreateAuditEvents.ts +15 -15
- package/src/migrations/sqlite/1708525189002-CreateDigitalCredential.ts +46 -46
- package/src/migrations/sqlite/1708796002272-CreateMachineStateStore.ts +28 -28
- package/src/migrations/sqlite/1710438363002-CreateContacts.ts +83 -83
- package/src/migrations/sqlite/1715761125002-CreateContacts.ts +59 -59
- package/src/migrations/sqlite/1716475165344-CreatePresentationDefinitions.ts +24 -24
- package/src/presentationDefinition/AbstractPDStore.ts +20 -20
- package/src/presentationDefinition/PDStore.ts +185 -185
- package/src/statusList/IStatusListStore.ts +44 -44
- package/src/statusList/StatusListStore.ts +236 -236
- package/src/types/contact/IAbstractContactStore.ts +161 -161
- package/src/types/contact/contact.ts +295 -295
- package/src/types/digitalCredential/IAbstractDigitalCredentialStore.ts +42 -42
- package/src/types/digitalCredential/digitalCredential.ts +102 -102
- package/src/types/eventLogger/IAbstractEventLoggerStore.ts +12 -12
- package/src/types/eventLogger/eventLogger.ts +3 -3
- package/src/types/index.ts +14 -14
- package/src/types/machineState/IAbstractMachineStateStore.ts +68 -68
- package/src/types/presentationDefinition/IAbstractPDStore.ts +25 -25
- package/src/types/presentationDefinition/presentationDefinition.ts +17 -17
- package/src/utils/SortingUtils.ts +16 -16
- package/src/utils/contact/MappingUtils.ts +506 -506
- package/src/utils/digitalCredential/MappingUtils.ts +160 -160
- package/src/utils/hasher.ts +19 -19
- package/src/utils/presentationDefinition/MappingUtils.ts +52 -52
- package/dist/entities/contact/IMetadataEntity.d.ts +0 -8
- package/dist/entities/contact/IMetadataEntity.d.ts.map +0 -1
- package/dist/entities/contact/IMetadataEntity.js +0 -2
- package/dist/entities/contact/IMetadataEntity.js.map +0 -1
- package/dist/migrations/generic/8-CreatePresentationDefinitions.d.ts +0 -7
- package/dist/migrations/generic/8-CreatePresentationDefinitions.d.ts.map +0 -1
- package/dist/migrations/generic/8-CreatePresentationDefinitions.js +0 -78
- package/dist/migrations/generic/8-CreatePresentationDefinitions.js.map +0 -1
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
import {
|
|
2
|
-
StoreMachineStateDeleteExpiredArgs,
|
|
3
|
-
StoreMachineStateDeleteArgs,
|
|
4
|
-
StoreMachineStatesFindActiveArgs,
|
|
5
|
-
StoreFindMachineStatesArgs,
|
|
6
|
-
StoreMachineStatePersistArgs,
|
|
7
|
-
StoreMachineStateInfo,
|
|
8
|
-
StoreMachineStateGetArgs,
|
|
9
|
-
} from '../types'
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Represents an abstract class for storing machine states.
|
|
13
|
-
* This class provides methods for persisting, retrieving, and deleting machine states.
|
|
14
|
-
*
|
|
15
|
-
* @interface
|
|
16
|
-
*/
|
|
17
|
-
export abstract class IAbstractMachineStateStore {
|
|
18
|
-
/**
|
|
19
|
-
* Persists the machine state.
|
|
20
|
-
*
|
|
21
|
-
* @param {StoreMachineStatePersistArgs} state - The object containing the machine state to persist.
|
|
22
|
-
* @return {Promise<StoreMachineStateInfo>} - A Promise that resolves to the information about the persisted machine state.
|
|
23
|
-
*/
|
|
24
|
-
abstract persistMachineState(state: StoreMachineStatePersistArgs): Promise<StoreMachineStateInfo>
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Finds active machine states based on the given arguments.
|
|
28
|
-
*
|
|
29
|
-
* @param {StoreMachineStatesFindActiveArgs} args - The arguments for finding active machine states.
|
|
30
|
-
* @return {Promise<Array<StoreMachineStateInfo>>} - A promise that resolves with an array of active machine states.
|
|
31
|
-
*/
|
|
32
|
-
abstract findActiveMachineStates(args: StoreMachineStatesFindActiveArgs): Promise<Array<StoreMachineStateInfo>>
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Retrieves the state of a particular machine.
|
|
36
|
-
*
|
|
37
|
-
* @param {StoreMachineStateGetArgs} args - The arguments for retrieving the machine state.
|
|
38
|
-
* @returns {Promise<StoreMachineStateInfo>} - A promise that resolves to the machine state information.
|
|
39
|
-
*/
|
|
40
|
-
abstract getMachineState(args: StoreMachineStateGetArgs): Promise<StoreMachineStateInfo>
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Finds the machine states based on the given arguments.
|
|
44
|
-
*
|
|
45
|
-
* @param {StoreFindMachineStatesArgs} [args] - The arguments to filter the machine states.
|
|
46
|
-
* @returns {Promise<Array<StoreMachineStateInfo>>} - A promise that resolves to an array of machine state information.
|
|
47
|
-
*/
|
|
48
|
-
abstract findMachineStates(args?: StoreFindMachineStatesArgs): Promise<Array<StoreMachineStateInfo>>
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Deletes a machine state.
|
|
52
|
-
*
|
|
53
|
-
* @param {StoreMachineStateDeleteArgs} args - The arguments for deleting the machine state.
|
|
54
|
-
* @return {Promise<boolean>} - A promise that resolves to a boolean indicating if the machine state was successfully deleted or not.
|
|
55
|
-
*/
|
|
56
|
-
abstract deleteMachineState(args: StoreMachineStateDeleteArgs): Promise<boolean>
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Deletes expired machine states from the database.
|
|
60
|
-
*
|
|
61
|
-
* @param {StoreMachineStateDeleteExpiredArgs} args - The arguments for deleting expired machine states.
|
|
62
|
-
* @return {Promise<number>} - A promise that resolves to the number of deleted machine states.
|
|
63
|
-
*/
|
|
64
|
-
abstract deleteExpiredMachineStates(args: StoreMachineStateDeleteExpiredArgs): Promise<number>
|
|
65
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
StoreMachineStateDeleteExpiredArgs,
|
|
3
|
+
StoreMachineStateDeleteArgs,
|
|
4
|
+
StoreMachineStatesFindActiveArgs,
|
|
5
|
+
StoreFindMachineStatesArgs,
|
|
6
|
+
StoreMachineStatePersistArgs,
|
|
7
|
+
StoreMachineStateInfo,
|
|
8
|
+
StoreMachineStateGetArgs,
|
|
9
|
+
} from '../types'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Represents an abstract class for storing machine states.
|
|
13
|
+
* This class provides methods for persisting, retrieving, and deleting machine states.
|
|
14
|
+
*
|
|
15
|
+
* @interface
|
|
16
|
+
*/
|
|
17
|
+
export abstract class IAbstractMachineStateStore {
|
|
18
|
+
/**
|
|
19
|
+
* Persists the machine state.
|
|
20
|
+
*
|
|
21
|
+
* @param {StoreMachineStatePersistArgs} state - The object containing the machine state to persist.
|
|
22
|
+
* @return {Promise<StoreMachineStateInfo>} - A Promise that resolves to the information about the persisted machine state.
|
|
23
|
+
*/
|
|
24
|
+
abstract persistMachineState(state: StoreMachineStatePersistArgs): Promise<StoreMachineStateInfo>
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Finds active machine states based on the given arguments.
|
|
28
|
+
*
|
|
29
|
+
* @param {StoreMachineStatesFindActiveArgs} args - The arguments for finding active machine states.
|
|
30
|
+
* @return {Promise<Array<StoreMachineStateInfo>>} - A promise that resolves with an array of active machine states.
|
|
31
|
+
*/
|
|
32
|
+
abstract findActiveMachineStates(args: StoreMachineStatesFindActiveArgs): Promise<Array<StoreMachineStateInfo>>
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Retrieves the state of a particular machine.
|
|
36
|
+
*
|
|
37
|
+
* @param {StoreMachineStateGetArgs} args - The arguments for retrieving the machine state.
|
|
38
|
+
* @returns {Promise<StoreMachineStateInfo>} - A promise that resolves to the machine state information.
|
|
39
|
+
*/
|
|
40
|
+
abstract getMachineState(args: StoreMachineStateGetArgs): Promise<StoreMachineStateInfo>
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Finds the machine states based on the given arguments.
|
|
44
|
+
*
|
|
45
|
+
* @param {StoreFindMachineStatesArgs} [args] - The arguments to filter the machine states.
|
|
46
|
+
* @returns {Promise<Array<StoreMachineStateInfo>>} - A promise that resolves to an array of machine state information.
|
|
47
|
+
*/
|
|
48
|
+
abstract findMachineStates(args?: StoreFindMachineStatesArgs): Promise<Array<StoreMachineStateInfo>>
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Deletes a machine state.
|
|
52
|
+
*
|
|
53
|
+
* @param {StoreMachineStateDeleteArgs} args - The arguments for deleting the machine state.
|
|
54
|
+
* @return {Promise<boolean>} - A promise that resolves to a boolean indicating if the machine state was successfully deleted or not.
|
|
55
|
+
*/
|
|
56
|
+
abstract deleteMachineState(args: StoreMachineStateDeleteArgs): Promise<boolean>
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Deletes expired machine states from the database.
|
|
60
|
+
*
|
|
61
|
+
* @param {StoreMachineStateDeleteExpiredArgs} args - The arguments for deleting expired machine states.
|
|
62
|
+
* @return {Promise<number>} - A promise that resolves to the number of deleted machine states.
|
|
63
|
+
*/
|
|
64
|
+
abstract deleteExpiredMachineStates(args: StoreMachineStateDeleteExpiredArgs): Promise<number>
|
|
65
|
+
}
|
|
@@ -1,149 +1,149 @@
|
|
|
1
|
-
import { OrPromise } from '@sphereon/ssi-types'
|
|
2
|
-
import Debug from 'debug'
|
|
3
|
-
import { Brackets, DataSource, FindOptionsWhere, IsNull, LessThan, Not } from 'typeorm'
|
|
4
|
-
|
|
5
|
-
import { MachineStateInfoEntity } from '../entities/machineState/MachineStateInfoEntity'
|
|
6
|
-
import {
|
|
7
|
-
StoreFindMachineStatesArgs,
|
|
8
|
-
StoreMachineStateDeleteArgs,
|
|
9
|
-
StoreMachineStateDeleteExpiredArgs,
|
|
10
|
-
StoreMachineStateGetArgs,
|
|
11
|
-
StoreMachineStateInfo,
|
|
12
|
-
StoreMachineStatePersistArgs,
|
|
13
|
-
StoreMachineStatesFindActiveArgs,
|
|
14
|
-
} from '../types'
|
|
15
|
-
import { IAbstractMachineStateStore } from './IAbstractMachineStateStore'
|
|
16
|
-
|
|
17
|
-
const debug = Debug('sphereon:ssi-sdk:machine-state:store')
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Represents a data store for managing machine states.
|
|
21
|
-
*/
|
|
22
|
-
export class MachineStateStore extends IAbstractMachineStateStore {
|
|
23
|
-
private readonly _dbConnection: OrPromise<DataSource>
|
|
24
|
-
|
|
25
|
-
constructor(dbConnection: OrPromise<DataSource>) {
|
|
26
|
-
super()
|
|
27
|
-
this._dbConnection = dbConnection
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async persistMachineState(state: StoreMachineStatePersistArgs): Promise<StoreMachineStateInfo> {
|
|
31
|
-
const connection: DataSource = await this._dbConnection
|
|
32
|
-
const { machineName, instanceId, tenantId } = state
|
|
33
|
-
debug(`Executing persistMachineState for machine ${machineName}, instance ${instanceId}, tenantId: ${tenantId}...`)
|
|
34
|
-
const entity = MachineStateStore.machineStateInfoEntityFrom(state)
|
|
35
|
-
const existing = await connection.getRepository(MachineStateInfoEntity).findOne({
|
|
36
|
-
where: {
|
|
37
|
-
instanceId: state.instanceId,
|
|
38
|
-
},
|
|
39
|
-
})
|
|
40
|
-
if (existing && existing.updatedCount > state.updatedCount) {
|
|
41
|
-
const error = `Updating machine state with an older version is not allowed. Machine ${existing.machineName}, last count: ${
|
|
42
|
-
existing.updatedCount
|
|
43
|
-
}, new count: ${existing.updatedCount}, last updated: ${existing.updatedAt}, current: ${new Date()}, instance: ${existing.instanceId}`
|
|
44
|
-
console.log(error)
|
|
45
|
-
return Promise.reject(new Error(error))
|
|
46
|
-
}
|
|
47
|
-
// No need for a transaction. This is a single entity. We don't want to be surprised by an isolation level hiding the state from others
|
|
48
|
-
const result = await connection.getRepository(MachineStateInfoEntity).save(entity, { transaction: false })
|
|
49
|
-
debug(`Done persistMachineState machine ${machineName}, instance ${instanceId}, tenantId: ${tenantId}`)
|
|
50
|
-
return MachineStateStore.machineInfoFrom(result)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async findActiveMachineStates(args: StoreMachineStatesFindActiveArgs): Promise<Array<StoreMachineStateInfo>> {
|
|
54
|
-
const { tenantId, machineName, instanceId } = args
|
|
55
|
-
const connection: DataSource = await this._dbConnection
|
|
56
|
-
debug(`Executing findActiveMachineStates query with machineName: ${machineName}, tenantId: ${tenantId}`)
|
|
57
|
-
const queryBuilder = connection
|
|
58
|
-
.getRepository(MachineStateInfoEntity)
|
|
59
|
-
.createQueryBuilder('state')
|
|
60
|
-
.where('state.completedAt IS NULL')
|
|
61
|
-
.andWhere(
|
|
62
|
-
new Brackets((qb) => {
|
|
63
|
-
qb.where('state.expiresAt IS NULL').orWhere('state.expiresAt > :now', { now: new Date() })
|
|
64
|
-
}),
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
if (instanceId) {
|
|
68
|
-
queryBuilder.andWhere('state.instanceId = :instanceId', { instanceId })
|
|
69
|
-
}
|
|
70
|
-
if (tenantId) {
|
|
71
|
-
queryBuilder.andWhere('state.tenantId = :tenantId', { tenantId })
|
|
72
|
-
}
|
|
73
|
-
if (machineName) {
|
|
74
|
-
queryBuilder.andWhere('state.machineName = :machineName', { machineName })
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return (
|
|
78
|
-
(await queryBuilder
|
|
79
|
-
.orderBy('state.updatedAt', 'DESC')
|
|
80
|
-
.getMany()
|
|
81
|
-
.then((entities) => entities.map(MachineStateStore.machineInfoFrom))) ?? []
|
|
82
|
-
)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
async findMachineStates(args?: StoreFindMachineStatesArgs): Promise<Array<StoreMachineStateInfo>> {
|
|
86
|
-
const connection: DataSource = await this._dbConnection
|
|
87
|
-
debug('findMachineStates', args)
|
|
88
|
-
const result: Array<MachineStateInfoEntity> = await connection.getRepository(MachineStateInfoEntity).find({
|
|
89
|
-
...(args?.filter && { where: args?.filter }),
|
|
90
|
-
transaction: false,
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
return result.map((event: MachineStateInfoEntity) => MachineStateStore.machineInfoFrom(event))
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async getMachineState(args: StoreMachineStateGetArgs): Promise<StoreMachineStateInfo> {
|
|
97
|
-
const connection: DataSource = await this._dbConnection
|
|
98
|
-
debug('getMachineState', args)
|
|
99
|
-
return connection.getRepository(MachineStateInfoEntity).findOneOrFail({ where: { instanceId: args.instanceId } })
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
async deleteMachineState(args: StoreMachineStateDeleteArgs): Promise<boolean> {
|
|
103
|
-
debug(`Executing deleteMachineState query with id: ${args.instanceId}`)
|
|
104
|
-
if (!args.instanceId) {
|
|
105
|
-
throw new Error('No instanceId parameter is provided.')
|
|
106
|
-
}
|
|
107
|
-
try {
|
|
108
|
-
const connection: DataSource = await this._dbConnection
|
|
109
|
-
|
|
110
|
-
const result = await connection.getRepository(MachineStateInfoEntity).delete(args.instanceId)
|
|
111
|
-
return result.affected != null && result.affected > 0
|
|
112
|
-
} catch (error) {
|
|
113
|
-
debug(`Error deleting state: ${error}`)
|
|
114
|
-
return false
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
async deleteExpiredMachineStates(args: StoreMachineStateDeleteExpiredArgs): Promise<number> {
|
|
119
|
-
const { machineName, tenantId, deleteDoneStates } = args
|
|
120
|
-
debug(`Executing deleteExpiredMachineStates query with params: ${JSON.stringify(args)}`)
|
|
121
|
-
try {
|
|
122
|
-
const connection: DataSource = await this._dbConnection
|
|
123
|
-
|
|
124
|
-
const deleteCriteria: FindOptionsWhere<MachineStateInfoEntity> = {
|
|
125
|
-
...(machineName && { machineName }),
|
|
126
|
-
...(tenantId && { tenantId }),
|
|
127
|
-
// When deleteOnDone state is set we only look at completedAt, in other cases we compare current time with expiresAt
|
|
128
|
-
...(!deleteDoneStates && { expiresAt: LessThan(new Date()) }),
|
|
129
|
-
...(deleteDoneStates && { completedAt: Not(IsNull()) }),
|
|
130
|
-
}
|
|
131
|
-
const result = await connection.getRepository(MachineStateInfoEntity).delete(deleteCriteria)
|
|
132
|
-
return result.affected ?? 0
|
|
133
|
-
} catch (error) {
|
|
134
|
-
debug(`Error deleting machine info: ${error}`)
|
|
135
|
-
return Promise.reject(new Error(`Error deleting expired machine states for machine type ${machineName}`))
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
protected static machineInfoFrom = (machineStateInfoEntity: MachineStateInfoEntity): StoreMachineStateInfo => {
|
|
140
|
-
// We are making sure no entity function get copied
|
|
141
|
-
return JSON.parse(JSON.stringify(machineStateInfoEntity))
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
static machineStateInfoEntityFrom = (machineStateInfo: StoreMachineStateInfo | StoreMachineStatePersistArgs): MachineStateInfoEntity => {
|
|
145
|
-
const entity = new MachineStateInfoEntity()
|
|
146
|
-
Object.assign(entity, machineStateInfo)
|
|
147
|
-
return entity
|
|
148
|
-
}
|
|
149
|
-
}
|
|
1
|
+
import { OrPromise } from '@sphereon/ssi-types'
|
|
2
|
+
import Debug from 'debug'
|
|
3
|
+
import { Brackets, DataSource, FindOptionsWhere, IsNull, LessThan, Not } from 'typeorm'
|
|
4
|
+
|
|
5
|
+
import { MachineStateInfoEntity } from '../entities/machineState/MachineStateInfoEntity'
|
|
6
|
+
import {
|
|
7
|
+
StoreFindMachineStatesArgs,
|
|
8
|
+
StoreMachineStateDeleteArgs,
|
|
9
|
+
StoreMachineStateDeleteExpiredArgs,
|
|
10
|
+
StoreMachineStateGetArgs,
|
|
11
|
+
StoreMachineStateInfo,
|
|
12
|
+
StoreMachineStatePersistArgs,
|
|
13
|
+
StoreMachineStatesFindActiveArgs,
|
|
14
|
+
} from '../types'
|
|
15
|
+
import { IAbstractMachineStateStore } from './IAbstractMachineStateStore'
|
|
16
|
+
|
|
17
|
+
const debug = Debug('sphereon:ssi-sdk:machine-state:store')
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Represents a data store for managing machine states.
|
|
21
|
+
*/
|
|
22
|
+
export class MachineStateStore extends IAbstractMachineStateStore {
|
|
23
|
+
private readonly _dbConnection: OrPromise<DataSource>
|
|
24
|
+
|
|
25
|
+
constructor(dbConnection: OrPromise<DataSource>) {
|
|
26
|
+
super()
|
|
27
|
+
this._dbConnection = dbConnection
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async persistMachineState(state: StoreMachineStatePersistArgs): Promise<StoreMachineStateInfo> {
|
|
31
|
+
const connection: DataSource = await this._dbConnection
|
|
32
|
+
const { machineName, instanceId, tenantId } = state
|
|
33
|
+
debug(`Executing persistMachineState for machine ${machineName}, instance ${instanceId}, tenantId: ${tenantId}...`)
|
|
34
|
+
const entity = MachineStateStore.machineStateInfoEntityFrom(state)
|
|
35
|
+
const existing = await connection.getRepository(MachineStateInfoEntity).findOne({
|
|
36
|
+
where: {
|
|
37
|
+
instanceId: state.instanceId,
|
|
38
|
+
},
|
|
39
|
+
})
|
|
40
|
+
if (existing && existing.updatedCount > state.updatedCount) {
|
|
41
|
+
const error = `Updating machine state with an older version is not allowed. Machine ${existing.machineName}, last count: ${
|
|
42
|
+
existing.updatedCount
|
|
43
|
+
}, new count: ${existing.updatedCount}, last updated: ${existing.updatedAt}, current: ${new Date()}, instance: ${existing.instanceId}`
|
|
44
|
+
console.log(error)
|
|
45
|
+
return Promise.reject(new Error(error))
|
|
46
|
+
}
|
|
47
|
+
// No need for a transaction. This is a single entity. We don't want to be surprised by an isolation level hiding the state from others
|
|
48
|
+
const result = await connection.getRepository(MachineStateInfoEntity).save(entity, { transaction: false })
|
|
49
|
+
debug(`Done persistMachineState machine ${machineName}, instance ${instanceId}, tenantId: ${tenantId}`)
|
|
50
|
+
return MachineStateStore.machineInfoFrom(result)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async findActiveMachineStates(args: StoreMachineStatesFindActiveArgs): Promise<Array<StoreMachineStateInfo>> {
|
|
54
|
+
const { tenantId, machineName, instanceId } = args
|
|
55
|
+
const connection: DataSource = await this._dbConnection
|
|
56
|
+
debug(`Executing findActiveMachineStates query with machineName: ${machineName}, tenantId: ${tenantId}`)
|
|
57
|
+
const queryBuilder = connection
|
|
58
|
+
.getRepository(MachineStateInfoEntity)
|
|
59
|
+
.createQueryBuilder('state')
|
|
60
|
+
.where('state.completedAt IS NULL')
|
|
61
|
+
.andWhere(
|
|
62
|
+
new Brackets((qb) => {
|
|
63
|
+
qb.where('state.expiresAt IS NULL').orWhere('state.expiresAt > :now', { now: new Date() })
|
|
64
|
+
}),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
if (instanceId) {
|
|
68
|
+
queryBuilder.andWhere('state.instanceId = :instanceId', { instanceId })
|
|
69
|
+
}
|
|
70
|
+
if (tenantId) {
|
|
71
|
+
queryBuilder.andWhere('state.tenantId = :tenantId', { tenantId })
|
|
72
|
+
}
|
|
73
|
+
if (machineName) {
|
|
74
|
+
queryBuilder.andWhere('state.machineName = :machineName', { machineName })
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
(await queryBuilder
|
|
79
|
+
.orderBy('state.updatedAt', 'DESC')
|
|
80
|
+
.getMany()
|
|
81
|
+
.then((entities) => entities.map(MachineStateStore.machineInfoFrom))) ?? []
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async findMachineStates(args?: StoreFindMachineStatesArgs): Promise<Array<StoreMachineStateInfo>> {
|
|
86
|
+
const connection: DataSource = await this._dbConnection
|
|
87
|
+
debug('findMachineStates', args)
|
|
88
|
+
const result: Array<MachineStateInfoEntity> = await connection.getRepository(MachineStateInfoEntity).find({
|
|
89
|
+
...(args?.filter && { where: args?.filter }),
|
|
90
|
+
transaction: false,
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
return result.map((event: MachineStateInfoEntity) => MachineStateStore.machineInfoFrom(event))
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async getMachineState(args: StoreMachineStateGetArgs): Promise<StoreMachineStateInfo> {
|
|
97
|
+
const connection: DataSource = await this._dbConnection
|
|
98
|
+
debug('getMachineState', args)
|
|
99
|
+
return connection.getRepository(MachineStateInfoEntity).findOneOrFail({ where: { instanceId: args.instanceId } })
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async deleteMachineState(args: StoreMachineStateDeleteArgs): Promise<boolean> {
|
|
103
|
+
debug(`Executing deleteMachineState query with id: ${args.instanceId}`)
|
|
104
|
+
if (!args.instanceId) {
|
|
105
|
+
throw new Error('No instanceId parameter is provided.')
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const connection: DataSource = await this._dbConnection
|
|
109
|
+
|
|
110
|
+
const result = await connection.getRepository(MachineStateInfoEntity).delete(args.instanceId)
|
|
111
|
+
return result.affected != null && result.affected > 0
|
|
112
|
+
} catch (error) {
|
|
113
|
+
debug(`Error deleting state: ${error}`)
|
|
114
|
+
return false
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
async deleteExpiredMachineStates(args: StoreMachineStateDeleteExpiredArgs): Promise<number> {
|
|
119
|
+
const { machineName, tenantId, deleteDoneStates } = args
|
|
120
|
+
debug(`Executing deleteExpiredMachineStates query with params: ${JSON.stringify(args)}`)
|
|
121
|
+
try {
|
|
122
|
+
const connection: DataSource = await this._dbConnection
|
|
123
|
+
|
|
124
|
+
const deleteCriteria: FindOptionsWhere<MachineStateInfoEntity> = {
|
|
125
|
+
...(machineName && { machineName }),
|
|
126
|
+
...(tenantId && { tenantId }),
|
|
127
|
+
// When deleteOnDone state is set we only look at completedAt, in other cases we compare current time with expiresAt
|
|
128
|
+
...(!deleteDoneStates && { expiresAt: LessThan(new Date()) }),
|
|
129
|
+
...(deleteDoneStates && { completedAt: Not(IsNull()) }),
|
|
130
|
+
}
|
|
131
|
+
const result = await connection.getRepository(MachineStateInfoEntity).delete(deleteCriteria)
|
|
132
|
+
return result.affected ?? 0
|
|
133
|
+
} catch (error) {
|
|
134
|
+
debug(`Error deleting machine info: ${error}`)
|
|
135
|
+
return Promise.reject(new Error(`Error deleting expired machine states for machine type ${machineName}`))
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
protected static machineInfoFrom = (machineStateInfoEntity: MachineStateInfoEntity): StoreMachineStateInfo => {
|
|
140
|
+
// We are making sure no entity function get copied
|
|
141
|
+
return JSON.parse(JSON.stringify(machineStateInfoEntity))
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
static machineStateInfoEntityFrom = (machineStateInfo: StoreMachineStateInfo | StoreMachineStatePersistArgs): MachineStateInfoEntity => {
|
|
145
|
+
const entity = new MachineStateInfoEntity()
|
|
146
|
+
Object.assign(entity, machineStateInfo)
|
|
147
|
+
return entity
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
import { DatabaseType, MigrationInterface, QueryRunner } from 'typeorm'
|
|
2
|
-
import Debug from 'debug'
|
|
3
|
-
import { CreateContacts1659463079428 } from '../postgres/1659463079428-CreateContacts'
|
|
4
|
-
import { CreateContacts1659463069549 } from '../sqlite/1659463069549-CreateContacts'
|
|
5
|
-
|
|
6
|
-
const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:migrations')
|
|
7
|
-
|
|
8
|
-
export class CreateContacts1659463079429 implements MigrationInterface {
|
|
9
|
-
name = 'CreateContacts1659463079429'
|
|
10
|
-
|
|
11
|
-
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
12
|
-
debug('migration: creating contacts tables')
|
|
13
|
-
const dbType: DatabaseType = queryRunner.connection.driver.options.type
|
|
14
|
-
|
|
15
|
-
switch (dbType) {
|
|
16
|
-
case 'postgres': {
|
|
17
|
-
debug('using postgres migration file')
|
|
18
|
-
const mig: CreateContacts1659463079428 = new CreateContacts1659463079428()
|
|
19
|
-
await mig.up(queryRunner)
|
|
20
|
-
debug('Migration statements executed')
|
|
21
|
-
return
|
|
22
|
-
}
|
|
23
|
-
case 'sqlite':
|
|
24
|
-
case 'expo':
|
|
25
|
-
case 'react-native': {
|
|
26
|
-
debug('using sqlite/react-native migration file')
|
|
27
|
-
const mig: CreateContacts1659463069549 = new CreateContacts1659463069549()
|
|
28
|
-
await mig.up(queryRunner)
|
|
29
|
-
debug('Migration statements executed')
|
|
30
|
-
return
|
|
31
|
-
}
|
|
32
|
-
default:
|
|
33
|
-
return Promise.reject(
|
|
34
|
-
`Migrations are currently only supported for sqlite, react-native, expo and postgres. 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 contacts tables')
|
|
41
|
-
const dbType: DatabaseType = queryRunner.connection.driver.options.type
|
|
42
|
-
|
|
43
|
-
switch (dbType) {
|
|
44
|
-
case 'postgres': {
|
|
45
|
-
debug('using postgres migration file')
|
|
46
|
-
const mig: CreateContacts1659463079428 = new CreateContacts1659463079428()
|
|
47
|
-
await mig.down(queryRunner)
|
|
48
|
-
debug('Migration statements executed')
|
|
49
|
-
return
|
|
50
|
-
}
|
|
51
|
-
case 'sqlite':
|
|
52
|
-
case 'expo':
|
|
53
|
-
case 'react-native': {
|
|
54
|
-
debug('using sqlite/react-native migration file')
|
|
55
|
-
const mig: CreateContacts1659463069549 = new CreateContacts1659463069549()
|
|
56
|
-
await mig.down(queryRunner)
|
|
57
|
-
debug('Migration statements executed')
|
|
58
|
-
return
|
|
59
|
-
}
|
|
60
|
-
default:
|
|
61
|
-
return Promise.reject(
|
|
62
|
-
`Migrations are currently only supported for sqlite, react-native, expo and postgres. Was ${dbType}. Please run your database without migrations and with 'migrationsRun: false' and 'synchronize: true' for now`,
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
1
|
+
import { DatabaseType, MigrationInterface, QueryRunner } from 'typeorm'
|
|
2
|
+
import Debug from 'debug'
|
|
3
|
+
import { CreateContacts1659463079428 } from '../postgres/1659463079428-CreateContacts'
|
|
4
|
+
import { CreateContacts1659463069549 } from '../sqlite/1659463069549-CreateContacts'
|
|
5
|
+
|
|
6
|
+
const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:migrations')
|
|
7
|
+
|
|
8
|
+
export class CreateContacts1659463079429 implements MigrationInterface {
|
|
9
|
+
name = 'CreateContacts1659463079429'
|
|
10
|
+
|
|
11
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
12
|
+
debug('migration: creating contacts tables')
|
|
13
|
+
const dbType: DatabaseType = queryRunner.connection.driver.options.type
|
|
14
|
+
|
|
15
|
+
switch (dbType) {
|
|
16
|
+
case 'postgres': {
|
|
17
|
+
debug('using postgres migration file')
|
|
18
|
+
const mig: CreateContacts1659463079428 = new CreateContacts1659463079428()
|
|
19
|
+
await mig.up(queryRunner)
|
|
20
|
+
debug('Migration statements executed')
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
case 'sqlite':
|
|
24
|
+
case 'expo':
|
|
25
|
+
case 'react-native': {
|
|
26
|
+
debug('using sqlite/react-native migration file')
|
|
27
|
+
const mig: CreateContacts1659463069549 = new CreateContacts1659463069549()
|
|
28
|
+
await mig.up(queryRunner)
|
|
29
|
+
debug('Migration statements executed')
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
default:
|
|
33
|
+
return Promise.reject(
|
|
34
|
+
`Migrations are currently only supported for sqlite, react-native, expo and postgres. 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 contacts tables')
|
|
41
|
+
const dbType: DatabaseType = queryRunner.connection.driver.options.type
|
|
42
|
+
|
|
43
|
+
switch (dbType) {
|
|
44
|
+
case 'postgres': {
|
|
45
|
+
debug('using postgres migration file')
|
|
46
|
+
const mig: CreateContacts1659463079428 = new CreateContacts1659463079428()
|
|
47
|
+
await mig.down(queryRunner)
|
|
48
|
+
debug('Migration statements executed')
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
case 'sqlite':
|
|
52
|
+
case 'expo':
|
|
53
|
+
case 'react-native': {
|
|
54
|
+
debug('using sqlite/react-native migration file')
|
|
55
|
+
const mig: CreateContacts1659463069549 = new CreateContacts1659463069549()
|
|
56
|
+
await mig.down(queryRunner)
|
|
57
|
+
debug('Migration statements executed')
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
return Promise.reject(
|
|
62
|
+
`Migrations are currently only supported for sqlite, react-native, expo and postgres. Was ${dbType}. Please run your database without migrations and with 'migrationsRun: false' and 'synchronize: true' for now`,
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|