UNPKG

@sphereon/ssi-sdk.data-store

Version:

296 lines (268 loc) • 9.15 kB
import { ManagedIdentifierOptsOrResult } from '@sphereon/ssi-sdk-ext.identifier-resolution' import { IIdentifier } from '@veramo/core' import { IIssuerLocaleBranding } from '../issuanceBranding/issuanceBranding' import { CredentialRole } from '../digitalCredential/digitalCredential' export type MetadataTypes = string | number | Date | boolean | undefined export interface IMetadataEntity { // TODO move to types label: string stringValue?: string numberValue?: number dateValue?: Date boolValue?: boolean } export type Party = { id: string uri?: string roles: Array<CredentialRole> ownerId?: string tenantId?: string identities: Array<Identity> electronicAddresses: Array<ElectronicAddress> physicalAddresses: Array<PhysicalAddress> contact: Contact partyType: PartyType /** * 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. * * Currently, we are only defining the branding type within the SDK without implementing the associated logic. This is because: * 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). * 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. * 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. * * 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. */ branding?: IIssuerLocaleBranding relationships: Array<PartyRelationship> createdAt: Date lastUpdatedAt: Date } export type NonPersistedParty = Omit< Party, | 'id' | 'identities' | 'electronicAddresses' | 'physicalAddresses' | 'contact' | 'roles' | 'partyType' | 'relationships' | 'createdAt' | 'lastUpdatedAt' > & { identities?: Array<NonPersistedIdentity> electronicAddresses?: Array<NonPersistedElectronicAddress> physicalAddresses?: Array<NonPersistedPhysicalAddress> contact: NonPersistedContact partyType: NonPersistedPartyType relationships?: Array<NonPersistedPartyRelationship> } export type PartialParty = Partial< Omit<Party, 'identities' | 'electronicAddresses' | 'physicalAddresses' | 'contact' | 'partyType' | 'relationships'> > & { identities?: PartialIdentity electronicAddresses?: PartialElectronicAddress physicalAddresses?: PartialPhysicalAddress contact?: PartialContact partyType?: PartialPartyType relationships?: PartialPartyRelationship } export type Identity = { id: string alias: string ownerId?: string tenantId?: string origin: IdentityOrigin roles: Array<CredentialRole> identifier: CorrelationIdentifier connection?: Connection metadata?: Array<MetadataItem<MetadataTypes>> createdAt: Date lastUpdatedAt: Date } export type NonPersistedIdentity = Omit<Identity, 'id' | 'identifier' | 'connection' | 'metadata' | 'origin' | 'createdAt' | 'lastUpdatedAt'> & { origin: IdentityOrigin identifier: NonPersistedCorrelationIdentifier connection?: NonPersistedConnection metadata?: Array<NonPersistedMetadataItem<MetadataTypes>> } export type PartialIdentity = Partial<Omit<Identity, 'identifier' | 'connection' | 'metadata' | 'origin' | 'roles'>> & { identifier?: PartialCorrelationIdentifier connection?: PartialConnection metadata?: PartialMetadataItem<MetadataTypes> // Usage: FindIdentityArgs = Array<PartialIdentity> origin?: IdentityOrigin roles?: CredentialRole partyId?: string } export type MetadataItem<T extends MetadataTypes> = { id: string label: string value: T } export type NonPersistedMetadataItem<T extends MetadataTypes> = Omit<MetadataItem<T>, 'id'> export type PartialMetadataItem<T extends MetadataTypes> = Partial<MetadataItem<T>> export type CorrelationIdentifier = { id: string ownerId?: string tenantId?: string type: CorrelationIdentifierType correlationId: string } export type NonPersistedCorrelationIdentifier = Omit<CorrelationIdentifier, 'id'> export type PartialCorrelationIdentifier = Partial<CorrelationIdentifier> export type Connection = { id: string ownerId?: string tenantId?: string type: ConnectionType config: ConnectionConfig } export type NonPersistedConnection = Omit<Connection, 'id' | 'config'> & { config: NonPersistedConnectionConfig } export type PartialConnection = Partial<Omit<Connection, 'config'>> & { config: PartialConnectionConfig } export type OpenIdConfig = { id: string clientId: string clientSecret: string ownerId?: string tenantId?: string scopes: Array<string> issuer: string redirectUrl: string dangerouslyAllowInsecureHttpRequests: boolean clientAuthMethod: 'basic' | 'post' | undefined } export type NonPersistedOpenIdConfig = Omit<OpenIdConfig, 'id'> export type PartialOpenIdConfig = Partial<OpenIdConfig> export type DidAuthConfig = { id: string idOpts: ManagedIdentifierOptsOrResult stateId: string ownerId?: string tenantId?: string redirectUrl: string sessionId: string } export type NonPersistedDidAuthConfig = Omit<DidAuthConfig, 'id'> export type PartialDidAuthConfig = Partial<Omit<DidAuthConfig, 'identifier'>> & { identifier: Partial<IIdentifier> // TODO, we need to create partials for sub types in IIdentifier } export type ConnectionConfig = OpenIdConfig | DidAuthConfig export type NonPersistedConnectionConfig = NonPersistedDidAuthConfig | NonPersistedOpenIdConfig export type PartialConnectionConfig = PartialOpenIdConfig | PartialDidAuthConfig export type NaturalPerson = { id: string firstName: string lastName: string middleName?: string displayName: string metadata?: Array<MetadataItem<MetadataTypes>> ownerId?: string tenantId?: string createdAt: Date lastUpdatedAt: Date } export type NonPersistedNaturalPerson = Omit<NaturalPerson, 'id' | 'createdAt' | 'lastUpdatedAt'> export type PartialNaturalPerson = Partial<Omit<NaturalPerson, 'metadata'>> & { metadata?: PartialMetadataItem<MetadataTypes> } export type Organization = { id: string legalName: string displayName: string metadata?: Array<MetadataItem<MetadataTypes>> ownerId?: string tenantId?: string createdAt: Date lastUpdatedAt: Date } export type NonPersistedOrganization = Omit<Organization, 'id' | 'createdAt' | 'lastUpdatedAt'> export type PartialOrganization = Partial<Omit<Organization, 'metadata'>> & { metadata?: PartialMetadataItem<MetadataTypes> } export type Contact = NaturalPerson | Organization export type NonPersistedContact = NonPersistedNaturalPerson | NonPersistedOrganization export type PartialContact = PartialNaturalPerson | PartialOrganization export type PartyType = { id: string type: PartyTypeType origin: PartyOrigin name: string tenantId: string description?: string createdAt: Date lastUpdatedAt: Date } export type NonPersistedPartyType = Omit<PartyType, 'id' | 'createdAt' | 'lastUpdatedAt'> & { id?: string } export type PartialPartyType = Partial<PartyType> export type PartyRelationship = { id: string leftId: string rightId: string ownerId?: string tenantId?: string createdAt: Date lastUpdatedAt: Date } export type NonPersistedPartyRelationship = Omit<PartyRelationship, 'id' | 'createdAt' | 'lastUpdatedAt'> export type PartialPartyRelationship = Partial<PartyRelationship> export type ElectronicAddress = { id: string type: ElectronicAddressType electronicAddress: string ownerId?: string tenantId?: string createdAt: Date lastUpdatedAt: Date } export type NonPersistedElectronicAddress = Omit<ElectronicAddress, 'id' | 'createdAt' | 'lastUpdatedAt'> export type PartialElectronicAddress = Partial<ElectronicAddress> & { partyId?: string } export type PhysicalAddress = { id: string type: PhysicalAddressType streetName: string streetNumber: string postalCode: string cityName: string provinceName: string countryCode: string buildingName?: string ownerId?: string tenantId?: string createdAt: Date lastUpdatedAt: Date } export type NonPersistedPhysicalAddress = Omit<PhysicalAddress, 'id' | 'createdAt' | 'lastUpdatedAt'> export type PartialPhysicalAddress = Partial<PhysicalAddress> & { partyId?: string } export type ElectronicAddressType = 'email' | 'phone' export type PhysicalAddressType = 'home' | 'visit' | 'postal' export enum ConnectionType { OPENID_CONNECT = 'OIDC', SIOPv2 = 'SIOPv2', SIOPv2_OpenID4VP = 'SIOPv2+OpenID4VP', } export enum CorrelationIdentifierType { DID = 'did', URL = 'url', } export enum PartyTypeType { NATURAL_PERSON = 'naturalPerson', ORGANIZATION = 'organization', } export enum PartyOrigin { INTERNAL = 'INTERNAL', EXTERNAL = 'EXTERNAL', } export enum IdentityOrigin { INTERNAL = 'INTERNAL', EXTERNAL = 'EXTERNAL', }