UNPKG

@sphereon/ssi-sdk.data-store

Version:

1 lines • 563 kB
{"version":3,"sources":["../src/index.ts","../src/entities/contact/BaseConfigEntity.ts","../src/entities/contact/ConnectionEntity.ts","../src/types/contact/contact.ts","../src/types/digitalCredential/enums.ts","../src/entities/contact/IdentityEntity.ts","../src/entities/contact/CorrelationIdentifierEntity.ts","../src/utils/ValidatorUtils.ts","../src/entities/contact/IdentityMetadataItemEntity.ts","../src/entities/contact/PartyEntity.ts","../src/entities/contact/PartyTypeEntity.ts","../src/entities/validators/index.ts","../src/entities/contact/BaseContactEntity.ts","../src/entities/contact/ContactMetadataItemEntity.ts","../src/entities/contact/PartyRelationshipEntity.ts","../src/entities/contact/ElectronicAddressEntity.ts","../src/entities/contact/PhysicalAddressEntity.ts","../src/entities/issuanceBranding/BaseLocaleBrandingEntity.ts","../src/entities/issuanceBranding/ImageAttributesEntity.ts","../src/entities/issuanceBranding/ImageDimensionsEntity.ts","../src/entities/issuanceBranding/BackgroundAttributesEntity.ts","../src/entities/issuanceBranding/TextAttributesEntity.ts","../src/entities/contact/DidAuthConfigEntity.ts","../src/entities/contact/OpenIdConfigEntity.ts","../src/entities/issuanceBranding/CredentialBrandingEntity.ts","../src/entities/issuanceBranding/CredentialLocaleBrandingEntity.ts","../src/entities/issuanceBranding/CredentialClaimsEntity.ts","../src/entities/issuanceBranding/IssuerLocaleBrandingEntity.ts","../src/entities/issuanceBranding/IssuerBrandingEntity.ts","../src/entities/statusList/StatusListEntities.ts","../src/entities/statusList/StatusList2021EntryEntity.ts","../src/entities/machineState/MachineStateInfoEntity.ts","../src/entities/contact/OrganizationEntity.ts","../src/entities/contact/NaturalPersonEntity.ts","../src/entities/eventLogger/AuditEventEntity.ts","../src/entities/digitalCredential/DigitalCredentialEntity.ts","../src/entities/presentationDefinition/PresentationDefinitionItemEntity.ts","../src/entities/oid4vcState/Oid4vcStateEntity.ts","../src/contact/ContactStore.ts","../src/contact/AbstractContactStore.ts","../src/utils/FormattingUtils.ts","../src/utils/contact/MappingUtils.ts","../src/digitalCredential/AbstractDigitalCredentialStore.ts","../src/digitalCredential/DigitalCredentialStore.ts","../src/utils/SortingUtils.ts","../src/issuanceBranding/AbstractIssuanceBrandingStore.ts","../src/issuanceBranding/IssuanceBrandingStore.ts","../src/utils/issuanceBranding/MappingUtils.ts","../src/statusList/StatusListStore.ts","../src/utils/statusList/MappingUtils.ts","../src/eventLogger/AbstractEventLoggerStore.ts","../src/eventLogger/EventLoggerStore.ts","../src/utils/eventLogger/MappingUtils.ts","../src/machineState/IAbstractMachineStateStore.ts","../src/machineState/MachineStateStore.ts","../src/presentationDefinition/AbstractPDStore.ts","../src/presentationDefinition/PDStore.ts","../src/utils/presentationDefinition/MappingUtils.ts","../src/migrations/generic/1-CreateContacts.ts","../src/migrations/postgres/1659463079428-CreateContacts.ts","../src/migrations/sqlite/1659463069549-CreateContacts.ts","../src/migrations/generic/2-CreateIssuanceBranding.ts","../src/migrations/postgres/1685628974232-CreateIssuanceBranding.ts","../src/migrations/sqlite/1685628973231-CreateIssuanceBranding.ts","../src/migrations/generic/3-CreateContacts.ts","../src/migrations/sqlite/1690925872693-CreateContacts.ts","../src/migrations/postgres/1690925872592-CreateContacts.ts","../src/migrations/generic/4-CreateStatusList.ts","../src/migrations/postgres/1693866470001-CreateStatusList.ts","../src/migrations/sqlite/1693866470000-CreateStatusList.ts","../src/migrations/postgres/1737110469001-UpdateStatusList.ts","../src/migrations/sqlite/1737110469000-UpdateStatusList.ts","../src/migrations/generic/5-CreateAuditEvents.ts","../src/migrations/sqlite/1701634819487-CreateAuditEvents.ts","../src/migrations/postgres/1701634812183-CreateAuditEvents.ts","../src/migrations/generic/6-CreateDigitalCredential.ts","../src/migrations/postgres/1708525189001-CreateDigitalCredential.ts","../src/migrations/sqlite/1708525189002-CreateDigitalCredential.ts","../src/migrations/generic/7-CreateMachineStateStore.ts","../src/migrations/postgres/1708797018115-CreateMachineStateStore.ts","../src/migrations/sqlite/1708796002272-CreateMachineStateStore.ts","../src/migrations/generic/8-CreateContacts.ts","../src/migrations/postgres/1710438363001-CreateContacts.ts","../src/migrations/sqlite/1710438363002-CreateContacts.ts","../src/migrations/generic/9-CreateContacts.ts","../src/migrations/postgres/1715761125001-CreateContacts.ts","../src/migrations/sqlite/1715761125002-CreateContacts.ts","../src/migrations/generic/10-CreatePresentationDefinitions.ts","../src/migrations/postgres/1716475165345-CreatePresentationDefinitions.ts","../src/migrations/sqlite/1716475165344-CreatePresentationDefinitions.ts","../src/migrations/generic/11-FixCredentialClaimsReferenceUuid.ts","../src/migrations/postgres/1741895822987-FixCredentialClaimsReferencesUuid.ts","../src/migrations/sqlite/1741895822987-FixCredentialClaimsReferencesUuid.ts","../src/migrations/generic/index.ts","../src/utils/digitalCredential/MappingUtils.ts"],"sourcesContent":["import { BaseConfigEntity } from './entities/contact/BaseConfigEntity'\nimport { BaseLocaleBrandingEntity } from './entities/issuanceBranding/BaseLocaleBrandingEntity'\nimport { BaseContactEntity } from './entities/contact/BaseContactEntity'\nimport { ConnectionEntity } from './entities/contact/ConnectionEntity'\nimport { PartyEntity } from './entities/contact/PartyEntity'\nimport { CorrelationIdentifierEntity } from './entities/contact/CorrelationIdentifierEntity'\nimport { DidAuthConfigEntity } from './entities/contact/DidAuthConfigEntity'\nimport { IdentityEntity } from './entities/contact/IdentityEntity'\nimport { IdentityMetadataItemEntity } from './entities/contact/IdentityMetadataItemEntity'\nimport { OpenIdConfigEntity } from './entities/contact/OpenIdConfigEntity'\nimport { BackgroundAttributesEntity } from './entities/issuanceBranding/BackgroundAttributesEntity'\nimport { CredentialBrandingEntity } from './entities/issuanceBranding/CredentialBrandingEntity'\nimport { CredentialLocaleBrandingEntity } from './entities/issuanceBranding/CredentialLocaleBrandingEntity'\nimport { ImageAttributesEntity } from './entities/issuanceBranding/ImageAttributesEntity'\nimport { ImageDimensionsEntity } from './entities/issuanceBranding/ImageDimensionsEntity'\nimport { IssuerLocaleBrandingEntity } from './entities/issuanceBranding/IssuerLocaleBrandingEntity'\nimport { IssuerBrandingEntity } from './entities/issuanceBranding/IssuerBrandingEntity'\nimport { TextAttributesEntity } from './entities/issuanceBranding/TextAttributesEntity'\nimport { OAuthStatusListEntity, StatusList2021Entity, StatusListEntity } from './entities/statusList/StatusListEntities'\nimport { StatusListEntryEntity } from './entities/statusList/StatusList2021EntryEntity'\nimport { MachineStateInfoEntity } from './entities/machineState/MachineStateInfoEntity'\n// import { IStatusListEntity, IStatusListEntryEntity } from './types.'\nimport { PartyRelationshipEntity } from './entities/contact/PartyRelationshipEntity'\nimport { PartyTypeEntity } from './entities/contact/PartyTypeEntity'\nimport { OrganizationEntity } from './entities/contact/OrganizationEntity'\nimport { NaturalPersonEntity } from './entities/contact/NaturalPersonEntity'\nimport { ElectronicAddressEntity } from './entities/contact/ElectronicAddressEntity'\nimport { PhysicalAddressEntity } from './entities/contact/PhysicalAddressEntity'\nimport { AuditEventEntity } from './entities/eventLogger/AuditEventEntity'\nimport { DigitalCredentialEntity } from './entities/digitalCredential/DigitalCredentialEntity'\nimport { PresentationDefinitionItemEntity } from './entities/presentationDefinition/PresentationDefinitionItemEntity'\nimport { ContactMetadataItemEntity } from './entities/contact/ContactMetadataItemEntity'\nimport { CredentialClaimsEntity } from './entities/issuanceBranding/CredentialClaimsEntity'\n\nimport { Oid4vcStateEntity } from './entities/oid4vcState/Oid4vcStateEntity'\n// import {PartyCorrelationType} from \"@sphereon/ssi-sdk.core\";\n\nexport { ContactStore } from './contact/ContactStore'\nexport { AbstractContactStore } from './contact/AbstractContactStore'\nexport { AbstractDigitalCredentialStore } from './digitalCredential/AbstractDigitalCredentialStore'\nexport { DigitalCredentialStore } from './digitalCredential/DigitalCredentialStore'\nexport { AbstractIssuanceBrandingStore } from './issuanceBranding/AbstractIssuanceBrandingStore'\nexport { IssuanceBrandingStore } from './issuanceBranding/IssuanceBrandingStore'\nexport { StatusListStore } from './statusList/StatusListStore'\nexport { AbstractEventLoggerStore } from './eventLogger/AbstractEventLoggerStore'\nexport { EventLoggerStore } from './eventLogger/EventLoggerStore'\nexport { IAbstractMachineStateStore } from './machineState/IAbstractMachineStateStore'\nexport { MachineStateStore } from './machineState/MachineStateStore'\nexport { AbstractPDStore } from './presentationDefinition/AbstractPDStore'\nexport { PDStore } from './presentationDefinition/PDStore'\nexport {\n DataStoreMigrations,\n DataStoreEventLoggerMigrations,\n DataStoreContactMigrations,\n DataStoreDigitalCredentialMigrations,\n DataStoreIssuanceBrandingMigrations,\n DataStoreStatusListMigrations,\n DataStoreMachineStateMigrations,\n DataStorePresentationDefinitionMigrations,\n} from './migrations'\nexport * from './types'\nexport * from './utils/contact/MappingUtils'\nexport * from './utils/digitalCredential/MappingUtils'\nexport * from './utils/eventLogger/MappingUtils'\nexport * from './utils/issuanceBranding/MappingUtils'\nexport * from './utils/presentationDefinition/MappingUtils'\n\nexport const DataStoreContactEntities = [\n BaseConfigEntity,\n ConnectionEntity,\n PartyEntity,\n IdentityEntity,\n IdentityMetadataItemEntity,\n CorrelationIdentifierEntity,\n DidAuthConfigEntity,\n OpenIdConfigEntity,\n PartyRelationshipEntity,\n PartyTypeEntity,\n BaseContactEntity,\n OrganizationEntity,\n NaturalPersonEntity,\n ElectronicAddressEntity,\n PhysicalAddressEntity,\n ContactMetadataItemEntity,\n]\n\nexport const DataStoreOid4vcStateEntities = [Oid4vcStateEntity]\nexport const DataStoreIssuanceBrandingEntities = [\n BackgroundAttributesEntity,\n CredentialBrandingEntity,\n ImageAttributesEntity,\n ImageDimensionsEntity,\n BaseLocaleBrandingEntity,\n IssuerBrandingEntity,\n TextAttributesEntity,\n CredentialLocaleBrandingEntity,\n IssuerLocaleBrandingEntity,\n CredentialClaimsEntity,\n]\n\nexport const DataStorePresentationDefinitionEntities = [PresentationDefinitionItemEntity]\n\nexport const DataStoreStatusListEntities = [StatusListEntity, StatusList2021Entity, OAuthStatusListEntity, StatusListEntryEntity]\n\nexport const DataStoreEventLoggerEntities = [AuditEventEntity]\n\nexport const DataStoreDigitalCredentialEntities = [DigitalCredentialEntity]\n\nexport const DataStoreMachineStateEntities = [MachineStateInfoEntity]\n\n// All entities combined if a party wants to enable them all at once\nexport const DataStoreEntities = [\n ...DataStoreContactEntities,\n ...DataStoreIssuanceBrandingEntities,\n ...DataStoreStatusListEntities,\n ...DataStoreEventLoggerEntities,\n ...DataStoreDigitalCredentialEntities,\n ...DataStoreMachineStateEntities,\n ...DataStorePresentationDefinitionEntities,\n // ...DataStoreOid4vcStateEntities,\n]\n\nexport {\n BaseConfigEntity,\n ConnectionEntity,\n PartyEntity,\n BaseContactEntity,\n CorrelationIdentifierEntity,\n DidAuthConfigEntity,\n IdentityEntity,\n IdentityMetadataItemEntity,\n OpenIdConfigEntity,\n BackgroundAttributesEntity,\n CredentialBrandingEntity,\n ImageAttributesEntity,\n ImageDimensionsEntity,\n BaseLocaleBrandingEntity,\n IssuerBrandingEntity,\n TextAttributesEntity,\n CredentialLocaleBrandingEntity,\n IssuerLocaleBrandingEntity,\n ElectronicAddressEntity,\n PhysicalAddressEntity,\n StatusListEntity,\n StatusListEntryEntity,\n OAuthStatusListEntity,\n StatusList2021Entity,\n AuditEventEntity,\n DigitalCredentialEntity,\n MachineStateInfoEntity,\n PresentationDefinitionItemEntity,\n ContactMetadataItemEntity,\n CredentialClaimsEntity,\n Oid4vcStateEntity,\n}\n","import typeorm from 'typeorm'\nconst { BaseEntity, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn, TableInheritance } = typeorm\nimport { ConnectionEntity } from './ConnectionEntity'\n\n@Entity('BaseConfig')\n@TableInheritance({ column: { type: 'varchar', name: 'type' } })\nexport abstract class BaseConfigEntity extends BaseEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @OneToOne(() => ConnectionEntity, (connection: ConnectionEntity) => connection.config, {\n cascade: ['insert', 'update'],\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'connection_id' })\n connection?: ConnectionEntity\n}\n","import typeorm from 'typeorm'\nconst { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn, BaseEntity } = typeorm\nimport { BaseConfigEntity } from './BaseConfigEntity'\nimport { ConnectionType } from '../../types'\nimport { IdentityEntity } from './IdentityEntity'\nimport { OpenIdConfigEntity } from './OpenIdConfigEntity'\nimport { DidAuthConfigEntity } from './DidAuthConfigEntity'\n\n@Entity('Connection')\nexport class ConnectionEntity extends BaseEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('simple-enum', { name: 'type', enum: ConnectionType, nullable: false })\n type!: ConnectionType\n\n @Column('text', { name: 'tenant_id', nullable: true })\n tenantId?: string\n\n @Column('text', { name: 'owner_id', nullable: true })\n ownerId?: string\n\n @OneToOne(() => BaseConfigEntity, (config: OpenIdConfigEntity | DidAuthConfigEntity) => config.connection, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n config!: BaseConfigEntity\n\n @OneToOne(() => IdentityEntity, (identity: IdentityEntity) => identity.connection, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'identity_id' })\n identity!: IdentityEntity\n}\n","import { ManagedIdentifierOptsOrResult } from '@sphereon/ssi-sdk-ext.identifier-resolution'\nimport { IIdentifier } from '@veramo/core'\nimport { IIssuerLocaleBranding } from '../issuanceBranding/issuanceBranding'\nimport { CredentialRole } from '../digitalCredential'\n\nexport type MetadataTypes = string | number | Date | boolean | undefined\n\nexport interface IMetadataEntity {\n // TODO move to types\n label: string\n stringValue?: string\n numberValue?: number\n dateValue?: Date\n boolValue?: boolean\n}\n\nexport type Party = {\n id: string\n uri?: string\n roles: Array<CredentialRole>\n ownerId?: string\n tenantId?: string\n identities: Array<Identity>\n electronicAddresses: Array<ElectronicAddress>\n physicalAddresses: Array<PhysicalAddress>\n contact: Contact\n partyType: PartyType\n /**\n * TODO: Integrate branding logic here in the future. What we should do is make the issuance branding plugin part of the contact-manager and retrieve any branding there is.\n *\n * Currently, we are only defining the branding type within the SDK without implementing the associated logic. This is because:\n * 1. We are combining two types from the SSI-SDK to create a new type that will be used across multiple places in the wallets (web & mobile).\n * 2. While it makes sense to have this combined type in the SDK, the logic to support database connections for these types is complex. The types belong to different modules, and we don't use them together currently.\n * 3. Implementing the full logic now would require significant changes and cross-module interactions, which we don't have the time to address at present.\n *\n * For now, we are defining the type here and will use it in the mobile wallet has the logic for it. This is a temporary solution until we have the resources to integrate the branding logic fully.\n */\n branding?: IIssuerLocaleBranding\n relationships: Array<PartyRelationship>\n createdAt: Date\n lastUpdatedAt: Date\n}\nexport type NonPersistedParty = Omit<\n Party,\n | 'id'\n | 'identities'\n | 'electronicAddresses'\n | 'physicalAddresses'\n | 'contact'\n | 'roles'\n | 'partyType'\n | 'relationships'\n | 'createdAt'\n | 'lastUpdatedAt'\n> & {\n identities?: Array<NonPersistedIdentity>\n electronicAddresses?: Array<NonPersistedElectronicAddress>\n physicalAddresses?: Array<NonPersistedPhysicalAddress>\n contact: NonPersistedContact\n partyType: NonPersistedPartyType\n relationships?: Array<NonPersistedPartyRelationship>\n}\nexport type PartialParty = Partial<\n Omit<Party, 'identities' | 'electronicAddresses' | 'physicalAddresses' | 'contact' | 'partyType' | 'relationships'>\n> & {\n identities?: PartialIdentity\n electronicAddresses?: PartialElectronicAddress\n physicalAddresses?: PartialPhysicalAddress\n contact?: PartialContact\n partyType?: PartialPartyType\n relationships?: PartialPartyRelationship\n}\n\nexport type Identity = {\n id: string\n alias: string\n ownerId?: string\n tenantId?: string\n origin: IdentityOrigin\n roles: Array<CredentialRole>\n identifier: CorrelationIdentifier\n connection?: Connection\n metadata?: Array<MetadataItem<MetadataTypes>>\n createdAt: Date\n lastUpdatedAt: Date\n}\nexport type NonPersistedIdentity = Omit<Identity, 'id' | 'identifier' | 'connection' | 'metadata' | 'origin' | 'createdAt' | 'lastUpdatedAt'> & {\n origin: IdentityOrigin\n identifier: NonPersistedCorrelationIdentifier\n connection?: NonPersistedConnection\n metadata?: Array<NonPersistedMetadataItem<MetadataTypes>>\n}\nexport type PartialIdentity = Partial<Omit<Identity, 'identifier' | 'connection' | 'metadata' | 'origin' | 'roles'>> & {\n identifier?: PartialCorrelationIdentifier\n connection?: PartialConnection\n metadata?: PartialMetadataItem<MetadataTypes> // Usage: FindIdentityArgs = Array<PartialIdentity>\n origin?: IdentityOrigin\n roles?: CredentialRole\n partyId?: string\n}\n\nexport type MetadataItem<T extends MetadataTypes> = {\n id: string\n label: string\n value: T\n}\n\nexport type NonPersistedMetadataItem<T extends MetadataTypes> = Omit<MetadataItem<T>, 'id'>\nexport type PartialMetadataItem<T extends MetadataTypes> = Partial<MetadataItem<T>>\n\nexport type CorrelationIdentifier = {\n id: string\n ownerId?: string\n tenantId?: string\n type: CorrelationIdentifierType\n correlationId: string\n}\nexport type NonPersistedCorrelationIdentifier = Omit<CorrelationIdentifier, 'id'>\nexport type PartialCorrelationIdentifier = Partial<CorrelationIdentifier>\n\nexport type Connection = {\n id: string\n ownerId?: string\n tenantId?: string\n type: ConnectionType\n config: ConnectionConfig\n}\nexport type NonPersistedConnection = Omit<Connection, 'id' | 'config'> & {\n config: NonPersistedConnectionConfig\n}\nexport type PartialConnection = Partial<Omit<Connection, 'config'>> & {\n config: PartialConnectionConfig\n}\n\nexport type OpenIdConfig = {\n id: string\n clientId: string\n clientSecret: string\n ownerId?: string\n tenantId?: string\n scopes: Array<string>\n issuer: string\n redirectUrl: string\n dangerouslyAllowInsecureHttpRequests: boolean\n clientAuthMethod: 'basic' | 'post' | undefined\n}\nexport type NonPersistedOpenIdConfig = Omit<OpenIdConfig, 'id'>\nexport type PartialOpenIdConfig = Partial<OpenIdConfig>\n\nexport type DidAuthConfig = {\n id: string\n idOpts: ManagedIdentifierOptsOrResult\n stateId: string\n ownerId?: string\n tenantId?: string\n redirectUrl: string\n sessionId: string\n}\nexport type NonPersistedDidAuthConfig = Omit<DidAuthConfig, 'id'>\nexport type PartialDidAuthConfig = Partial<Omit<DidAuthConfig, 'identifier'>> & {\n identifier: Partial<IIdentifier> // TODO, we need to create partials for sub types in IIdentifier\n}\n\nexport type ConnectionConfig = OpenIdConfig | DidAuthConfig\nexport type NonPersistedConnectionConfig = NonPersistedDidAuthConfig | NonPersistedOpenIdConfig\nexport type PartialConnectionConfig = PartialOpenIdConfig | PartialDidAuthConfig\n\nexport type NaturalPerson = {\n id: string\n firstName: string\n lastName: string\n middleName?: string\n displayName: string\n metadata?: Array<MetadataItem<MetadataTypes>>\n ownerId?: string\n tenantId?: string\n createdAt: Date\n lastUpdatedAt: Date\n}\n\nexport type NonPersistedNaturalPerson = Omit<NaturalPerson, 'id' | 'createdAt' | 'lastUpdatedAt'>\n\nexport type PartialNaturalPerson = Partial<Omit<NaturalPerson, 'metadata'>> & {\n metadata?: PartialMetadataItem<MetadataTypes>\n}\n\nexport type Organization = {\n id: string\n legalName: string\n displayName: string\n metadata?: Array<MetadataItem<MetadataTypes>>\n ownerId?: string\n tenantId?: string\n createdAt: Date\n lastUpdatedAt: Date\n}\nexport type NonPersistedOrganization = Omit<Organization, 'id' | 'createdAt' | 'lastUpdatedAt'>\nexport type PartialOrganization = Partial<Omit<Organization, 'metadata'>> & {\n metadata?: PartialMetadataItem<MetadataTypes>\n}\n\nexport type Contact = NaturalPerson | Organization\nexport type NonPersistedContact = NonPersistedNaturalPerson | NonPersistedOrganization\nexport type PartialContact = PartialNaturalPerson | PartialOrganization\n\nexport type PartyType = {\n id: string\n type: PartyTypeType\n origin: PartyOrigin\n name: string\n tenantId: string\n description?: string\n createdAt: Date\n lastUpdatedAt: Date\n}\nexport type NonPersistedPartyType = Omit<PartyType, 'id' | 'createdAt' | 'lastUpdatedAt'> & {\n id?: string\n}\nexport type PartialPartyType = Partial<PartyType>\n\nexport type PartyRelationship = {\n id: string\n leftId: string\n rightId: string\n ownerId?: string\n tenantId?: string\n createdAt: Date\n lastUpdatedAt: Date\n}\nexport type NonPersistedPartyRelationship = Omit<PartyRelationship, 'id' | 'createdAt' | 'lastUpdatedAt'>\nexport type PartialPartyRelationship = Partial<PartyRelationship>\n\nexport type ElectronicAddress = {\n id: string\n type: ElectronicAddressType\n electronicAddress: string\n ownerId?: string\n tenantId?: string\n createdAt: Date\n lastUpdatedAt: Date\n}\nexport type NonPersistedElectronicAddress = Omit<ElectronicAddress, 'id' | 'createdAt' | 'lastUpdatedAt'>\nexport type PartialElectronicAddress = Partial<ElectronicAddress> & {\n partyId?: string\n}\n\nexport type PhysicalAddress = {\n id: string\n type: PhysicalAddressType\n streetName: string\n streetNumber: string\n postalCode: string\n cityName: string\n provinceName: string\n countryCode: string\n buildingName?: string\n ownerId?: string\n tenantId?: string\n createdAt: Date\n lastUpdatedAt: Date\n}\nexport type NonPersistedPhysicalAddress = Omit<PhysicalAddress, 'id' | 'createdAt' | 'lastUpdatedAt'>\nexport type PartialPhysicalAddress = Partial<PhysicalAddress> & {\n partyId?: string\n}\n\nexport type ElectronicAddressType = 'email' | 'phone'\n\nexport type PhysicalAddressType = 'home' | 'visit' | 'postal'\n\nexport enum ConnectionType {\n OPENID_CONNECT = 'OIDC',\n SIOPv2 = 'SIOPv2',\n SIOPv2_OpenID4VP = 'SIOPv2+OpenID4VP',\n}\n\nexport enum CorrelationIdentifierType {\n DID = 'did',\n URL = 'url',\n}\n\nexport enum PartyTypeType {\n NATURAL_PERSON = 'naturalPerson',\n ORGANIZATION = 'organization',\n}\n\nexport enum PartyOrigin {\n INTERNAL = 'INTERNAL',\n EXTERNAL = 'EXTERNAL',\n}\n\nexport enum IdentityOrigin {\n INTERNAL = 'INTERNAL',\n EXTERNAL = 'EXTERNAL',\n}\n","export enum DocumentType {\n VC = 'VC',\n VP = 'VP',\n P = 'P',\n C = 'C',\n}\n\nexport enum RegulationType {\n PID = 'PID',\n QEAA = 'QEAA',\n EAA = 'EAA',\n NON_REGULATED = 'NON_REGULATED',\n}\n\nexport enum CredentialDocumentFormat {\n JSON_LD = 'JSON_LD',\n JWT = 'JWT',\n SD_JWT = 'SD_JWT',\n MSO_MDOC = 'MSO_MDOC',\n}\n\nexport namespace CredentialDocumentFormat {\n export function fromSpecValue(credentialFormat: string) {\n const format = credentialFormat.toLowerCase()\n if (format.includes('sd')) {\n return CredentialDocumentFormat.SD_JWT\n } else if (format.includes('ldp')) {\n return CredentialDocumentFormat.JSON_LD\n } else if (format.includes('mso') || credentialFormat.includes('mdoc')) {\n return CredentialDocumentFormat.MSO_MDOC\n } else if (format.includes('jwt_')) {\n return CredentialDocumentFormat.JWT\n } else {\n throw Error(`Could not map format ${format} to known format`)\n }\n }\n\n export function toSpecValue(documentFormat: CredentialDocumentFormat, documentType: DocumentType) {\n switch (documentFormat) {\n case CredentialDocumentFormat.SD_JWT:\n return 'vc+sd-jwt'\n case CredentialDocumentFormat.MSO_MDOC:\n return 'mso_mdoc'\n case CredentialDocumentFormat.JSON_LD:\n return documentType === DocumentType.C || documentType === DocumentType.VC ? 'ldp_vc' : 'ldp_vp'\n case CredentialDocumentFormat.JWT:\n return documentType === DocumentType.C || documentType === DocumentType.VC ? 'jwt_vc_json' : 'jwt_vp_json'\n }\n }\n}\n\nexport enum CredentialCorrelationType {\n DID = 'DID',\n X509_SAN = 'X509_SAN',\n KID = 'KID',\n URL = 'URL',\n}\n\nexport enum CredentialRole {\n ISSUER = 'ISSUER',\n VERIFIER = 'VERIFIER',\n HOLDER = 'HOLDER',\n FEDERATION_TRUST_ANCHOR = 'FEDERATION_TRUST_ANCHOR',\n}\n\nexport enum CredentialStateType {\n REVOKED = 'REVOKED',\n VERIFIED = 'VERIFIED',\n EXPIRED = 'EXPIRED',\n}\n","import {\n BaseEntity,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n OneToOne,\n JoinColumn,\n ManyToOne,\n Column,\n OneToMany,\n BeforeInsert,\n BeforeUpdate,\n} from 'typeorm'\nimport { IsNotEmpty, validate, ValidationError } from 'class-validator'\nimport { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport { CorrelationIdentifierEntity } from './CorrelationIdentifierEntity'\nimport { ConnectionEntity } from './ConnectionEntity'\nimport { IdentityMetadataItemEntity } from './IdentityMetadataItemEntity'\nimport { CredentialRole, IdentityOrigin, ValidationConstraint } from '../../types'\nimport { PartyEntity } from './PartyEntity'\nimport { getConstraint } from '../../utils/ValidatorUtils'\n\n@Entity('Identity')\nexport class IdentityEntity extends BaseEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('varchar', {\n name: 'alias',\n length: 255,\n nullable: false,\n unique: true,\n })\n @IsNotEmpty({ message: 'Blank aliases are not allowed' })\n alias!: string\n\n @Column('simple-enum', { name: 'origin', enum: IdentityOrigin, nullable: false })\n origin!: IdentityOrigin\n\n @Column('text', { name: 'owner_id', nullable: true })\n ownerId?: string\n\n @Column('text', { name: 'tenant_id', nullable: true })\n tenantId?: string\n\n @Column('simple-array', { name: 'roles', nullable: false })\n roles!: Array<CredentialRole>\n\n @OneToOne(() => CorrelationIdentifierEntity, (identifier: CorrelationIdentifierEntity) => identifier.identity, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n identifier!: CorrelationIdentifierEntity\n\n @OneToOne(() => ConnectionEntity, (connection: ConnectionEntity) => connection.identity, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n })\n connection?: ConnectionEntity\n\n @OneToMany(() => IdentityMetadataItemEntity, (metadata: IdentityMetadataItemEntity) => metadata.identity, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n @JoinColumn({ name: 'metadata_id' }) // TODO check in db file\n metadata!: Array<IdentityMetadataItemEntity>\n\n @CreateDateColumn({ name: 'created_at', nullable: false, type: typeOrmDateTime() })\n createdAt!: Date\n\n @UpdateDateColumn({ name: 'last_updated_at', nullable: false, type: typeOrmDateTime() })\n lastUpdatedAt!: Date\n\n @ManyToOne(() => PartyEntity, (party: PartyEntity) => party.identities, {\n onDelete: 'CASCADE',\n })\n party!: PartyEntity\n\n @Column('text', { name: 'partyId', nullable: true })\n partyId?: string\n\n // By default, @UpdateDateColumn in TypeORM updates the timestamp only when the entity's top-level properties change.\n @BeforeInsert()\n @BeforeUpdate()\n updateUpdatedDate(): void {\n this.lastUpdatedAt = new Date()\n }\n\n @BeforeInsert()\n @BeforeUpdate()\n async validate(): Promise<void> {\n const validation: Array<ValidationError> = await validate(this)\n if (validation.length > 0) {\n const constraint: ValidationConstraint | undefined = getConstraint(validation[0])\n if (constraint) {\n const message: string = Object.values(constraint!)[0]\n return Promise.reject(Error(message))\n }\n }\n }\n}\n","import typeorm from 'typeorm'\nconst { Entity, Column, PrimaryGeneratedColumn, BaseEntity, OneToOne, JoinColumn, BeforeInsert, BeforeUpdate } = typeorm\nimport { CorrelationIdentifierType, ValidationConstraint } from '../../types'\nimport { IdentityEntity } from './IdentityEntity'\nimport { IsNotEmpty, validate, ValidationError } from 'class-validator'\nimport { getConstraint } from '../../utils/ValidatorUtils'\n\n@Entity('CorrelationIdentifier')\nexport class CorrelationIdentifierEntity extends BaseEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('simple-enum', { name: 'type', enum: CorrelationIdentifierType, nullable: false })\n type!: CorrelationIdentifierType\n\n @Column('text', { name: 'correlation_id', nullable: false, unique: true })\n @IsNotEmpty({ message: 'Blank correlation ids are not allowed' })\n correlationId!: string\n\n @Column('text', { name: 'owner_id', nullable: true })\n ownerId?: string\n\n @Column('text', { name: 'tenant_id', nullable: true })\n tenantId?: string\n\n @OneToOne(() => IdentityEntity, (identity: IdentityEntity) => identity.identifier, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'identity_id' })\n identity!: IdentityEntity\n\n @BeforeInsert()\n @BeforeUpdate()\n async validate(): Promise<void> {\n const validation: Array<ValidationError> = await validate(this)\n if (validation.length > 0) {\n const constraint: ValidationConstraint | undefined = getConstraint(validation[0])\n if (constraint) {\n const message: string = Object.values(constraint!)[0]\n return Promise.reject(Error(message))\n }\n }\n }\n}\n","import { ValidationError } from 'class-validator'\nimport { type ValidationConstraint } from '../types'\n\nexport const getConstraint = (validation: ValidationError): ValidationConstraint | undefined => {\n if (validation.children && validation.children.length > 0) {\n return getConstraint(validation.children[0])\n } else {\n return validation.constraints\n }\n}\n","import { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport { Entity, Column, PrimaryGeneratedColumn, BaseEntity, ManyToOne, BeforeInsert, BeforeUpdate } from 'typeorm'\nimport { IMetadataEntity, ValidationConstraint } from '../../types'\nimport { IdentityEntity } from './IdentityEntity'\nimport { IsNotEmpty, validate, ValidationError } from 'class-validator'\nimport { getConstraint } from '../../utils/ValidatorUtils'\n\n@Entity('IdentityMetadata')\nexport class IdentityMetadataItemEntity extends BaseEntity implements IMetadataEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('varchar', { name: 'label', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank metadata labels are not allowed' })\n label!: string\n\n @Column('varchar', { name: 'valueType', nullable: false })\n @IsNotEmpty({ message: 'valueType must not be empty' })\n valueType!: string\n\n @Column('varchar', { name: 'stringValue', length: 255, nullable: true })\n stringValue?: string\n\n @Column('numeric', { name: 'numberValue', nullable: true })\n numberValue?: number\n\n @Column({ name: 'dateValue', nullable: true, type: typeOrmDateTime() })\n dateValue?: Date\n\n @Column('boolean', { name: 'boolValue', nullable: true })\n boolValue?: boolean\n\n @ManyToOne(() => IdentityEntity, (identity: IdentityEntity) => identity.metadata, { cascade: ['insert', 'update'], onDelete: 'CASCADE' })\n identity!: IdentityEntity\n\n @BeforeInsert()\n @BeforeUpdate()\n async validate(): Promise<void> {\n const validation: Array<ValidationError> = await validate(this)\n if (validation.length > 0) {\n const constraint: ValidationConstraint | undefined = getConstraint(validation[0])\n if (constraint) {\n const message: string = Object.values(constraint!)[0]\n return Promise.reject(Error(message))\n }\n }\n }\n}\n","import {\n BaseEntity,\n BeforeInsert,\n BeforeUpdate,\n Column,\n CreateDateColumn,\n Entity,\n JoinColumn,\n ManyToOne,\n OneToMany,\n OneToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm'\nimport { ValidationConstraint } from '../../types'\nimport { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport { IdentityEntity } from './IdentityEntity'\nimport { validate, ValidationError } from 'class-validator'\nimport { PartyTypeEntity } from './PartyTypeEntity'\nimport { BaseContactEntity } from './BaseContactEntity'\nimport { PartyRelationshipEntity } from './PartyRelationshipEntity'\nimport { getConstraint } from '../../utils/ValidatorUtils'\nimport { ElectronicAddressEntity } from './ElectronicAddressEntity'\nimport { PhysicalAddressEntity } from './PhysicalAddressEntity'\n\n@Entity('Party')\nexport class PartyEntity extends BaseEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('varchar', { name: 'uri', length: 255, nullable: true })\n uri?: string\n\n @Column('text', { name: 'owner_id', nullable: true })\n ownerId?: string\n\n @Column('text', { name: 'tenant_id', nullable: true })\n tenantId?: string\n\n @OneToMany(() => IdentityEntity, (identity: IdentityEntity) => identity.party, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n @JoinColumn({ name: 'identity_id' })\n identities!: Array<IdentityEntity>\n\n @OneToMany(() => ElectronicAddressEntity, (electronicAddress: ElectronicAddressEntity) => electronicAddress.party, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n @JoinColumn({ name: 'electronic_address_id' })\n electronicAddresses!: Array<ElectronicAddressEntity>\n\n @OneToMany(() => PhysicalAddressEntity, (physicalAddress: PhysicalAddressEntity) => physicalAddress.party, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n @JoinColumn({ name: 'physical_address_id' })\n physicalAddresses!: Array<PhysicalAddressEntity>\n\n @ManyToOne(() => PartyTypeEntity, (contactType: PartyTypeEntity) => contactType.parties, {\n cascade: true,\n nullable: false,\n eager: true,\n })\n @JoinColumn({ name: 'party_type_id' })\n partyType!: PartyTypeEntity\n\n @OneToOne(() => BaseContactEntity, (contact: BaseContactEntity) => contact.party, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n contact!: BaseContactEntity\n\n @OneToMany(() => PartyRelationshipEntity, (relationship: PartyRelationshipEntity) => relationship.left, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n @JoinColumn({ name: 'relationship_id' })\n relationships!: Array<PartyRelationshipEntity>\n\n @CreateDateColumn({ name: 'created_at', nullable: false, type: typeOrmDateTime() })\n createdAt!: Date\n\n @UpdateDateColumn({ name: 'last_updated_at', nullable: false, type: typeOrmDateTime() })\n lastUpdatedAt!: Date\n\n // By default, @UpdateDateColumn in TypeORM updates the timestamp only when the entity's top-level properties change.\n @BeforeInsert()\n @BeforeUpdate()\n updateUpdatedDate(): void {\n this.lastUpdatedAt = new Date()\n }\n\n @BeforeInsert()\n @BeforeUpdate()\n async validate(): Promise<void> {\n const validation: Array<ValidationError> = await validate(this)\n if (validation.length > 0) {\n const constraint: ValidationConstraint | undefined = getConstraint(validation[0])\n if (constraint) {\n const message: string = Object.values(constraint!)[0]\n return Promise.reject(Error(message))\n }\n }\n }\n}\n","import { BeforeInsert, BeforeUpdate, Column, CreateDateColumn, Entity, Index, OneToMany, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'\nimport { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport { PartyEntity } from './PartyEntity'\nimport { PartyOrigin, PartyTypeType, ValidationConstraint } from '../../types'\nimport { IsNotEmpty, Validate, validate, ValidationError } from 'class-validator'\nimport { IsNonEmptyStringConstraint } from '../validators'\nimport { getConstraint } from '../../utils/ValidatorUtils'\n\n@Entity('PartyType')\n@Index('IDX_PartyType_type_tenant_id', ['type', 'tenantId'], { unique: true })\nexport class PartyTypeEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('simple-enum', { name: 'type', enum: PartyTypeType, nullable: false })\n type!: PartyTypeType\n\n @Column('simple-enum', { name: 'origin', enum: PartyOrigin, nullable: false, unique: false })\n origin!: PartyOrigin\n\n @Column('varchar', { name: 'name', length: 255, nullable: false, unique: true })\n @IsNotEmpty({ message: 'Blank names are not allowed' })\n name!: string\n\n @Column('varchar', { name: 'description', length: 255, nullable: true })\n @Validate(IsNonEmptyStringConstraint, { message: 'Blank descriptions are not allowed' })\n description?: string\n\n @Column({ name: 'tenant_id', type: 'varchar', length: 255, nullable: true })\n @IsNotEmpty({ message: \"Blank tenant id's are not allowed\" })\n tenantId!: string\n\n @OneToMany(() => PartyEntity, (party: PartyEntity) => party.partyType, {\n nullable: false,\n })\n parties!: Array<PartyEntity>\n\n @CreateDateColumn({ name: 'created_at', nullable: false, type: typeOrmDateTime() })\n createdAt!: Date\n\n @UpdateDateColumn({ name: 'last_updated_at', nullable: false, type: typeOrmDateTime() })\n lastUpdatedAt!: Date\n\n // By default, @UpdateDateColumn in TypeORM updates the timestamp only when the entity's top-level properties change.\n @BeforeInsert()\n @BeforeUpdate()\n updateUpdatedDate(): void {\n this.lastUpdatedAt = new Date()\n }\n\n @BeforeInsert()\n @BeforeUpdate()\n async validate(): Promise<void> {\n const validation: Array<ValidationError> = await validate(this)\n if (validation.length > 0) {\n const constraint: ValidationConstraint | undefined = getConstraint(validation[0])\n if (constraint) {\n const message: string = Object.values(constraint!)[0]\n return Promise.reject(Error(message))\n }\n }\n }\n}\n","import { type ValidationArguments, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator'\n\n@ValidatorConstraint({ name: 'isNonEmptyString', async: false })\nexport class IsNonEmptyStringConstraint implements ValidatorConstraintInterface {\n validate(value: string, args: ValidationArguments): boolean {\n return !isEmptyString(value)\n }\n\n defaultMessage(args: ValidationArguments): string {\n return `${args.property} must not be an empty string.`\n }\n}\n\nexport const isEmptyString = (value: any): boolean => {\n return typeof value === 'string' && value.trim().length === 0\n}\n","import typeorm from 'typeorm'\nconst {\n BaseEntity,\n BeforeInsert,\n BeforeUpdate,\n CreateDateColumn,\n Entity,\n JoinColumn,\n OneToMany,\n OneToOne,\n PrimaryGeneratedColumn,\n TableInheritance,\n UpdateDateColumn,\n} = typeorm\nimport { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport { PartyEntity } from './PartyEntity'\nimport { ContactMetadataItemEntity } from './ContactMetadataItemEntity'\n\n@Entity('BaseContact')\n@TableInheritance({ column: { type: 'varchar', name: 'type' } })\nexport abstract class BaseContactEntity extends BaseEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @CreateDateColumn({ name: 'created_at', nullable: false, type: typeOrmDateTime() })\n createdAt!: Date\n\n @UpdateDateColumn({ name: 'last_updated_at', nullable: false, type: typeOrmDateTime() })\n lastUpdatedAt!: Date\n\n @OneToOne(() => PartyEntity, (party: PartyEntity) => party.contact, {\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'party_id' })\n party!: PartyEntity\n\n @OneToMany(() => ContactMetadataItemEntity, (metadata: ContactMetadataItemEntity) => metadata.contact, {\n cascade: true,\n onDelete: 'CASCADE',\n eager: true,\n nullable: false,\n })\n @JoinColumn({ name: 'metadata_id' })\n metadata!: Array<ContactMetadataItemEntity>\n\n // By default, @UpdateDateColumn in TypeORM updates the timestamp only when the entity's top-level properties change.\n @BeforeInsert()\n @BeforeUpdate()\n updateUpdatedDate(): void {\n this.lastUpdatedAt = new Date()\n }\n}\n","import typeorm from 'typeorm'\nconst { Entity, Column, PrimaryGeneratedColumn, BaseEntity, ManyToOne, BeforeInsert, BeforeUpdate } = typeorm\nimport { IMetadataEntity, ValidationConstraint } from '../../types'\nimport { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport { BaseContactEntity } from './BaseContactEntity'\nimport { IsNotEmpty, validate, ValidationError } from 'class-validator'\nimport { getConstraint } from '../../utils/ValidatorUtils'\n\n@Entity('ContactMetadata')\nexport class ContactMetadataItemEntity extends BaseEntity implements IMetadataEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('varchar', { name: 'label', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank metadata labels are not allowed' })\n label!: string\n\n @Column('varchar', { name: 'valueType', nullable: false })\n @IsNotEmpty({ message: 'valueType must not be empty' })\n valueType!: string\n\n @Column('varchar', { name: 'stringValue', length: 255, nullable: true })\n stringValue?: string\n\n @Column('numeric', { name: 'numberValue', nullable: true })\n numberValue?: number\n\n @Column({ name: 'dateValue', nullable: true, type: typeOrmDateTime() })\n dateValue?: Date\n\n @Column('boolean', { name: 'boolValue', nullable: true })\n boolValue?: boolean\n\n @ManyToOne(() => BaseContactEntity, (contact: BaseContactEntity) => contact.metadata, {\n cascade: ['insert', 'update'],\n onDelete: 'CASCADE',\n })\n contact!: BaseContactEntity\n\n @BeforeInsert()\n @BeforeUpdate()\n async validate(): Promise<void> {\n const validation: Array<ValidationError> = await validate(this)\n if (validation.length > 0) {\n const constraint: ValidationConstraint | undefined = getConstraint(validation[0])\n if (constraint) {\n const message: string = Object.values(constraint!)[0]\n return Promise.reject(Error(message))\n }\n }\n }\n}\n","import {\n Entity,\n PrimaryGeneratedColumn,\n CreateDateColumn,\n UpdateDateColumn,\n ManyToOne,\n Column,\n Index,\n BeforeInsert,\n BeforeUpdate,\n JoinColumn,\n} from 'typeorm'\nimport { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport { PartyEntity } from './PartyEntity'\n\n@Entity('PartyRelationship')\n@Index('IDX_PartyRelationship_left_right', ['left', 'right'], { unique: true })\nexport class PartyRelationshipEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @ManyToOne(() => PartyEntity, {\n nullable: false,\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'left_id' })\n left!: PartyEntity\n\n @Column('text', { name: 'left_id', nullable: false })\n leftId!: string\n\n @ManyToOne(() => PartyEntity, {\n nullable: false,\n onDelete: 'CASCADE',\n })\n @JoinColumn({ name: 'right_id' })\n right!: PartyEntity\n\n @Column('text', { name: 'right_id', nullable: false })\n rightId!: string\n\n @Column('text', { name: 'owner_id', nullable: true })\n ownerId?: string\n\n @Column('text', { name: 'tenant_id', nullable: true })\n tenantId?: string\n\n @CreateDateColumn({ name: 'created_at', nullable: false, type: typeOrmDateTime() })\n createdAt!: Date\n\n @UpdateDateColumn({ name: 'last_updated_at', nullable: false, type: typeOrmDateTime() })\n lastUpdatedAt!: Date\n\n // By default, @UpdateDateColumn in TypeORM updates the timestamp only when the entity's top-level properties change.\n @BeforeInsert()\n @BeforeUpdate()\n updateUpdatedDate(): void {\n this.lastUpdatedAt = new Date()\n }\n\n @BeforeInsert()\n @BeforeUpdate()\n async checkRelationshipSides(): Promise<void> {\n if ((this.left?.id ?? this.leftId) === (this.right?.id ?? this.rightId)) {\n return Promise.reject(Error('Cannot use the same id for both sides of the relationship'))\n }\n }\n}\n","import { IsNotEmpty, validate, ValidationError } from 'class-validator'\nimport typeorm from 'typeorm'\nconst { Entity, Column, PrimaryGeneratedColumn, BaseEntity, ManyToOne, BeforeInsert, BeforeUpdate, CreateDateColumn, UpdateDateColumn } = typeorm\nimport { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport type { ElectronicAddressType, ValidationConstraint } from '../../types/index'\nimport { PartyEntity } from './PartyEntity'\nimport { getConstraint } from '../../utils/ValidatorUtils'\n\n@Entity('ElectronicAddress')\nexport class ElectronicAddressEntity extends BaseEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('varchar', { name: 'type', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank electronic address types are not allowed' })\n type!: ElectronicAddressType\n\n @Column('varchar', { name: 'electronic_address', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank electronic addresses are not allowed' })\n electronicAddress!: string\n\n @ManyToOne(() => PartyEntity, (party: PartyEntity) => party.electronicAddresses, {\n onDelete: 'CASCADE',\n })\n party!: PartyEntity\n\n @Column('text', { name: 'partyId', nullable: true })\n partyId?: string\n\n @Column('text', { name: 'owner_id', nullable: true })\n ownerId?: string\n\n @Column('text', { name: 'tenant_id', nullable: true })\n tenantId?: string\n\n @CreateDateColumn({ name: 'created_at', nullable: false, type: typeOrmDateTime() })\n createdAt!: Date\n\n @UpdateDateColumn({ name: 'last_updated_at', nullable: false, type: typeOrmDateTime() })\n lastUpdatedAt!: Date\n\n // By default, @UpdateDateColumn in TypeORM updates the timestamp only when the entity's top-level properties change.\n @BeforeInsert()\n @BeforeUpdate()\n updateUpdatedDate(): void {\n this.lastUpdatedAt = new Date()\n }\n\n @BeforeInsert()\n @BeforeUpdate()\n async validate(): Promise<void> {\n const validation: Array<ValidationError> = await validate(this)\n if (validation.length > 0) {\n const constraint: ValidationConstraint | undefined = getConstraint(validation[0])\n if (constraint) {\n const message: string = Object.values(constraint!)[0]\n return Promise.reject(Error(message))\n }\n }\n }\n}\n","import { IsNotEmpty, Validate, validate, ValidationError } from 'class-validator'\nimport {\n BaseEntity,\n BeforeInsert,\n BeforeUpdate,\n Column,\n CreateDateColumn,\n Entity,\n ManyToOne,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from 'typeorm'\nimport { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'\nimport { getConstraint } from '../../utils/ValidatorUtils'\nimport type { PhysicalAddressType, ValidationConstraint } from '../../types/index'\nimport { PartyEntity } from './PartyEntity'\nimport { IsNonEmptyStringConstraint } from '../validators'\n\n@Entity('PhysicalAddress')\nexport class PhysicalAddressEntity extends BaseEntity {\n @PrimaryGeneratedColumn('uuid')\n id!: string\n\n @Column('varchar', { name: 'type', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank physical address types are not allowed' })\n type!: PhysicalAddressType\n\n @Column('varchar', { name: 'street_name', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank street names are not allowed' })\n streetName!: string\n\n @Column('varchar', { name: 'street_number', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank street numbers are not allowed' })\n streetNumber!: string\n\n @Column('varchar', { name: 'postal_code', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank postal codes are not allowed' })\n postalCode!: string\n\n @Column('varchar', { name: 'city_name', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank city names are not allowed' })\n cityName!: string\n\n @Column('varchar', { name: 'province_name', length: 255, nullable: false })\n @IsNotEmpty({ message: 'Blank province names are not allowed' })\n provinceName!: string\n\n @Column('varchar', { name: 'country_code', length: 2, nullable: false })\n @IsNotEmpty({ message: 'Blank country codes are not allowed' })\n countryCode!: string\n\n @Column('varchar', { name: 'building_name', length: 255, nullable: true })\n @Validate(IsNonEmptyStringConstraint, { message: 'Blank building names are not allowed' })\n buildingName?: string\n\n @Column('text', { name: 'owner_id', nullable: true })\n ownerId?: string\n\n @Column('text', { name: 'tenant_id', nullable: true })\n tenantId?: string\n\n @ManyToOne(() => PartyEntity, (party: PartyEntity) => party.physicalAddresses, {\n onDelete: 'CASCADE',\n })\n party!: PartyEntity\n\n @Column('text', { name: 'partyId', nullable: true })\n partyId?: string\n\n @CreateDateColumn({ name: 'created_at', nullable: false, type: typeOrmDateTime() })\n createdAt!: Date\n\n @UpdateDateColumn({ name: '