@bsv/wallet-toolbox
Version:
BRC100 conforming wallet, wallet storage and wallet signer components
73 lines (67 loc) • 2.42 kB
text/typescript
import { ListCertificatesResult, OriginatorDomainNameStringUnder250Bytes } from '@bsv/sdk'
import { StorageProvider, TableCertificate } from '../index.client'
import { sdk } from '../../index.client'
export async function listCertificates(
storage: StorageProvider,
auth: sdk.AuthId,
vargs: sdk.ValidListCertificatesArgs,
originator?: OriginatorDomainNameStringUnder250Bytes
): Promise<ListCertificatesResult> {
const paged: sdk.Paged = { limit: vargs.limit, offset: vargs.offset }
const partial: Partial<TableCertificate> = {
userId: auth.userId,
isDeleted: false
}
if (vargs.partial) {
const vp = vargs.partial
if (vp.type) partial['type'] = vp.type
if (vp.subject) partial['subject'] = vp.subject
if (vp.serialNumber) partial['serialNumber'] = vp.serialNumber
if (vp.certifier) partial['certifier'] = vp.certifier
if (vp.revocationOutpoint) partial['revocationOutpoint'] = vp.revocationOutpoint
if (vp.signature) partial['signature'] = vp.signature
}
const r = await storage.transaction(async trx => {
const findCertsArgs: sdk.FindCertificatesArgs = {
partial,
certifiers: vargs.certifiers,
types: vargs.types,
paged,
trx
}
const certs = await storage.findCertificates(findCertsArgs)
const certsWithFields = await Promise.all(
certs.map(async cert => {
const fields = await storage.findCertificateFields({
partial: { certificateId: cert.certificateId, userId: auth.userId },
trx
})
return {
...cert,
fields: Object.fromEntries(fields.map(f => [f.fieldName, f.fieldValue])),
masterKeyring: Object.fromEntries(fields.map(f => [f.fieldName, f.masterKey]))
}
})
)
const r: ListCertificatesResult = {
totalCertificates: 0,
certificates: certsWithFields.map(cwf => ({
type: cwf.type,
subject: cwf.subject,
serialNumber: cwf.serialNumber,
certifier: cwf.certifier,
revocationOutpoint: cwf.revocationOutpoint,
signature: cwf.signature,
fields: cwf.fields,
verifier: cwf.verifier,
keyring: cwf.masterKeyring
}))
}
if (r.certificates.length < paged.limit) r.totalCertificates = r.certificates.length
else {
r.totalCertificates = await storage.countCertificates(findCertsArgs)
}
return r
})
return r
}