Compare commits
7 Commits
f0181bbddb
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72740654da | ||
|
|
c921c4211a | ||
|
|
c7f98be0cb | ||
|
|
8990270e70 | ||
|
|
3f7cc0f854 | ||
|
|
923b703d97 | ||
|
|
27c4012431 |
6
.github/workflows/ci.yml
vendored
6
.github/workflows/ci.yml
vendored
@@ -60,9 +60,11 @@ jobs:
|
|||||||
--health-retries 5
|
--health-retries 5
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
|
# Hostname must match `services:` id. `localhost` breaks Gitea act_runner (Docker job);
|
||||||
|
# use the service name for Dockerized runners; VM runners may map host ports differently.
|
||||||
env:
|
env:
|
||||||
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test
|
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/test
|
||||||
TEST_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test
|
TEST_DATABASE_URL: postgresql://postgres:postgres@postgres:5432/test
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|||||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -48,6 +48,14 @@ lerna-debug.log*
|
|||||||
# TypeScript
|
# TypeScript
|
||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Compiler output must not live next to sources (packages use outDir: dist).
|
||||||
|
# Keep hand-written ambient defs, e.g. packages/auth/src/types/base58-universal.d.ts
|
||||||
|
packages/**/src/**/*.js
|
||||||
|
packages/**/src/**/*.js.map
|
||||||
|
packages/**/src/**/*.d.ts.map
|
||||||
|
packages/**/src/**/*.d.ts
|
||||||
|
!packages/auth/src/types/base58-universal.d.ts
|
||||||
|
|
||||||
# Terraform
|
# Terraform
|
||||||
*.tfstate
|
*.tfstate
|
||||||
*.tfstate.*
|
*.tfstate.*
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
. "$(dirname -- "$0")/_/husky.sh"
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
pnpm lint-staged
|
# When this repo lives under another tree (e.g. proxmox/the-order), hooks can run with a CWD
|
||||||
|
# that is not the monorepo root — pnpm then resolves Prettier from the wrong workspace.
|
||||||
|
ROOT="$(cd "$(dirname -- "$0")/.." && pwd)"
|
||||||
|
cd "$ROOT" || exit 1
|
||||||
|
exec pnpm lint-staged
|
||||||
|
|||||||
@@ -162,8 +162,13 @@ kubectl logs -f <pod-name> -n the-order-dev
|
|||||||
kubectl apply -f infra/k8s/base/portal-public/
|
kubectl apply -f infra/k8s/base/portal-public/
|
||||||
kubectl apply -f infra/k8s/base/portal-internal/
|
kubectl apply -f infra/k8s/base/portal-internal/
|
||||||
|
|
||||||
# Verify
|
# Verify (Kubernetes)
|
||||||
kubectl get pods -l app=portal-public -n the-order-dev
|
kubectl get pods -l app=portal-public -n the-order-dev
|
||||||
|
|
||||||
|
# Verify (Sankofa Proxmox — CT 10090 portal, CT 10210 HAProxy)
|
||||||
|
curl -fsS http://192.168.11.180:3000/api/health
|
||||||
|
curl -fsS -H 'Host: the-order.sankofa.nexus' http://192.168.11.39/api/health
|
||||||
|
curl -fsS https://the-order.sankofa.nexus/api/health
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -21,6 +21,81 @@ export interface LedgerEntry {
|
|||||||
reference?: string;
|
reference?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface BasketAllocation {
|
||||||
|
symbol: string;
|
||||||
|
targetWeightBps: number;
|
||||||
|
routeHint?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BasketMandate {
|
||||||
|
id: string;
|
||||||
|
clientId: string;
|
||||||
|
mandateName: string;
|
||||||
|
chain138VaultAddress: string;
|
||||||
|
baseAssetSymbol: string;
|
||||||
|
status: 'draft' | 'active' | 'rebalancing' | 'closed';
|
||||||
|
allocations: BasketAllocation[];
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BtcDeposit {
|
||||||
|
id: string;
|
||||||
|
clientId: string;
|
||||||
|
basketId: string;
|
||||||
|
chain138VaultAddress: string;
|
||||||
|
depositAddress: string;
|
||||||
|
expectedAmountSats?: number;
|
||||||
|
confirmationsRequired: number;
|
||||||
|
currentConfirmations: number;
|
||||||
|
status:
|
||||||
|
| 'instruction_created'
|
||||||
|
| 'pending_confirmations'
|
||||||
|
| 'confirmed'
|
||||||
|
| 'minted'
|
||||||
|
| 'frozen';
|
||||||
|
observedTxId?: string;
|
||||||
|
freezeReason?: string;
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Holding {
|
||||||
|
clientId: string;
|
||||||
|
basketId: string;
|
||||||
|
symbol: string;
|
||||||
|
allocationWeightBps: number;
|
||||||
|
bookValueSats: number;
|
||||||
|
status: 'pending_funding' | 'funded';
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Rebalance {
|
||||||
|
id: string;
|
||||||
|
clientId: string;
|
||||||
|
basketId: string;
|
||||||
|
sourceSymbol: string;
|
||||||
|
targetSymbols: string[];
|
||||||
|
reason: string;
|
||||||
|
status: 'planned' | 'queued' | 'executed' | 'failed';
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BridgeWithdrawal {
|
||||||
|
id: string;
|
||||||
|
clientId: string;
|
||||||
|
basketId: string;
|
||||||
|
sourceSymbol: string;
|
||||||
|
destinationSymbol: string;
|
||||||
|
destinationChainId: number;
|
||||||
|
destinationAddress: string;
|
||||||
|
amount: string;
|
||||||
|
status: 'pending' | 'approved' | 'submitted' | 'failed';
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
export class FinanceClient {
|
export class FinanceClient {
|
||||||
protected client: AxiosInstance;
|
protected client: AxiosInstance;
|
||||||
|
|
||||||
@@ -28,8 +103,8 @@ export class FinanceClient {
|
|||||||
const apiBaseURL =
|
const apiBaseURL =
|
||||||
baseURL ||
|
baseURL ||
|
||||||
(typeof window !== 'undefined'
|
(typeof window !== 'undefined'
|
||||||
? process.env.NEXT_PUBLIC_FINANCE_SERVICE_URL || 'http://localhost:4005'
|
? process.env.NEXT_PUBLIC_FINANCE_SERVICE_URL || 'http://localhost:4003'
|
||||||
: 'http://localhost:4005');
|
: 'http://localhost:4003');
|
||||||
|
|
||||||
this.client = axios.create({
|
this.client = axios.create({
|
||||||
baseURL: apiBaseURL,
|
baseURL: apiBaseURL,
|
||||||
@@ -38,7 +113,6 @@ export class FinanceClient {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set up request interceptor for authentication
|
|
||||||
this.client.interceptors.request.use(
|
this.client.interceptors.request.use(
|
||||||
(config) => {
|
(config) => {
|
||||||
const token = this.getAuthToken();
|
const token = this.getAuthToken();
|
||||||
@@ -47,7 +121,7 @@ export class FinanceClient {
|
|||||||
}
|
}
|
||||||
return config;
|
return config;
|
||||||
},
|
},
|
||||||
(error) => Promise.reject(error)
|
(error) => Promise.reject(error),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,8 +148,8 @@ export class FinanceClient {
|
|||||||
paymentMethod: string;
|
paymentMethod: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
}): Promise<Payment> {
|
}): Promise<Payment> {
|
||||||
const response = await this.client.post<Payment>('/api/v1/payments', data);
|
const response = await this.client.post<{ payment: Payment }>('/api/v1/payments', data);
|
||||||
return response.data;
|
return response.data.payment;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPayment(paymentId: string): Promise<Payment> {
|
async getPayment(paymentId: string): Promise<Payment> {
|
||||||
@@ -104,8 +178,71 @@ export class FinanceClient {
|
|||||||
}): Promise<{ entries: LedgerEntry[]; total: number }> {
|
}): Promise<{ entries: LedgerEntry[]; total: number }> {
|
||||||
const response = await this.client.get<{ entries: LedgerEntry[]; total: number }>(
|
const response = await this.client.get<{ entries: LedgerEntry[]; total: number }>(
|
||||||
'/api/v1/ledger',
|
'/api/v1/ledger',
|
||||||
{ params: filters }
|
{ params: filters },
|
||||||
);
|
);
|
||||||
return response.data;
|
return response.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async createBasket(data: {
|
||||||
|
clientId: string;
|
||||||
|
mandateName: string;
|
||||||
|
chain138VaultAddress: string;
|
||||||
|
allocations: BasketAllocation[];
|
||||||
|
baseAssetSymbol?: string;
|
||||||
|
}): Promise<BasketMandate> {
|
||||||
|
const response = await this.client.post<{ basket: BasketMandate }>('/api/v1/baskets', data);
|
||||||
|
return response.data.basket;
|
||||||
|
}
|
||||||
|
|
||||||
|
async createBtcDeposit(data: {
|
||||||
|
clientId: string;
|
||||||
|
basketId?: string;
|
||||||
|
mandateName?: string;
|
||||||
|
chain138VaultAddress: string;
|
||||||
|
allocations?: BasketAllocation[];
|
||||||
|
expectedAmountSats?: number;
|
||||||
|
clientReference?: string;
|
||||||
|
}): Promise<{ deposit: BtcDeposit; basket: BasketMandate; createdBasket: boolean }> {
|
||||||
|
const response = await this.client.post<{
|
||||||
|
deposit: BtcDeposit;
|
||||||
|
basket: BasketMandate;
|
||||||
|
createdBasket: boolean;
|
||||||
|
}>('/api/v1/btc-deposits', data);
|
||||||
|
return response.data;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getBtcDeposit(id: string): Promise<BtcDeposit> {
|
||||||
|
const response = await this.client.get<{ deposit: BtcDeposit }>(`/api/v1/btc-deposits/${id}`);
|
||||||
|
return response.data.deposit;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getHoldings(filters?: { clientId?: string; basketId?: string }): Promise<Holding[]> {
|
||||||
|
const response = await this.client.get<{ holdings: Holding[] }>('/api/v1/holdings', {
|
||||||
|
params: filters,
|
||||||
|
});
|
||||||
|
return response.data.holdings;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getRebalances(filters?: { clientId?: string; basketId?: string }): Promise<Rebalance[]> {
|
||||||
|
const response = await this.client.get<{ rebalances: Rebalance[] }>('/api/v1/rebalances', {
|
||||||
|
params: filters,
|
||||||
|
});
|
||||||
|
return response.data.rebalances;
|
||||||
|
}
|
||||||
|
|
||||||
|
async requestBridgeWithdrawal(data: {
|
||||||
|
clientId: string;
|
||||||
|
basketId: string;
|
||||||
|
sourceSymbol?: string;
|
||||||
|
destinationSymbol?: string;
|
||||||
|
destinationChainId: number;
|
||||||
|
destinationAddress: string;
|
||||||
|
amount: string;
|
||||||
|
}): Promise<BridgeWithdrawal> {
|
||||||
|
const response = await this.client.post<{ withdrawal: BridgeWithdrawal }>(
|
||||||
|
'/api/v1/withdrawals/bridge',
|
||||||
|
data,
|
||||||
|
);
|
||||||
|
return response.data.withdrawal;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,5 +14,14 @@ export type {
|
|||||||
} from './identity';
|
} from './identity';
|
||||||
export type { SubmitApplicationRequest, AdjudicateRequest } from './eresidency';
|
export type { SubmitApplicationRequest, AdjudicateRequest } from './eresidency';
|
||||||
export type { DocumentUpload, DocumentMetadata } from './intake';
|
export type { DocumentUpload, DocumentMetadata } from './intake';
|
||||||
export type { Payment, LedgerEntry } from './finance';
|
export type {
|
||||||
|
Payment,
|
||||||
|
LedgerEntry,
|
||||||
|
BasketAllocation,
|
||||||
|
BasketMandate,
|
||||||
|
BtcDeposit,
|
||||||
|
Holding,
|
||||||
|
Rebalance,
|
||||||
|
BridgeWithdrawal,
|
||||||
|
} from './finance';
|
||||||
export type { DealRoom, Document } from './dataroom';
|
export type { DealRoom, Document } from './dataroom';
|
||||||
|
|||||||
28
packages/auth/src/did.d.ts
vendored
28
packages/auth/src/did.d.ts
vendored
@@ -1,28 +0,0 @@
|
|||||||
/**
|
|
||||||
* DID (Decentralized Identifier) helpers
|
|
||||||
*/
|
|
||||||
export interface DIDDocument {
|
|
||||||
id: string;
|
|
||||||
'@context': string[];
|
|
||||||
verificationMethod: VerificationMethod[];
|
|
||||||
authentication: string[];
|
|
||||||
}
|
|
||||||
export interface VerificationMethod {
|
|
||||||
id: string;
|
|
||||||
type: string;
|
|
||||||
controller: string;
|
|
||||||
publicKeyMultibase?: string;
|
|
||||||
publicKeyJwk?: {
|
|
||||||
kty: string;
|
|
||||||
crv?: string;
|
|
||||||
x?: string;
|
|
||||||
y?: string;
|
|
||||||
n?: string;
|
|
||||||
e?: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
export declare class DIDResolver {
|
|
||||||
resolve(did: string): Promise<DIDDocument>;
|
|
||||||
verifySignature(did: string, message: string, signature: string): Promise<boolean>;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=did.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["did.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;IACzC,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAED,qBAAa,WAAW;IAChB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwC1C,eAAe,CACnB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC;CA4DpB"}
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
/**
|
|
||||||
* DID (Decentralized Identifier) helpers
|
|
||||||
*/
|
|
||||||
import fetch from 'node-fetch';
|
|
||||||
import { createVerify } from 'crypto';
|
|
||||||
export class DIDResolver {
|
|
||||||
async resolve(did) {
|
|
||||||
// Extract method and identifier from DID
|
|
||||||
const didParts = did.split(':');
|
|
||||||
if (didParts.length < 3) {
|
|
||||||
throw new Error(`Invalid DID format: ${did}`);
|
|
||||||
}
|
|
||||||
const method = didParts[1];
|
|
||||||
const identifier = didParts.slice(2).join(':');
|
|
||||||
// Resolve based on DID method
|
|
||||||
if (method === 'web') {
|
|
||||||
// did:web resolution
|
|
||||||
const url = `https://${identifier}/.well-known/did.json`;
|
|
||||||
const response = await fetch(url);
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`Failed to resolve DID: ${response.status}`);
|
|
||||||
}
|
|
||||||
return (await response.json());
|
|
||||||
}
|
|
||||||
else if (method === 'key') {
|
|
||||||
// did:key resolution - generate document from key
|
|
||||||
const publicKeyMultibase = identifier;
|
|
||||||
return {
|
|
||||||
id: did,
|
|
||||||
'@context': ['https://www.w3.org/ns/did/v1'],
|
|
||||||
verificationMethod: [
|
|
||||||
{
|
|
||||||
id: `${did}#keys-1`,
|
|
||||||
type: 'Ed25519VerificationKey2020',
|
|
||||||
controller: did,
|
|
||||||
publicKeyMultibase,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
authentication: [`${did}#keys-1`],
|
|
||||||
};
|
|
||||||
}
|
|
||||||
throw new Error(`Unsupported DID method: ${method}`);
|
|
||||||
}
|
|
||||||
async verifySignature(did, message, signature) {
|
|
||||||
try {
|
|
||||||
const document = await this.resolve(did);
|
|
||||||
const verificationMethod = document.verificationMethod[0];
|
|
||||||
if (!verificationMethod) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const verify = createVerify('SHA256');
|
|
||||||
verify.update(message);
|
|
||||||
verify.end();
|
|
||||||
// Handle different key formats
|
|
||||||
if (verificationMethod.publicKeyMultibase) {
|
|
||||||
// Multibase-encoded public key (e.g., Ed25519)
|
|
||||||
// Decode multibase format (simplified - in production use proper multibase library)
|
|
||||||
const multibaseKey = verificationMethod.publicKeyMultibase;
|
|
||||||
if (multibaseKey.startsWith('z')) {
|
|
||||||
// Base58btc encoding - decode first byte (0xed for Ed25519)
|
|
||||||
// For Ed25519, the key is 32 bytes after the prefix
|
|
||||||
try {
|
|
||||||
// In production, use proper multibase/base58 decoding
|
|
||||||
// This is a simplified implementation
|
|
||||||
const keyBuffer = Buffer.from(multibaseKey.slice(1), 'base64');
|
|
||||||
return verify.verify(keyBuffer, Buffer.from(signature, 'base64'));
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
// Fallback: try direct verification if key is already in correct format
|
|
||||||
return verify.verify(verificationMethod.publicKeyMultibase, Buffer.from(signature, 'base64'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Handle JWK format
|
|
||||||
if (verificationMethod.publicKeyJwk) {
|
|
||||||
const jwk = verificationMethod.publicKeyJwk;
|
|
||||||
if (jwk.kty === 'EC' && jwk.crv === 'secp256k1' && jwk.x && jwk.y) {
|
|
||||||
// ECDSA with secp256k1
|
|
||||||
// In production, use proper JWK to PEM conversion
|
|
||||||
// This requires additional crypto libraries
|
|
||||||
verify.update(message);
|
|
||||||
// For now, delegate to external verification service
|
|
||||||
return false; // Requires proper EC key handling
|
|
||||||
}
|
|
||||||
if (jwk.kty === 'RSA' && jwk.n && jwk.e) {
|
|
||||||
// RSA keys
|
|
||||||
// In production, convert JWK to PEM format and verify
|
|
||||||
// This requires additional crypto libraries
|
|
||||||
return false; // Requires proper RSA key handling
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
// Log error in production
|
|
||||||
console.error('DID signature verification failed:', error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=did.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"did.js","sourceRoot":"","sources":["did.ts"],"names":[],"mappings":"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"}
|
|
||||||
@@ -1,16 +1,18 @@
|
|||||||
/**
|
/**
|
||||||
* DID (Decentralized Identifier) helpers
|
* DID (Decentralized Identifier) helpers
|
||||||
* Enhanced implementation with proper crypto operations
|
* Set DID_RESOLVER_URL for custom resolver; VC_ISSUER_DID in env for issuer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import fetch from 'node-fetch';
|
import fetch from 'node-fetch';
|
||||||
import { createVerify, createPublicKey } from 'crypto';
|
import { createVerify, createPublicKey } from 'crypto';
|
||||||
import { decode as multibaseDecode } from 'multibase';
|
import { decode as multibaseDecode } from 'multibase';
|
||||||
import base58 from 'base58-universal';
|
|
||||||
import { importJWK } from 'jose';
|
import { importJWK } from 'jose';
|
||||||
import forge from 'node-forge';
|
import forge from 'node-forge';
|
||||||
import { verify as ed25519Verify } from '@noble/ed25519';
|
import { verify as ed25519Verify } from '@noble/ed25519';
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
||||||
|
const { decode: base58Decode }: { decode: (value: string) => Uint8Array } = require('base58-universal');
|
||||||
|
|
||||||
export interface DIDDocument {
|
export interface DIDDocument {
|
||||||
id: string;
|
id: string;
|
||||||
'@context': string[];
|
'@context': string[];
|
||||||
@@ -89,7 +91,7 @@ export class DIDResolver {
|
|||||||
if (multibaseKey.startsWith('z')) {
|
if (multibaseKey.startsWith('z')) {
|
||||||
try {
|
try {
|
||||||
const base58Encoded = multibaseKey.slice(1);
|
const base58Encoded = multibaseKey.slice(1);
|
||||||
const decoded = base58.decode(base58Encoded);
|
const decoded = base58Decode(base58Encoded);
|
||||||
return Buffer.from(decoded);
|
return Buffer.from(decoded);
|
||||||
} catch {
|
} catch {
|
||||||
throw new Error('Failed to decode multibase key');
|
throw new Error('Failed to decode multibase key');
|
||||||
@@ -296,4 +298,3 @@ export class DIDResolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
19
packages/auth/src/eidas.d.ts
vendored
19
packages/auth/src/eidas.d.ts
vendored
@@ -1,19 +0,0 @@
|
|||||||
/**
|
|
||||||
* eIDAS (electronic IDentification, Authentication and trust Services) helpers
|
|
||||||
*/
|
|
||||||
export interface EIDASConfig {
|
|
||||||
providerUrl: string;
|
|
||||||
apiKey: string;
|
|
||||||
}
|
|
||||||
export interface EIDASSignature {
|
|
||||||
signature: string;
|
|
||||||
certificate: string;
|
|
||||||
timestamp: Date;
|
|
||||||
}
|
|
||||||
export declare class EIDASProvider {
|
|
||||||
private config;
|
|
||||||
constructor(config: EIDASConfig);
|
|
||||||
requestSignature(document: string): Promise<EIDASSignature>;
|
|
||||||
verifySignature(signature: EIDASSignature): Promise<boolean>;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=eidas.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"eidas.d.ts","sourceRoot":"","sources":["eidas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEjC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA4B3D,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;CAgEnE"}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
/**
|
|
||||||
* eIDAS (electronic IDentification, Authentication and trust Services) helpers
|
|
||||||
*/
|
|
||||||
import fetch from 'node-fetch';
|
|
||||||
export class EIDASProvider {
|
|
||||||
config;
|
|
||||||
constructor(config) {
|
|
||||||
this.config = config;
|
|
||||||
}
|
|
||||||
async requestSignature(document) {
|
|
||||||
const response = await fetch(`${this.config.providerUrl}/sign`, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
Authorization: `Bearer ${this.config.apiKey}`,
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ document }),
|
|
||||||
});
|
|
||||||
if (!response.ok) {
|
|
||||||
const errorText = await response.text();
|
|
||||||
throw new Error(`eIDAS signature request failed: ${response.status} ${errorText}`);
|
|
||||||
}
|
|
||||||
const data = (await response.json());
|
|
||||||
return {
|
|
||||||
signature: data.signature,
|
|
||||||
certificate: data.certificate,
|
|
||||||
timestamp: new Date(data.timestamp),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
async verifySignature(signature) {
|
|
||||||
try {
|
|
||||||
// First, verify with the eIDAS provider (they handle certificate chain validation)
|
|
||||||
const response = await fetch(`${this.config.providerUrl}/verify`, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
Authorization: `Bearer ${this.config.apiKey}`,
|
|
||||||
},
|
|
||||||
body: JSON.stringify({
|
|
||||||
signature: signature.signature,
|
|
||||||
certificate: signature.certificate,
|
|
||||||
timestamp: signature.timestamp.toISOString(),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
if (!response.ok) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const result = (await response.json());
|
|
||||||
if (!result.valid) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Additional validation: Check certificate validity period
|
|
||||||
if (result.validityPeriod) {
|
|
||||||
const now = new Date();
|
|
||||||
const notBefore = new Date(result.validityPeriod.notBefore);
|
|
||||||
const notAfter = new Date(result.validityPeriod.notAfter);
|
|
||||||
if (now < notBefore || now > notAfter) {
|
|
||||||
return false; // Certificate expired or not yet valid
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Additional validation: Verify certificate chain if provided
|
|
||||||
if (result.certificateChain && result.certificateChain.length > 0) {
|
|
||||||
// In production, validate the full certificate chain
|
|
||||||
// This includes checking:
|
|
||||||
// 1. Each certificate in the chain is valid
|
|
||||||
// 2. Each certificate is signed by the next in the chain
|
|
||||||
// 3. The root certificate is trusted
|
|
||||||
// 4. No certificates are revoked
|
|
||||||
// For now, we trust the eIDAS provider's validation
|
|
||||||
// In a production environment, you might want to do additional
|
|
||||||
// client-side validation of the certificate chain
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
// Log error in production
|
|
||||||
console.error('eIDAS signature verification failed:', error);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=eidas.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"eidas.js","sourceRoot":"","sources":["eidas.ts"],"names":[],"mappings":"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"}
|
|
||||||
@@ -122,6 +122,9 @@ export async function prepareCredentialImage(
|
|||||||
if (imageData.startsWith('data:')) {
|
if (imageData.startsWith('data:')) {
|
||||||
// Extract base64 data
|
// Extract base64 data
|
||||||
const base64Data = imageData.split(',')[1];
|
const base64Data = imageData.split(',')[1];
|
||||||
|
if (!base64Data) {
|
||||||
|
throw new Error('Invalid image data URL: missing base64 payload');
|
||||||
|
}
|
||||||
imageBuffer = Buffer.from(base64Data, 'base64');
|
imageBuffer = Buffer.from(base64Data, 'base64');
|
||||||
} else {
|
} else {
|
||||||
imageBuffer = Buffer.from(imageData);
|
imageBuffer = Buffer.from(imageData);
|
||||||
@@ -180,4 +183,3 @@ export function getRecommendedImageSpecs(): {
|
|||||||
maxSizeKB: 100, // Max 100KB recommended
|
maxSizeKB: 100, // Max 100KB recommended
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
7
packages/auth/src/index.d.ts
vendored
7
packages/auth/src/index.d.ts
vendored
@@ -1,7 +0,0 @@
|
|||||||
/**
|
|
||||||
* The Order Auth Package
|
|
||||||
*/
|
|
||||||
export * from './oidc';
|
|
||||||
export * from './did';
|
|
||||||
export * from './eidas';
|
|
||||||
//# sourceMappingURL=index.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC"}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
/**
|
|
||||||
* The Order Auth Package
|
|
||||||
*/
|
|
||||||
export * from './oidc';
|
|
||||||
export * from './did';
|
|
||||||
export * from './eidas';
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,SAAS,CAAC"}
|
|
||||||
23
packages/auth/src/oidc.d.ts
vendored
23
packages/auth/src/oidc.d.ts
vendored
@@ -1,23 +0,0 @@
|
|||||||
/**
|
|
||||||
* OIDC/OAuth2 helpers
|
|
||||||
*/
|
|
||||||
export interface OIDCConfig {
|
|
||||||
issuer: string;
|
|
||||||
clientId: string;
|
|
||||||
clientSecret: string;
|
|
||||||
redirectUri: string;
|
|
||||||
}
|
|
||||||
export interface TokenResponse {
|
|
||||||
access_token: string;
|
|
||||||
token_type: string;
|
|
||||||
expires_in?: number;
|
|
||||||
refresh_token?: string;
|
|
||||||
id_token?: string;
|
|
||||||
}
|
|
||||||
export declare class OIDCProvider {
|
|
||||||
private config;
|
|
||||||
constructor(config: OIDCConfig);
|
|
||||||
getAuthorizationUrl(state: string): string;
|
|
||||||
exchangeCodeForToken(code: string): Promise<string>;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=oidc.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"oidc.d.ts","sourceRoot":"","sources":["oidc.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,UAAU;IAEtC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAWpC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA2B1D"}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* OIDC/OAuth2 helpers
|
|
||||||
*/
|
|
||||||
import fetch from 'node-fetch';
|
|
||||||
export class OIDCProvider {
|
|
||||||
config;
|
|
||||||
constructor(config) {
|
|
||||||
this.config = config;
|
|
||||||
}
|
|
||||||
getAuthorizationUrl(state) {
|
|
||||||
const params = new URLSearchParams({
|
|
||||||
client_id: this.config.clientId,
|
|
||||||
redirect_uri: this.config.redirectUri,
|
|
||||||
response_type: 'code',
|
|
||||||
scope: 'openid profile email',
|
|
||||||
state,
|
|
||||||
});
|
|
||||||
return `${this.config.issuer}/authorize?${params.toString()}`;
|
|
||||||
}
|
|
||||||
async exchangeCodeForToken(code) {
|
|
||||||
const tokenEndpoint = `${this.config.issuer}/token`;
|
|
||||||
const params = new URLSearchParams({
|
|
||||||
grant_type: 'authorization_code',
|
|
||||||
code,
|
|
||||||
redirect_uri: this.config.redirectUri,
|
|
||||||
client_id: this.config.clientId,
|
|
||||||
client_secret: this.config.clientSecret,
|
|
||||||
});
|
|
||||||
const response = await fetch(tokenEndpoint, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/x-www-form-urlencoded',
|
|
||||||
},
|
|
||||||
body: params.toString(),
|
|
||||||
});
|
|
||||||
if (!response.ok) {
|
|
||||||
const errorText = await response.text();
|
|
||||||
throw new Error(`Token exchange failed: ${response.status} ${errorText}`);
|
|
||||||
}
|
|
||||||
const tokenData = (await response.json());
|
|
||||||
return tokenData.access_token;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=oidc.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"oidc.js","sourceRoot":"","sources":["oidc.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,YAAY,CAAC;AAiB/B,MAAM,OAAO,YAAY;IACH;IAApB,YAAoB,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAE1C,mBAAmB,CAAC,KAAa;QAC/B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACrC,aAAa,EAAE,MAAM;YACrB,KAAK,EAAE,sBAAsB;YAC7B,KAAK;SACN,CAAC,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAY;QACrC,MAAM,aAAa,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,QAAQ,CAAC;QAEpD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,UAAU,EAAE,oBAAoB;YAChC,IAAI;YACJ,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACrC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SACxC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,mCAAmC;aACpD;YACD,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAC;QAC3D,OAAO,SAAS,CAAC,YAAY,CAAC;IAChC,CAAC;CACF"}
|
|
||||||
5
packages/cache/src/index.d.ts
vendored
5
packages/cache/src/index.d.ts
vendored
@@ -1,5 +0,0 @@
|
|||||||
/**
|
|
||||||
* Cache package for The Order
|
|
||||||
*/
|
|
||||||
export * from './redis';
|
|
||||||
//# sourceMappingURL=index.d.ts.map
|
|
||||||
1
packages/cache/src/index.d.ts.map
vendored
1
packages/cache/src/index.d.ts.map
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC"}
|
|
||||||
5
packages/cache/src/index.js
vendored
5
packages/cache/src/index.js
vendored
@@ -1,5 +0,0 @@
|
|||||||
/**
|
|
||||||
* Cache package for The Order
|
|
||||||
*/
|
|
||||||
export * from './redis';
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
packages/cache/src/index.js.map
vendored
1
packages/cache/src/index.js.map
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC"}
|
|
||||||
80
packages/cache/src/redis.d.ts
vendored
80
packages/cache/src/redis.d.ts
vendored
@@ -1,80 +0,0 @@
|
|||||||
/**
|
|
||||||
* Redis caching layer for The Order
|
|
||||||
* Implements caching for database queries, cache invalidation, and cache monitoring
|
|
||||||
*/
|
|
||||||
export interface CacheConfig {
|
|
||||||
url?: string;
|
|
||||||
ttl?: number;
|
|
||||||
keyPrefix?: string;
|
|
||||||
enableCompression?: boolean;
|
|
||||||
}
|
|
||||||
export interface CacheStats {
|
|
||||||
hits: number;
|
|
||||||
misses: number;
|
|
||||||
sets: number;
|
|
||||||
deletes: number;
|
|
||||||
errors: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Redis Cache Client
|
|
||||||
*/
|
|
||||||
export declare class CacheClient {
|
|
||||||
private client;
|
|
||||||
private config;
|
|
||||||
private stats;
|
|
||||||
constructor(config?: CacheConfig);
|
|
||||||
/**
|
|
||||||
* Initialize Redis client
|
|
||||||
*/
|
|
||||||
connect(): Promise<void>;
|
|
||||||
/**
|
|
||||||
* Disconnect Redis client
|
|
||||||
*/
|
|
||||||
disconnect(): Promise<void>;
|
|
||||||
/**
|
|
||||||
* Get value from cache
|
|
||||||
*/
|
|
||||||
get<T>(key: string): Promise<T | null>;
|
|
||||||
/**
|
|
||||||
* Set value in cache
|
|
||||||
*/
|
|
||||||
set(key: string, value: unknown, ttl?: number): Promise<void>;
|
|
||||||
/**
|
|
||||||
* Delete value from cache
|
|
||||||
*/
|
|
||||||
delete(key: string): Promise<void>;
|
|
||||||
/**
|
|
||||||
* Delete multiple keys by pattern
|
|
||||||
*/
|
|
||||||
invalidate(pattern: string): Promise<number>;
|
|
||||||
/**
|
|
||||||
* Check if key exists
|
|
||||||
*/
|
|
||||||
exists(key: string): Promise<boolean>;
|
|
||||||
/**
|
|
||||||
* Get cache statistics
|
|
||||||
*/
|
|
||||||
getStats(): CacheStats;
|
|
||||||
/**
|
|
||||||
* Reset cache statistics
|
|
||||||
*/
|
|
||||||
resetStats(): void;
|
|
||||||
/**
|
|
||||||
* Get full key with prefix
|
|
||||||
*/
|
|
||||||
private getFullKey;
|
|
||||||
/**
|
|
||||||
* Serialize value
|
|
||||||
*/
|
|
||||||
private serialize;
|
|
||||||
/**
|
|
||||||
* Deserialize value
|
|
||||||
*/
|
|
||||||
private deserialize;
|
|
||||||
}
|
|
||||||
export declare function getCacheClient(config?: CacheConfig): CacheClient;
|
|
||||||
/**
|
|
||||||
* Cache decorator for functions
|
|
||||||
*/
|
|
||||||
export declare function cached<T extends (...args: unknown[]) => Promise<unknown>>(fn: T, keyGenerator?: (...args: Parameters<T>) => string, ttl?: number): T;
|
|
||||||
//# sourceMappingURL=redis.d.ts.map
|
|
||||||
1
packages/cache/src/redis.d.ts.map
vendored
1
packages/cache/src/redis.d.ts.map
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["redis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,KAAK,CAMX;gBAEU,MAAM,GAAE,WAAgB;IAUpC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAwB5C;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBnE;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxC;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BlD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB3C;;OAEG;IACH,QAAQ,IAAI,UAAU;IAItB;;OAEG;IACH,UAAU,IAAI,IAAI;IAUlB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,WAAW;CAGpB;AAOD,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,CAKhE;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,EACvE,EAAE,EAAE,CAAC,EACL,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,EACjD,GAAG,CAAC,EAAE,MAAM,GACX,CAAC,CAeH"}
|
|
||||||
247
packages/cache/src/redis.js
vendored
247
packages/cache/src/redis.js
vendored
@@ -1,247 +0,0 @@
|
|||||||
/**
|
|
||||||
* Redis caching layer for The Order
|
|
||||||
* Implements caching for database queries, cache invalidation, and cache monitoring
|
|
||||||
*/
|
|
||||||
import { createClient } from 'redis';
|
|
||||||
import { getEnv, createLogger } from '@the-order/shared';
|
|
||||||
const logger = createLogger('cache');
|
|
||||||
/**
|
|
||||||
* Redis Cache Client
|
|
||||||
*/
|
|
||||||
export class CacheClient {
|
|
||||||
client = null;
|
|
||||||
config;
|
|
||||||
stats = {
|
|
||||||
hits: 0,
|
|
||||||
misses: 0,
|
|
||||||
sets: 0,
|
|
||||||
deletes: 0,
|
|
||||||
errors: 0,
|
|
||||||
};
|
|
||||||
constructor(config = {}) {
|
|
||||||
const env = getEnv();
|
|
||||||
this.config = {
|
|
||||||
url: config.url || env.REDIS_URL || 'redis://localhost:6379',
|
|
||||||
ttl: config.ttl || 3600, // 1 hour default
|
|
||||||
keyPrefix: config.keyPrefix || 'the-order:',
|
|
||||||
enableCompression: config.enableCompression || false,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Initialize Redis client
|
|
||||||
*/
|
|
||||||
async connect() {
|
|
||||||
if (this.client) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
this.client = createClient({
|
|
||||||
url: this.config.url,
|
|
||||||
});
|
|
||||||
this.client.on('error', (err) => {
|
|
||||||
logger.error('Redis client error:', err);
|
|
||||||
this.stats.errors++;
|
|
||||||
});
|
|
||||||
this.client.on('connect', () => {
|
|
||||||
logger.info('Redis client connected');
|
|
||||||
});
|
|
||||||
this.client.on('disconnect', () => {
|
|
||||||
logger.warn('Redis client disconnected');
|
|
||||||
});
|
|
||||||
await this.client.connect();
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
logger.error('Failed to connect to Redis:', error);
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Disconnect Redis client
|
|
||||||
*/
|
|
||||||
async disconnect() {
|
|
||||||
if (this.client) {
|
|
||||||
await this.client.quit();
|
|
||||||
this.client = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get value from cache
|
|
||||||
*/
|
|
||||||
async get(key) {
|
|
||||||
if (!this.client) {
|
|
||||||
await this.connect();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const fullKey = this.getFullKey(key);
|
|
||||||
const value = await this.client.get(fullKey);
|
|
||||||
if (value === null) {
|
|
||||||
this.stats.misses++;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
this.stats.hits++;
|
|
||||||
return this.deserialize(value);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
logger.error(`Cache get error for key ${key}:`, error);
|
|
||||||
this.stats.errors++;
|
|
||||||
this.stats.misses++;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Set value in cache
|
|
||||||
*/
|
|
||||||
async set(key, value, ttl) {
|
|
||||||
if (!this.client) {
|
|
||||||
await this.connect();
|
|
||||||
}
|
|
||||||
if (!this.client) {
|
|
||||||
this.stats.errors++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const fullKey = this.getFullKey(key);
|
|
||||||
const serialized = this.serialize(value);
|
|
||||||
const expiresIn = ttl || this.config.ttl;
|
|
||||||
await this.client.setEx(fullKey, expiresIn, serialized);
|
|
||||||
this.stats.sets++;
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
logger.error(`Cache set error for key ${key}:`, error);
|
|
||||||
this.stats.errors++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Delete value from cache
|
|
||||||
*/
|
|
||||||
async delete(key) {
|
|
||||||
if (!this.client) {
|
|
||||||
await this.connect();
|
|
||||||
}
|
|
||||||
if (!this.client) {
|
|
||||||
this.stats.errors++;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const fullKey = this.getFullKey(key);
|
|
||||||
await this.client.del(fullKey);
|
|
||||||
this.stats.deletes++;
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
logger.error(`Cache delete error for key ${key}:`, error);
|
|
||||||
this.stats.errors++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Delete multiple keys by pattern
|
|
||||||
*/
|
|
||||||
async invalidate(pattern) {
|
|
||||||
if (!this.client) {
|
|
||||||
await this.connect();
|
|
||||||
}
|
|
||||||
if (!this.client) {
|
|
||||||
this.stats.errors++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const fullPattern = this.getFullKey(pattern);
|
|
||||||
const keys = await this.client.keys(fullPattern);
|
|
||||||
if (keys.length === 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
const deleted = await this.client.del(keys);
|
|
||||||
this.stats.deletes += deleted;
|
|
||||||
return deleted;
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
logger.error(`Cache invalidate error for pattern ${pattern}:`, error);
|
|
||||||
this.stats.errors++;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Check if key exists
|
|
||||||
*/
|
|
||||||
async exists(key) {
|
|
||||||
if (!this.client) {
|
|
||||||
await this.connect();
|
|
||||||
}
|
|
||||||
if (!this.client) {
|
|
||||||
this.stats.errors++;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const fullKey = this.getFullKey(key);
|
|
||||||
const result = await this.client.exists(fullKey);
|
|
||||||
return result === 1;
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
logger.error(`Cache exists error for key ${key}:`, error);
|
|
||||||
this.stats.errors++;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get cache statistics
|
|
||||||
*/
|
|
||||||
getStats() {
|
|
||||||
return { ...this.stats };
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Reset cache statistics
|
|
||||||
*/
|
|
||||||
resetStats() {
|
|
||||||
this.stats = {
|
|
||||||
hits: 0,
|
|
||||||
misses: 0,
|
|
||||||
sets: 0,
|
|
||||||
deletes: 0,
|
|
||||||
errors: 0,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get full key with prefix
|
|
||||||
*/
|
|
||||||
getFullKey(key) {
|
|
||||||
return `${this.config.keyPrefix}${key}`;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Serialize value
|
|
||||||
*/
|
|
||||||
serialize(value) {
|
|
||||||
return JSON.stringify(value);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Deserialize value
|
|
||||||
*/
|
|
||||||
deserialize(value) {
|
|
||||||
return JSON.parse(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get default cache client
|
|
||||||
*/
|
|
||||||
let defaultCacheClient = null;
|
|
||||||
export function getCacheClient(config) {
|
|
||||||
if (!defaultCacheClient) {
|
|
||||||
defaultCacheClient = new CacheClient(config);
|
|
||||||
}
|
|
||||||
return defaultCacheClient;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Cache decorator for functions
|
|
||||||
*/
|
|
||||||
export function cached(fn, keyGenerator, ttl) {
|
|
||||||
const cache = getCacheClient();
|
|
||||||
return (async (...args) => {
|
|
||||||
const key = keyGenerator ? keyGenerator(...args) : `fn:${fn.name}:${JSON.stringify(args)}`;
|
|
||||||
const cachedValue = await cache.get(key);
|
|
||||||
if (cachedValue !== null) {
|
|
||||||
return cachedValue;
|
|
||||||
}
|
|
||||||
const result = await fn(...args);
|
|
||||||
await cache.set(key, result, ttl);
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=redis.js.map
|
|
||||||
1
packages/cache/src/redis.js.map
vendored
1
packages/cache/src/redis.js.map
vendored
File diff suppressed because one or more lines are too long
41
packages/database/src/audit-search.d.ts
vendored
41
packages/database/src/audit-search.d.ts
vendored
@@ -1,41 +0,0 @@
|
|||||||
/**
|
|
||||||
* Enhanced audit logging with search capabilities
|
|
||||||
*/
|
|
||||||
import type { CredentialAuditLog } from './credential-lifecycle';
|
|
||||||
export interface AuditSearchFilters {
|
|
||||||
credentialId?: string;
|
|
||||||
issuerDid?: string;
|
|
||||||
subjectDid?: string;
|
|
||||||
credentialType?: string | string[];
|
|
||||||
action?: 'issued' | 'revoked' | 'verified' | 'renewed';
|
|
||||||
performedBy?: string;
|
|
||||||
startDate?: Date;
|
|
||||||
endDate?: Date;
|
|
||||||
ipAddress?: string;
|
|
||||||
}
|
|
||||||
export interface AuditSearchResult {
|
|
||||||
logs: CredentialAuditLog[];
|
|
||||||
total: number;
|
|
||||||
page: number;
|
|
||||||
pageSize: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Search audit logs with filters
|
|
||||||
*/
|
|
||||||
export declare function searchAuditLogs(filters: AuditSearchFilters, page?: number, pageSize?: number): Promise<AuditSearchResult>;
|
|
||||||
/**
|
|
||||||
* Get audit log statistics
|
|
||||||
*/
|
|
||||||
export declare function getAuditStatistics(startDate?: Date, endDate?: Date): Promise<{
|
|
||||||
totalIssuances: number;
|
|
||||||
totalRevocations: number;
|
|
||||||
totalVerifications: number;
|
|
||||||
totalRenewals: number;
|
|
||||||
byCredentialType: Record<string, number>;
|
|
||||||
byAction: Record<string, number>;
|
|
||||||
}>;
|
|
||||||
/**
|
|
||||||
* Export audit logs (for compliance/regulatory reporting)
|
|
||||||
*/
|
|
||||||
export declare function exportAuditLogs(filters: AuditSearchFilters, format?: 'json' | 'csv'): Promise<string>;
|
|
||||||
//# sourceMappingURL=audit-search.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"audit-search.d.ts","sourceRoot":"","sources":["audit-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACnC,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,kBAAkB,EAC3B,IAAI,SAAI,EACR,QAAQ,SAAK,GACZ,OAAO,CAAC,iBAAiB,CAAC,CA4E5B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,CAAC,EAAE,IAAI,EAChB,OAAO,CAAC,EAAE,IAAI,GACb,OAAO,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC,CAsDD;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,kBAAkB,EAC3B,MAAM,GAAE,MAAM,GAAG,KAAc,GAC9B,OAAO,CAAC,MAAM,CAAC,CAiCjB"}
|
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
/**
|
|
||||||
* Enhanced audit logging with search capabilities
|
|
||||||
*/
|
|
||||||
import { query } from './client';
|
|
||||||
/**
|
|
||||||
* Search audit logs with filters
|
|
||||||
*/
|
|
||||||
export async function searchAuditLogs(filters, page = 1, pageSize = 50) {
|
|
||||||
const conditions = [];
|
|
||||||
const params = [];
|
|
||||||
let paramIndex = 1;
|
|
||||||
if (filters.credentialId) {
|
|
||||||
conditions.push(`credential_id = $${paramIndex++}`);
|
|
||||||
params.push(filters.credentialId);
|
|
||||||
}
|
|
||||||
if (filters.issuerDid) {
|
|
||||||
conditions.push(`issuer_did = $${paramIndex++}`);
|
|
||||||
params.push(filters.issuerDid);
|
|
||||||
}
|
|
||||||
if (filters.subjectDid) {
|
|
||||||
conditions.push(`subject_did = $${paramIndex++}`);
|
|
||||||
params.push(filters.subjectDid);
|
|
||||||
}
|
|
||||||
if (filters.credentialType) {
|
|
||||||
const types = Array.isArray(filters.credentialType) ? filters.credentialType : [filters.credentialType];
|
|
||||||
conditions.push(`credential_type && $${paramIndex++}`);
|
|
||||||
params.push(types);
|
|
||||||
}
|
|
||||||
if (filters.action) {
|
|
||||||
conditions.push(`action = $${paramIndex++}`);
|
|
||||||
params.push(filters.action);
|
|
||||||
}
|
|
||||||
if (filters.performedBy) {
|
|
||||||
conditions.push(`performed_by = $${paramIndex++}`);
|
|
||||||
params.push(filters.performedBy);
|
|
||||||
}
|
|
||||||
if (filters.startDate) {
|
|
||||||
conditions.push(`performed_at >= $${paramIndex++}`);
|
|
||||||
params.push(filters.startDate);
|
|
||||||
}
|
|
||||||
if (filters.endDate) {
|
|
||||||
conditions.push(`performed_at <= $${paramIndex++}`);
|
|
||||||
params.push(filters.endDate);
|
|
||||||
}
|
|
||||||
if (filters.ipAddress) {
|
|
||||||
conditions.push(`ip_address = $${paramIndex++}`);
|
|
||||||
params.push(filters.ipAddress);
|
|
||||||
}
|
|
||||||
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
||||||
const offset = (page - 1) * pageSize;
|
|
||||||
// Get total count
|
|
||||||
const countResult = await query(`SELECT COUNT(*) as count FROM credential_issuance_audit ${whereClause}`, params);
|
|
||||||
const total = parseInt(countResult.rows[0]?.count || '0', 10);
|
|
||||||
// Get paginated results
|
|
||||||
const result = await query(`SELECT * FROM credential_issuance_audit
|
|
||||||
${whereClause}
|
|
||||||
ORDER BY performed_at DESC
|
|
||||||
LIMIT $${paramIndex++} OFFSET $${paramIndex++}`, [...params, pageSize, offset]);
|
|
||||||
return {
|
|
||||||
logs: result.rows,
|
|
||||||
total,
|
|
||||||
page,
|
|
||||||
pageSize,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get audit log statistics
|
|
||||||
*/
|
|
||||||
export async function getAuditStatistics(startDate, endDate) {
|
|
||||||
const conditions = [];
|
|
||||||
const params = [];
|
|
||||||
let paramIndex = 1;
|
|
||||||
if (startDate) {
|
|
||||||
conditions.push(`performed_at >= $${paramIndex++}`);
|
|
||||||
params.push(startDate);
|
|
||||||
}
|
|
||||||
if (endDate) {
|
|
||||||
conditions.push(`performed_at <= $${paramIndex++}`);
|
|
||||||
params.push(endDate);
|
|
||||||
}
|
|
||||||
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
||||||
// Get counts by action
|
|
||||||
const actionResult = await query(`SELECT action, COUNT(*) as count
|
|
||||||
FROM credential_issuance_audit
|
|
||||||
${whereClause}
|
|
||||||
GROUP BY action`, params);
|
|
||||||
const byAction = {};
|
|
||||||
actionResult.rows.forEach((row) => {
|
|
||||||
byAction[row.action] = parseInt(row.count, 10);
|
|
||||||
});
|
|
||||||
// Get counts by credential type
|
|
||||||
const typeResult = await query(`SELECT credential_type, COUNT(*) as count
|
|
||||||
FROM credential_issuance_audit
|
|
||||||
${whereClause}
|
|
||||||
GROUP BY credential_type`, params);
|
|
||||||
const byCredentialType = {};
|
|
||||||
typeResult.rows.forEach((row) => {
|
|
||||||
const types = row.credential_type.join(', ');
|
|
||||||
byCredentialType[types] = (byCredentialType[types] || 0) + parseInt(row.count, 10);
|
|
||||||
});
|
|
||||||
return {
|
|
||||||
totalIssuances: byAction.issued || 0,
|
|
||||||
totalRevocations: byAction.revoked || 0,
|
|
||||||
totalVerifications: byAction.verified || 0,
|
|
||||||
totalRenewals: byAction.renewed || 0,
|
|
||||||
byCredentialType,
|
|
||||||
byAction,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Export audit logs (for compliance/regulatory reporting)
|
|
||||||
*/
|
|
||||||
export async function exportAuditLogs(filters, format = 'json') {
|
|
||||||
const result = await searchAuditLogs(filters, 1, 10000); // Large limit for export
|
|
||||||
if (format === 'csv') {
|
|
||||||
const headers = [
|
|
||||||
'id',
|
|
||||||
'credential_id',
|
|
||||||
'issuer_did',
|
|
||||||
'subject_did',
|
|
||||||
'credential_type',
|
|
||||||
'action',
|
|
||||||
'performed_by',
|
|
||||||
'performed_at',
|
|
||||||
'ip_address',
|
|
||||||
'user_agent',
|
|
||||||
];
|
|
||||||
const rows = result.logs.map((log) => [
|
|
||||||
log.id,
|
|
||||||
log.credential_id,
|
|
||||||
log.issuer_did,
|
|
||||||
log.subject_did,
|
|
||||||
log.credential_type.join(';'),
|
|
||||||
log.action,
|
|
||||||
log.performed_by || '',
|
|
||||||
log.performed_at.toISOString(),
|
|
||||||
log.ip_address || '',
|
|
||||||
log.user_agent || '',
|
|
||||||
]);
|
|
||||||
return [headers.join(','), ...rows.map((row) => row.join(','))].join('\n');
|
|
||||||
}
|
|
||||||
return JSON.stringify(result.logs, null, 2);
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=audit-search.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"audit-search.js","sourceRoot":"","sources":["audit-search.ts"],"names":[],"mappings":"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"}
|
|
||||||
37
packages/database/src/client.d.ts
vendored
37
packages/database/src/client.d.ts
vendored
@@ -1,37 +0,0 @@
|
|||||||
/**
|
|
||||||
* PostgreSQL database client with connection pooling
|
|
||||||
*/
|
|
||||||
import { Pool, QueryResult, QueryResultRow } from 'pg';
|
|
||||||
export type { QueryResult, QueryResultRow };
|
|
||||||
export interface DatabaseConfig {
|
|
||||||
connectionString?: string;
|
|
||||||
host?: string;
|
|
||||||
port?: number;
|
|
||||||
database?: string;
|
|
||||||
user?: string;
|
|
||||||
password?: string;
|
|
||||||
max?: number;
|
|
||||||
idleTimeoutMillis?: number;
|
|
||||||
connectionTimeoutMillis?: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Create a PostgreSQL connection pool
|
|
||||||
*/
|
|
||||||
export declare function createPool(config: DatabaseConfig): Pool;
|
|
||||||
/**
|
|
||||||
* Get or create the default database pool
|
|
||||||
*/
|
|
||||||
export declare function getPool(config?: DatabaseConfig): Pool;
|
|
||||||
/**
|
|
||||||
* Execute a query
|
|
||||||
*/
|
|
||||||
export declare function query<T extends QueryResultRow = QueryResultRow>(text: string, params?: unknown[]): Promise<QueryResult<T>>;
|
|
||||||
/**
|
|
||||||
* Close the database pool
|
|
||||||
*/
|
|
||||||
export declare function closePool(): Promise<void>;
|
|
||||||
/**
|
|
||||||
* Health check for database connection
|
|
||||||
*/
|
|
||||||
export declare function healthCheck(): Promise<boolean>;
|
|
||||||
//# sourceMappingURL=client.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAc,WAAW,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAGnE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAcvD;AAOD;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAQrD;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACnE,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAKzB;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAK/C;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAQpD"}
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
/**
|
|
||||||
* PostgreSQL database client with connection pooling
|
|
||||||
*/
|
|
||||||
import { Pool } from 'pg';
|
|
||||||
/**
|
|
||||||
* Create a PostgreSQL connection pool
|
|
||||||
*/
|
|
||||||
export function createPool(config) {
|
|
||||||
const poolConfig = {
|
|
||||||
connectionString: config.connectionString,
|
|
||||||
host: config.host,
|
|
||||||
port: config.port,
|
|
||||||
database: config.database,
|
|
||||||
user: config.user,
|
|
||||||
password: config.password,
|
|
||||||
max: config.max || 20,
|
|
||||||
idleTimeoutMillis: config.idleTimeoutMillis || 30000,
|
|
||||||
connectionTimeoutMillis: config.connectionTimeoutMillis || 2000,
|
|
||||||
};
|
|
||||||
return new Pool(poolConfig);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Default database pool instance
|
|
||||||
*/
|
|
||||||
let defaultPool = null;
|
|
||||||
/**
|
|
||||||
* Get or create the default database pool
|
|
||||||
*/
|
|
||||||
export function getPool(config) {
|
|
||||||
if (!defaultPool) {
|
|
||||||
if (!config) {
|
|
||||||
throw new Error('Database configuration required for first pool creation');
|
|
||||||
}
|
|
||||||
defaultPool = createPool(config);
|
|
||||||
}
|
|
||||||
return defaultPool;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Execute a query
|
|
||||||
*/
|
|
||||||
export async function query(text, params) {
|
|
||||||
if (!defaultPool) {
|
|
||||||
throw new Error('Database pool not initialized. Call getPool() with configuration first.');
|
|
||||||
}
|
|
||||||
return defaultPool.query(text, params);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Close the database pool
|
|
||||||
*/
|
|
||||||
export async function closePool() {
|
|
||||||
if (defaultPool) {
|
|
||||||
await defaultPool.end();
|
|
||||||
defaultPool = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Health check for database connection
|
|
||||||
*/
|
|
||||||
export async function healthCheck() {
|
|
||||||
try {
|
|
||||||
const pool = getPool();
|
|
||||||
await pool.query('SELECT 1');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=client.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"client.js","sourceRoot":"","sources":["client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAA2C,MAAM,IAAI,CAAC;AAiBnE;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAsB;IAC/C,MAAM,UAAU,GAAe;QAC7B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE;QACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,KAAK;QACpD,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,IAAI,IAAI;KAChE,CAAC;IAEF,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,IAAI,WAAW,GAAgB,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAuB;IAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,IAAY,EACZ,MAAkB;IAElB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,WAAW,CAAC,KAAK,CAAI,IAAI,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,WAAW,CAAC,GAAG,EAAE,CAAC;QACxB,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
||||||
50
packages/database/src/credential-lifecycle.d.ts
vendored
50
packages/database/src/credential-lifecycle.d.ts
vendored
@@ -1,50 +0,0 @@
|
|||||||
/**
|
|
||||||
* Credential lifecycle management operations
|
|
||||||
*/
|
|
||||||
export interface CredentialStatusHistory {
|
|
||||||
id: string;
|
|
||||||
credential_id: string;
|
|
||||||
status: string;
|
|
||||||
reason?: string;
|
|
||||||
changed_by?: string;
|
|
||||||
changed_at: Date;
|
|
||||||
metadata?: unknown;
|
|
||||||
}
|
|
||||||
export interface CredentialRevocation {
|
|
||||||
id: string;
|
|
||||||
credential_id: string;
|
|
||||||
issuer_did: string;
|
|
||||||
revocation_reason?: string;
|
|
||||||
revoked_by?: string;
|
|
||||||
revoked_at: Date;
|
|
||||||
revocation_list_index?: number;
|
|
||||||
}
|
|
||||||
export interface CredentialAuditLog {
|
|
||||||
id: string;
|
|
||||||
credential_id: string;
|
|
||||||
issuer_did: string;
|
|
||||||
subject_did: string;
|
|
||||||
credential_type: string[];
|
|
||||||
action: 'issued' | 'revoked' | 'verified' | 'renewed';
|
|
||||||
performed_by?: string;
|
|
||||||
performed_at: Date;
|
|
||||||
metadata?: unknown;
|
|
||||||
ip_address?: string;
|
|
||||||
user_agent?: string;
|
|
||||||
}
|
|
||||||
export declare function addCredentialStatusHistory(history: Omit<CredentialStatusHistory, 'id' | 'changed_at'>): Promise<CredentialStatusHistory>;
|
|
||||||
export declare function getCredentialStatusHistory(credentialId: string): Promise<CredentialStatusHistory[]>;
|
|
||||||
export declare function revokeCredential(revocation: Omit<CredentialRevocation, 'id' | 'revoked_at' | 'revocation_list_index'>): Promise<CredentialRevocation>;
|
|
||||||
export declare function isCredentialRevoked(credentialId: string): Promise<boolean>;
|
|
||||||
export declare function getRevocationRegistry(issuerDid: string, limit?: number, offset?: number): Promise<CredentialRevocation[]>;
|
|
||||||
export declare function logCredentialAction(audit: Omit<CredentialAuditLog, 'id' | 'performed_at'>): Promise<CredentialAuditLog>;
|
|
||||||
export declare function getCredentialAuditLog(credentialId: string, limit?: number): Promise<CredentialAuditLog[]>;
|
|
||||||
export declare function getExpiringCredentials(daysAhead: number, limit?: number): Promise<Array<{
|
|
||||||
credential_id: string;
|
|
||||||
expiration_date: Date;
|
|
||||||
subject_did: string;
|
|
||||||
issuer_did: string;
|
|
||||||
credential_type: string[];
|
|
||||||
credential_subject: unknown;
|
|
||||||
}>>;
|
|
||||||
//# sourceMappingURL=credential-lifecycle.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"credential-lifecycle.d.ts","sourceRoot":"","sources":["credential-lifecycle.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,IAAI,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,GAAG,YAAY,CAAC,GAC1D,OAAO,CAAC,uBAAuB,CAAC,CAclC;AAED,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAQpC;AAGD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,GAAG,YAAY,GAAG,uBAAuB,CAAC,GACpF,OAAO,CAAC,oBAAoB,CAAC,CAiC/B;AAED,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMhF;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,SAAM,EACX,MAAM,SAAI,GACT,OAAO,CAAC,oBAAoB,EAAE,CAAC,CASjC;AAGD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,cAAc,CAAC,GACrD,OAAO,CAAC,kBAAkB,CAAC,CAmB7B;AAED,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,KAAK,SAAM,GACV,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAS/B;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,KAAK,SAAM,GACV,OAAO,CAAC,KAAK,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,kBAAkB,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAanK"}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/**
|
|
||||||
* Credential lifecycle management operations
|
|
||||||
*/
|
|
||||||
import { query } from './client';
|
|
||||||
// Note: CredentialTemplate operations are now in credential-templates.ts
|
|
||||||
// This file focuses on lifecycle operations (status history, revocation, audit)
|
|
||||||
// Credential Status History operations
|
|
||||||
export async function addCredentialStatusHistory(history) {
|
|
||||||
const result = await query(`INSERT INTO credential_status_history (credential_id, status, reason, changed_by, metadata)
|
|
||||||
VALUES ($1, $2, $3, $4, $5)
|
|
||||||
RETURNING *`, [
|
|
||||||
history.credential_id,
|
|
||||||
history.status,
|
|
||||||
history.reason || null,
|
|
||||||
history.changed_by || null,
|
|
||||||
history.metadata ? JSON.stringify(history.metadata) : null,
|
|
||||||
]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
export async function getCredentialStatusHistory(credentialId) {
|
|
||||||
const result = await query(`SELECT * FROM credential_status_history
|
|
||||||
WHERE credential_id = $1
|
|
||||||
ORDER BY changed_at DESC`, [credentialId]);
|
|
||||||
return result.rows;
|
|
||||||
}
|
|
||||||
// Credential Revocation operations
|
|
||||||
export async function revokeCredential(revocation) {
|
|
||||||
// First, update the credential as revoked
|
|
||||||
await query(`UPDATE verifiable_credentials
|
|
||||||
SET revoked = TRUE, updated_at = NOW()
|
|
||||||
WHERE credential_id = $1`, [revocation.credential_id]);
|
|
||||||
// Get the next revocation list index
|
|
||||||
const indexResult = await query(`SELECT MAX(revocation_list_index) as max_index
|
|
||||||
FROM credential_revocation_registry
|
|
||||||
WHERE issuer_did = $1`, [revocation.issuer_did]);
|
|
||||||
const nextIndex = (indexResult.rows[0]?.max_index ?? -1) + 1;
|
|
||||||
// Add to revocation registry
|
|
||||||
const result = await query(`INSERT INTO credential_revocation_registry
|
|
||||||
(credential_id, issuer_did, revocation_reason, revoked_by, revocation_list_index)
|
|
||||||
VALUES ($1, $2, $3, $4, $5)
|
|
||||||
RETURNING *`, [
|
|
||||||
revocation.credential_id,
|
|
||||||
revocation.issuer_did,
|
|
||||||
revocation.revocation_reason || null,
|
|
||||||
revocation.revoked_by || null,
|
|
||||||
nextIndex,
|
|
||||||
]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
export async function isCredentialRevoked(credentialId) {
|
|
||||||
const result = await query(`SELECT revoked FROM verifiable_credentials WHERE credential_id = $1`, [credentialId]);
|
|
||||||
return result.rows[0]?.revoked ?? false;
|
|
||||||
}
|
|
||||||
export async function getRevocationRegistry(issuerDid, limit = 100, offset = 0) {
|
|
||||||
const result = await query(`SELECT * FROM credential_revocation_registry
|
|
||||||
WHERE issuer_did = $1
|
|
||||||
ORDER BY revocation_list_index DESC
|
|
||||||
LIMIT $2 OFFSET $3`, [issuerDid, limit, offset]);
|
|
||||||
return result.rows;
|
|
||||||
}
|
|
||||||
// Credential Audit Log operations
|
|
||||||
export async function logCredentialAction(audit) {
|
|
||||||
const result = await query(`INSERT INTO credential_issuance_audit
|
|
||||||
(credential_id, issuer_did, subject_did, credential_type, action, performed_by, metadata, ip_address, user_agent)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
|
|
||||||
RETURNING *`, [
|
|
||||||
audit.credential_id,
|
|
||||||
audit.issuer_did,
|
|
||||||
audit.subject_did,
|
|
||||||
audit.credential_type,
|
|
||||||
audit.action,
|
|
||||||
audit.performed_by || null,
|
|
||||||
audit.metadata ? JSON.stringify(audit.metadata) : null,
|
|
||||||
audit.ip_address || null,
|
|
||||||
audit.user_agent || null,
|
|
||||||
]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
export async function getCredentialAuditLog(credentialId, limit = 100) {
|
|
||||||
const result = await query(`SELECT * FROM credential_issuance_audit
|
|
||||||
WHERE credential_id = $1
|
|
||||||
ORDER BY performed_at DESC
|
|
||||||
LIMIT $2`, [credentialId, limit]);
|
|
||||||
return result.rows;
|
|
||||||
}
|
|
||||||
export async function getExpiringCredentials(daysAhead, limit = 100) {
|
|
||||||
const result = await query(`SELECT credential_id, expiration_date, subject_did, issuer_did, credential_type, credential_subject
|
|
||||||
FROM verifiable_credentials
|
|
||||||
WHERE expiration_date IS NOT NULL
|
|
||||||
AND expiration_date > NOW()
|
|
||||||
AND expiration_date < NOW() + INTERVAL '${daysAhead} days'
|
|
||||||
AND revoked = FALSE
|
|
||||||
ORDER BY expiration_date ASC
|
|
||||||
LIMIT $1`, [limit]);
|
|
||||||
return result.rows;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=credential-lifecycle.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"credential-lifecycle.js","sourceRoot":"","sources":["credential-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
||||||
68
packages/database/src/credential-templates.d.ts
vendored
68
packages/database/src/credential-templates.d.ts
vendored
@@ -1,68 +0,0 @@
|
|||||||
/**
|
|
||||||
* Credential template management
|
|
||||||
*/
|
|
||||||
import { z } from 'zod';
|
|
||||||
export declare const CredentialTemplateSchema: z.ZodObject<{
|
|
||||||
id: z.ZodString;
|
|
||||||
name: z.ZodString;
|
|
||||||
description: z.ZodOptional<z.ZodString>;
|
|
||||||
credential_type: z.ZodArray<z.ZodString, "many">;
|
|
||||||
template_data: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
||||||
version: z.ZodNumber;
|
|
||||||
is_active: z.ZodBoolean;
|
|
||||||
created_by: z.ZodNullable<z.ZodString>;
|
|
||||||
created_at: z.ZodDate;
|
|
||||||
updated_at: z.ZodDate;
|
|
||||||
}, "strip", z.ZodTypeAny, {
|
|
||||||
name: string;
|
|
||||||
id: string;
|
|
||||||
created_at: Date;
|
|
||||||
updated_at: Date;
|
|
||||||
created_by: string | null;
|
|
||||||
credential_type: string[];
|
|
||||||
template_data: Record<string, unknown>;
|
|
||||||
version: number;
|
|
||||||
is_active: boolean;
|
|
||||||
description?: string | undefined;
|
|
||||||
}, {
|
|
||||||
name: string;
|
|
||||||
id: string;
|
|
||||||
created_at: Date;
|
|
||||||
updated_at: Date;
|
|
||||||
created_by: string | null;
|
|
||||||
credential_type: string[];
|
|
||||||
template_data: Record<string, unknown>;
|
|
||||||
version: number;
|
|
||||||
is_active: boolean;
|
|
||||||
description?: string | undefined;
|
|
||||||
}>;
|
|
||||||
export type CredentialTemplate = z.infer<typeof CredentialTemplateSchema>;
|
|
||||||
/**
|
|
||||||
* Create a credential template
|
|
||||||
*/
|
|
||||||
export declare function createCredentialTemplate(template: Omit<CredentialTemplate, 'id' | 'created_at' | 'updated_at'>): Promise<CredentialTemplate>;
|
|
||||||
/**
|
|
||||||
* Get credential template by ID
|
|
||||||
*/
|
|
||||||
export declare function getCredentialTemplate(id: string): Promise<CredentialTemplate | null>;
|
|
||||||
/**
|
|
||||||
* Get credential template by name and version
|
|
||||||
*/
|
|
||||||
export declare function getCredentialTemplateByName(name: string, version?: number): Promise<CredentialTemplate | null>;
|
|
||||||
/**
|
|
||||||
* List all credential templates
|
|
||||||
*/
|
|
||||||
export declare function listCredentialTemplates(activeOnly?: boolean, limit?: number, offset?: number): Promise<CredentialTemplate[]>;
|
|
||||||
/**
|
|
||||||
* Update credential template
|
|
||||||
*/
|
|
||||||
export declare function updateCredentialTemplate(id: string, updates: Partial<Pick<CredentialTemplate, 'description' | 'template_data' | 'is_active'>>): Promise<CredentialTemplate | null>;
|
|
||||||
/**
|
|
||||||
* Create new version of credential template
|
|
||||||
*/
|
|
||||||
export declare function createTemplateVersion(templateId: string, updates: Partial<Pick<CredentialTemplate, 'template_data' | 'description'>>): Promise<CredentialTemplate>;
|
|
||||||
/**
|
|
||||||
* Render credential from template with variable substitution
|
|
||||||
*/
|
|
||||||
export declare function renderCredentialFromTemplate(template: CredentialTemplate, variables: Record<string, unknown>): Record<string, unknown>;
|
|
||||||
//# sourceMappingURL=credential-templates.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"credential-templates.d.ts","sourceRoot":"","sources":["credential-templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,YAAY,GAAG,YAAY,CAAC,GACrE,OAAO,CAAC,kBAAkB,CAAC,CAiB7B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAM1F;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAkBpC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,UAAO,EACjB,KAAK,SAAM,EACX,MAAM,SAAI,GACT,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAU/B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,aAAa,GAAG,eAAe,GAAG,WAAW,CAAC,CAAC,GACxF,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAiCpC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,eAAe,GAAG,aAAa,CAAC,CAAC,GAC1E,OAAO,CAAC,kBAAkB,CAAC,CAsB7B;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB"}
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
/**
|
|
||||||
* Credential template management
|
|
||||||
*/
|
|
||||||
import { query } from './client';
|
|
||||||
import { z } from 'zod';
|
|
||||||
export const CredentialTemplateSchema = z.object({
|
|
||||||
id: z.string().uuid(),
|
|
||||||
name: z.string(),
|
|
||||||
description: z.string().optional(),
|
|
||||||
credential_type: z.array(z.string()),
|
|
||||||
template_data: z.record(z.unknown()),
|
|
||||||
version: z.number().int().positive(),
|
|
||||||
is_active: z.boolean(),
|
|
||||||
created_by: z.string().uuid().nullable(),
|
|
||||||
created_at: z.date(),
|
|
||||||
updated_at: z.date(),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* Create a credential template
|
|
||||||
*/
|
|
||||||
export async function createCredentialTemplate(template) {
|
|
||||||
const result = await query(`INSERT INTO credential_templates
|
|
||||||
(name, description, credential_type, template_data, version, is_active, created_by)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6, $7)
|
|
||||||
RETURNING *`, [
|
|
||||||
template.name,
|
|
||||||
template.description || null,
|
|
||||||
template.credential_type,
|
|
||||||
JSON.stringify(template.template_data),
|
|
||||||
template.version,
|
|
||||||
template.is_active,
|
|
||||||
template.created_by || null,
|
|
||||||
]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get credential template by ID
|
|
||||||
*/
|
|
||||||
export async function getCredentialTemplate(id) {
|
|
||||||
const result = await query(`SELECT * FROM credential_templates WHERE id = $1`, [id]);
|
|
||||||
return result.rows[0] || null;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get credential template by name and version
|
|
||||||
*/
|
|
||||||
export async function getCredentialTemplateByName(name, version) {
|
|
||||||
if (version) {
|
|
||||||
const result = await query(`SELECT * FROM credential_templates WHERE name = $1 AND version = $2`, [name, version]);
|
|
||||||
return result.rows[0] || null;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Get latest active version
|
|
||||||
const result = await query(`SELECT * FROM credential_templates
|
|
||||||
WHERE name = $1 AND is_active = TRUE
|
|
||||||
ORDER BY version DESC
|
|
||||||
LIMIT 1`, [name]);
|
|
||||||
return result.rows[0] || null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* List all credential templates
|
|
||||||
*/
|
|
||||||
export async function listCredentialTemplates(activeOnly = true, limit = 100, offset = 0) {
|
|
||||||
const whereClause = activeOnly ? 'WHERE is_active = TRUE' : '';
|
|
||||||
const result = await query(`SELECT * FROM credential_templates
|
|
||||||
${whereClause}
|
|
||||||
ORDER BY name, version DESC
|
|
||||||
LIMIT $1 OFFSET $2`, [limit, offset]);
|
|
||||||
return result.rows;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Update credential template
|
|
||||||
*/
|
|
||||||
export async function updateCredentialTemplate(id, updates) {
|
|
||||||
const fields = [];
|
|
||||||
const values = [];
|
|
||||||
let paramIndex = 1;
|
|
||||||
if (updates.description !== undefined) {
|
|
||||||
fields.push(`description = $${paramIndex++}`);
|
|
||||||
values.push(updates.description);
|
|
||||||
}
|
|
||||||
if (updates.template_data !== undefined) {
|
|
||||||
fields.push(`template_data = $${paramIndex++}`);
|
|
||||||
values.push(JSON.stringify(updates.template_data));
|
|
||||||
}
|
|
||||||
if (updates.is_active !== undefined) {
|
|
||||||
fields.push(`is_active = $${paramIndex++}`);
|
|
||||||
values.push(updates.is_active);
|
|
||||||
}
|
|
||||||
if (fields.length === 0) {
|
|
||||||
return getCredentialTemplate(id);
|
|
||||||
}
|
|
||||||
fields.push(`updated_at = NOW()`);
|
|
||||||
values.push(id);
|
|
||||||
const result = await query(`UPDATE credential_templates
|
|
||||||
SET ${fields.join(', ')}
|
|
||||||
WHERE id = $${paramIndex}
|
|
||||||
RETURNING *`, values);
|
|
||||||
return result.rows[0] || null;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Create new version of credential template
|
|
||||||
*/
|
|
||||||
export async function createTemplateVersion(templateId, updates) {
|
|
||||||
const original = await getCredentialTemplate(templateId);
|
|
||||||
if (!original) {
|
|
||||||
throw new Error(`Template ${templateId} not found`);
|
|
||||||
}
|
|
||||||
// Get next version number
|
|
||||||
const versionResult = await query(`SELECT MAX(version) as max_version FROM credential_templates WHERE name = $1`, [original.name]);
|
|
||||||
const nextVersion = (versionResult.rows[0]?.max_version || 0) + 1;
|
|
||||||
return createCredentialTemplate({
|
|
||||||
name: original.name,
|
|
||||||
description: updates.description || original.description,
|
|
||||||
credential_type: original.credential_type,
|
|
||||||
template_data: updates.template_data || original.template_data,
|
|
||||||
version: nextVersion,
|
|
||||||
is_active: true,
|
|
||||||
created_by: original.created_by,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Render credential from template with variable substitution
|
|
||||||
*/
|
|
||||||
export function renderCredentialFromTemplate(template, variables) {
|
|
||||||
const rendered = JSON.parse(JSON.stringify(template.template_data));
|
|
||||||
function substitute(obj) {
|
|
||||||
if (typeof obj === 'string') {
|
|
||||||
// Replace {{variable}} patterns
|
|
||||||
return obj.replace(/\{\{(\w+)\}\}/g, (match, varName) => {
|
|
||||||
return variables[varName] !== undefined ? String(variables[varName]) : match;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else if (Array.isArray(obj)) {
|
|
||||||
return obj.map(substitute);
|
|
||||||
}
|
|
||||||
else if (obj && typeof obj === 'object') {
|
|
||||||
const result = {};
|
|
||||||
for (const [key, value] of Object.entries(obj)) {
|
|
||||||
result[key] = substitute(value);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
return substitute(rendered);
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=credential-templates.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"credential-templates.js","sourceRoot":"","sources":["credential-templates.ts"],"names":[],"mappings":"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"}
|
|
||||||
@@ -4,7 +4,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { query } from './client';
|
import { query } from './client';
|
||||||
import { listDocuments, getDocumentById } from './schema';
|
|
||||||
|
|
||||||
export interface DocumentSearchResult {
|
export interface DocumentSearchResult {
|
||||||
documents: Array<{
|
documents: Array<{
|
||||||
@@ -102,8 +101,8 @@ export async function searchDocuments(
|
|||||||
/**
|
/**
|
||||||
* Get search suggestions
|
* Get search suggestions
|
||||||
*/
|
*/
|
||||||
export async function getSearchSuggestions(query: string, limit = 10): Promise<string[]> {
|
export async function getSearchSuggestions(searchTerm: string, limit = 10): Promise<string[]> {
|
||||||
if (!query || query.length < 2) {
|
if (!searchTerm || searchTerm.length < 2) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,9 +112,8 @@ export async function getSearchSuggestions(query: string, limit = 10): Promise<s
|
|||||||
WHERE title ILIKE $1
|
WHERE title ILIKE $1
|
||||||
ORDER BY title
|
ORDER BY title
|
||||||
LIMIT $2`,
|
LIMIT $2`,
|
||||||
[`%${query}%`, limit]
|
[`%${searchTerm}%`, limit]
|
||||||
);
|
);
|
||||||
|
|
||||||
return result.rows.map((row) => row.title);
|
return result.rows.map((row) => row.title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -320,9 +320,11 @@ export function extractTemplateVariables(template_content: string): string[] {
|
|||||||
const matches = template_content.matchAll(/\{\{(\w+(?:\.\w+)*)\}\}/g);
|
const matches = template_content.matchAll(/\{\{(\w+(?:\.\w+)*)\}\}/g);
|
||||||
|
|
||||||
for (const match of matches) {
|
for (const match of matches) {
|
||||||
variables.add(match[1]);
|
const variableName = match[1];
|
||||||
|
if (variableName) {
|
||||||
|
variables.add(variableName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Array.from(variables).sort();
|
return Array.from(variables).sort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
/**
|
|
||||||
* eResidency Application Database Operations
|
|
||||||
*/
|
|
||||||
import { type eResidencyApplication, type eCitizenshipApplication, ApplicationStatus } from '@the-order/schemas';
|
|
||||||
/**
|
|
||||||
* Create eResidency application
|
|
||||||
*/
|
|
||||||
export declare function createEResidencyApplication(application: Omit<eResidencyApplication, 'id' | 'createdAt' | 'updatedAt'>): Promise<eResidencyApplication>;
|
|
||||||
/**
|
|
||||||
* Get eResidency application by ID
|
|
||||||
*/
|
|
||||||
export declare function getEResidencyApplicationById(id: string): Promise<eResidencyApplication | null>;
|
|
||||||
/**
|
|
||||||
* Update eResidency application
|
|
||||||
*/
|
|
||||||
export declare function updateEResidencyApplication(id: string, updates: {
|
|
||||||
status?: ApplicationStatus;
|
|
||||||
kycStatus?: 'pending' | 'passed' | 'failed' | 'requires_edd';
|
|
||||||
sanctionsStatus?: 'pending' | 'clear' | 'flag';
|
|
||||||
pepStatus?: 'pending' | 'clear' | 'flag';
|
|
||||||
riskScore?: number;
|
|
||||||
kycResults?: unknown;
|
|
||||||
sanctionsResults?: unknown;
|
|
||||||
riskAssessment?: unknown;
|
|
||||||
reviewedAt?: string;
|
|
||||||
reviewedBy?: string;
|
|
||||||
rejectionReason?: string;
|
|
||||||
}): Promise<eResidencyApplication>;
|
|
||||||
/**
|
|
||||||
* Get review queue
|
|
||||||
*/
|
|
||||||
export declare function getReviewQueue(filters: {
|
|
||||||
riskBand?: 'low' | 'medium' | 'high';
|
|
||||||
status?: ApplicationStatus;
|
|
||||||
assignedTo?: string;
|
|
||||||
limit?: number;
|
|
||||||
offset?: number;
|
|
||||||
}): Promise<{
|
|
||||||
applications: eResidencyApplication[];
|
|
||||||
total: number;
|
|
||||||
}>;
|
|
||||||
/**
|
|
||||||
* Create eCitizenship application
|
|
||||||
*/
|
|
||||||
export declare function createECitizenshipApplication(application: Omit<eCitizenshipApplication, 'id' | 'createdAt' | 'updatedAt'>): Promise<eCitizenshipApplication>;
|
|
||||||
/**
|
|
||||||
* Get eCitizenship application by ID
|
|
||||||
*/
|
|
||||||
export declare function getECitizenshipApplicationById(id: string): Promise<eCitizenshipApplication | null>;
|
|
||||||
/**
|
|
||||||
* Update eCitizenship application
|
|
||||||
*/
|
|
||||||
export declare function updateECitizenshipApplication(id: string, updates: {
|
|
||||||
status?: ApplicationStatus;
|
|
||||||
reviewedAt?: string;
|
|
||||||
reviewedBy?: string;
|
|
||||||
rejectionReason?: string;
|
|
||||||
}): Promise<eCitizenshipApplication>;
|
|
||||||
//# sourceMappingURL=eresidency-applications.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"eresidency-applications.d.ts","sourceRoot":"","sources":["eresidency-applications.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AA4C5B;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GACzE,OAAO,CAAC,qBAAqB,CAAC,CA2BhC;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAWpG;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IACP,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,cAAc,CAAC;IAC7D,eAAe,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,qBAAqB,CAAC,CA2DhC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAC5C,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,qBAAqB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAkDpE;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,IAAI,CAAC,uBAAuB,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAC3E,OAAO,CAAC,uBAAuB,CAAC,CAuDlC;AAED;;GAEG;AACH,wBAAsB,8BAA8B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CA6CxG;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IACP,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,OAAO,CAAC,uBAAuB,CAAC,CAiElC"}
|
|
||||||
@@ -1,340 +0,0 @@
|
|||||||
/**
|
|
||||||
* eResidency Application Database Operations
|
|
||||||
*/
|
|
||||||
import { query } from './client';
|
|
||||||
/**
|
|
||||||
* Map database row to application object
|
|
||||||
*/
|
|
||||||
function mapRowToApplication(row) {
|
|
||||||
return {
|
|
||||||
id: row.id,
|
|
||||||
applicantDid: row.applicant_did || undefined,
|
|
||||||
email: row.email,
|
|
||||||
givenName: row.given_name,
|
|
||||||
familyName: row.family_name,
|
|
||||||
dateOfBirth: row.date_of_birth ? (row.date_of_birth instanceof Date ? row.date_of_birth.toISOString().split('T')[0] : row.date_of_birth) : undefined,
|
|
||||||
nationality: row.nationality || undefined,
|
|
||||||
phone: row.phone || undefined,
|
|
||||||
address: row.address ? (typeof row.address === 'string' ? JSON.parse(row.address) : row.address) : undefined,
|
|
||||||
deviceFingerprint: row.device_fingerprint || undefined,
|
|
||||||
identityDocument: row.identity_document
|
|
||||||
? typeof row.identity_document === 'string'
|
|
||||||
? JSON.parse(row.identity_document)
|
|
||||||
: row.identity_document
|
|
||||||
: undefined,
|
|
||||||
selfieLiveness: row.selfie_liveness
|
|
||||||
? typeof row.selfie_liveness === 'string'
|
|
||||||
? JSON.parse(row.selfie_liveness)
|
|
||||||
: row.selfie_liveness
|
|
||||||
: undefined,
|
|
||||||
status: row.status,
|
|
||||||
submittedAt: row.submitted_at ? (row.submitted_at instanceof Date ? row.submitted_at.toISOString() : row.submitted_at) : undefined,
|
|
||||||
reviewedAt: row.reviewed_at ? (row.reviewed_at instanceof Date ? row.reviewed_at.toISOString() : row.reviewed_at) : undefined,
|
|
||||||
reviewedBy: row.reviewed_by || undefined,
|
|
||||||
rejectionReason: row.rejection_reason || undefined,
|
|
||||||
kycStatus: row.kyc_status || undefined,
|
|
||||||
sanctionsStatus: row.sanctions_status || undefined,
|
|
||||||
pepStatus: row.pep_status || undefined,
|
|
||||||
riskScore: row.risk_score ? parseFloat(String(row.risk_score)) : undefined,
|
|
||||||
kycResults: row.kyc_results ? (typeof row.kyc_results === 'string' ? JSON.parse(row.kyc_results) : row.kyc_results) : undefined,
|
|
||||||
sanctionsResults: row.sanctions_results ? (typeof row.sanctions_results === 'string' ? JSON.parse(row.sanctions_results) : row.sanctions_results) : undefined,
|
|
||||||
riskAssessment: row.risk_assessment ? (typeof row.risk_assessment === 'string' ? JSON.parse(row.risk_assessment) : row.risk_assessment) : undefined,
|
|
||||||
createdAt: row.created_at instanceof Date ? row.created_at.toISOString() : row.created_at,
|
|
||||||
updatedAt: row.updated_at instanceof Date ? row.updated_at.toISOString() : row.updated_at,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Create eResidency application
|
|
||||||
*/
|
|
||||||
export async function createEResidencyApplication(application) {
|
|
||||||
const result = await query(`INSERT INTO eresidency_applications
|
|
||||||
(applicant_did, email, given_name, family_name, date_of_birth, nationality, phone, address,
|
|
||||||
device_fingerprint, identity_document, selfie_liveness, status, kyc_status, sanctions_status, pep_status)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
|
|
||||||
RETURNING *`, [
|
|
||||||
application.applicantDid || null,
|
|
||||||
application.email,
|
|
||||||
application.givenName,
|
|
||||||
application.familyName,
|
|
||||||
application.dateOfBirth || null,
|
|
||||||
application.nationality || null,
|
|
||||||
application.phone || null,
|
|
||||||
application.address ? JSON.stringify(application.address) : null,
|
|
||||||
application.deviceFingerprint || null,
|
|
||||||
application.identityDocument ? JSON.stringify(application.identityDocument) : null,
|
|
||||||
application.selfieLiveness ? JSON.stringify(application.selfieLiveness) : null,
|
|
||||||
application.status,
|
|
||||||
application.kycStatus || null,
|
|
||||||
application.sanctionsStatus || null,
|
|
||||||
application.pepStatus || null,
|
|
||||||
]);
|
|
||||||
return mapRowToApplication(result.rows[0]);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get eResidency application by ID
|
|
||||||
*/
|
|
||||||
export async function getEResidencyApplicationById(id) {
|
|
||||||
const result = await query('SELECT * FROM eresidency_applications WHERE id = $1', [id]);
|
|
||||||
if (!result.rows[0]) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return mapRowToApplication(result.rows[0]);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Update eResidency application
|
|
||||||
*/
|
|
||||||
export async function updateEResidencyApplication(id, updates) {
|
|
||||||
const fields = [];
|
|
||||||
const values = [];
|
|
||||||
let paramIndex = 1;
|
|
||||||
if (updates.status !== undefined) {
|
|
||||||
fields.push(`status = $${paramIndex++}`);
|
|
||||||
values.push(updates.status);
|
|
||||||
}
|
|
||||||
if (updates.kycStatus !== undefined) {
|
|
||||||
fields.push(`kyc_status = $${paramIndex++}`);
|
|
||||||
values.push(updates.kycStatus);
|
|
||||||
}
|
|
||||||
if (updates.sanctionsStatus !== undefined) {
|
|
||||||
fields.push(`sanctions_status = $${paramIndex++}`);
|
|
||||||
values.push(updates.sanctionsStatus);
|
|
||||||
}
|
|
||||||
if (updates.pepStatus !== undefined) {
|
|
||||||
fields.push(`pep_status = $${paramIndex++}`);
|
|
||||||
values.push(updates.pepStatus);
|
|
||||||
}
|
|
||||||
if (updates.riskScore !== undefined) {
|
|
||||||
fields.push(`risk_score = $${paramIndex++}`);
|
|
||||||
values.push(updates.riskScore);
|
|
||||||
}
|
|
||||||
if (updates.kycResults !== undefined) {
|
|
||||||
fields.push(`kyc_results = $${paramIndex++}`);
|
|
||||||
values.push(JSON.stringify(updates.kycResults));
|
|
||||||
}
|
|
||||||
if (updates.sanctionsResults !== undefined) {
|
|
||||||
fields.push(`sanctions_results = $${paramIndex++}`);
|
|
||||||
values.push(JSON.stringify(updates.sanctionsResults));
|
|
||||||
}
|
|
||||||
if (updates.riskAssessment !== undefined) {
|
|
||||||
fields.push(`risk_assessment = $${paramIndex++}`);
|
|
||||||
values.push(JSON.stringify(updates.riskAssessment));
|
|
||||||
}
|
|
||||||
if (updates.reviewedAt !== undefined) {
|
|
||||||
fields.push(`reviewed_at = $${paramIndex++}`);
|
|
||||||
values.push(updates.reviewedAt);
|
|
||||||
}
|
|
||||||
if (updates.reviewedBy !== undefined) {
|
|
||||||
fields.push(`reviewed_by = $${paramIndex++}`);
|
|
||||||
values.push(updates.reviewedBy);
|
|
||||||
}
|
|
||||||
if (updates.rejectionReason !== undefined) {
|
|
||||||
fields.push(`rejection_reason = $${paramIndex++}`);
|
|
||||||
values.push(updates.rejectionReason);
|
|
||||||
}
|
|
||||||
fields.push(`updated_at = NOW()`);
|
|
||||||
values.push(id);
|
|
||||||
const result = await query(`UPDATE eresidency_applications SET ${fields.join(', ')} WHERE id = $${paramIndex} RETURNING *`, values);
|
|
||||||
return mapRowToApplication(result.rows[0]);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get review queue
|
|
||||||
*/
|
|
||||||
export async function getReviewQueue(filters) {
|
|
||||||
const conditions = [];
|
|
||||||
const params = [];
|
|
||||||
let paramIndex = 1;
|
|
||||||
if (filters.riskBand) {
|
|
||||||
// Map risk band to risk score range
|
|
||||||
const riskRanges = {
|
|
||||||
low: [0, 0.3],
|
|
||||||
medium: [0.3, 0.8],
|
|
||||||
high: [0.8, 1.0],
|
|
||||||
};
|
|
||||||
const [min, max] = riskRanges[filters.riskBand];
|
|
||||||
conditions.push(`risk_score >= $${paramIndex++} AND risk_score < $${paramIndex++}`);
|
|
||||||
params.push(min, max);
|
|
||||||
}
|
|
||||||
if (filters.status) {
|
|
||||||
conditions.push(`status = $${paramIndex++}`);
|
|
||||||
params.push(filters.status);
|
|
||||||
}
|
|
||||||
if (filters.assignedTo) {
|
|
||||||
conditions.push(`reviewed_by = $${paramIndex++}`);
|
|
||||||
params.push(filters.assignedTo);
|
|
||||||
}
|
|
||||||
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
||||||
const limit = filters.limit || 50;
|
|
||||||
const offset = filters.offset || 0;
|
|
||||||
// Get total count
|
|
||||||
const countResult = await query(`SELECT COUNT(*) as count FROM eresidency_applications ${whereClause}`, params);
|
|
||||||
const total = parseInt(countResult.rows[0]?.count || '0', 10);
|
|
||||||
// Get applications
|
|
||||||
const result = await query(`SELECT * FROM eresidency_applications
|
|
||||||
${whereClause}
|
|
||||||
ORDER BY created_at DESC
|
|
||||||
LIMIT $${paramIndex++} OFFSET $${paramIndex++}`, [...params, limit, offset]);
|
|
||||||
const applications = result.rows.map((row) => mapRowToApplication(row));
|
|
||||||
return { applications, total };
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Create eCitizenship application
|
|
||||||
*/
|
|
||||||
export async function createECitizenshipApplication(application) {
|
|
||||||
const result = await query(`INSERT INTO ecitizenship_applications
|
|
||||||
(applicant_did, resident_did, residency_tenure, sponsor_did, service_merit, video_interview,
|
|
||||||
background_attestations, oath_ceremony, status)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
|
|
||||||
RETURNING *`, [
|
|
||||||
application.applicantDid,
|
|
||||||
application.residentDid,
|
|
||||||
application.residencyTenure,
|
|
||||||
application.sponsorDid || null,
|
|
||||||
application.serviceMerit ? JSON.stringify(application.serviceMerit) : null,
|
|
||||||
application.videoInterview ? JSON.stringify(application.videoInterview) : null,
|
|
||||||
application.backgroundAttestations ? JSON.stringify(application.backgroundAttestations) : null,
|
|
||||||
application.oathCeremony ? JSON.stringify(application.oathCeremony) : null,
|
|
||||||
application.status,
|
|
||||||
]);
|
|
||||||
const row = result.rows[0];
|
|
||||||
return {
|
|
||||||
id: row.id,
|
|
||||||
applicantDid: row.applicant_did,
|
|
||||||
residentDid: row.resident_did,
|
|
||||||
residencyTenure: row.residency_tenure || undefined,
|
|
||||||
sponsorDid: row.sponsor_did || undefined,
|
|
||||||
serviceMerit: row.service_merit
|
|
||||||
? typeof row.service_merit === 'string'
|
|
||||||
? JSON.parse(row.service_merit)
|
|
||||||
: row.service_merit
|
|
||||||
: undefined,
|
|
||||||
videoInterview: row.video_interview
|
|
||||||
? typeof row.video_interview === 'string'
|
|
||||||
? JSON.parse(row.video_interview)
|
|
||||||
: row.video_interview
|
|
||||||
: undefined,
|
|
||||||
backgroundAttestations: row.background_attestations
|
|
||||||
? typeof row.background_attestations === 'string'
|
|
||||||
? JSON.parse(row.background_attestations)
|
|
||||||
: row.background_attestations
|
|
||||||
: undefined,
|
|
||||||
oathCeremony: row.oath_ceremony
|
|
||||||
? typeof row.oath_ceremony === 'string'
|
|
||||||
? JSON.parse(row.oath_ceremony)
|
|
||||||
: row.oath_ceremony
|
|
||||||
: undefined,
|
|
||||||
status: row.status,
|
|
||||||
submittedAt: row.submitted_at ? (row.submitted_at instanceof Date ? row.submitted_at.toISOString() : row.submitted_at) : undefined,
|
|
||||||
reviewedAt: row.reviewed_at ? (row.reviewed_at instanceof Date ? row.reviewed_at.toISOString() : row.reviewed_at) : undefined,
|
|
||||||
reviewedBy: row.reviewed_by || undefined,
|
|
||||||
rejectionReason: row.rejection_reason || undefined,
|
|
||||||
createdAt: row.created_at instanceof Date ? row.created_at.toISOString() : row.created_at,
|
|
||||||
updatedAt: row.updated_at instanceof Date ? row.updated_at.toISOString() : row.updated_at,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Get eCitizenship application by ID
|
|
||||||
*/
|
|
||||||
export async function getECitizenshipApplicationById(id) {
|
|
||||||
const result = await query('SELECT * FROM ecitizenship_applications WHERE id = $1', [id]);
|
|
||||||
if (!result.rows[0]) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
const row = result.rows[0];
|
|
||||||
return {
|
|
||||||
id: row.id,
|
|
||||||
applicantDid: row.applicant_did,
|
|
||||||
residentDid: row.resident_did,
|
|
||||||
residencyTenure: row.residency_tenure || undefined,
|
|
||||||
sponsorDid: row.sponsor_did || undefined,
|
|
||||||
serviceMerit: row.service_merit
|
|
||||||
? typeof row.service_merit === 'string'
|
|
||||||
? JSON.parse(row.service_merit)
|
|
||||||
: row.service_merit
|
|
||||||
: undefined,
|
|
||||||
videoInterview: row.video_interview
|
|
||||||
? typeof row.video_interview === 'string'
|
|
||||||
? JSON.parse(row.video_interview)
|
|
||||||
: row.video_interview
|
|
||||||
: undefined,
|
|
||||||
backgroundAttestations: row.background_attestations
|
|
||||||
? typeof row.background_attestations === 'string'
|
|
||||||
? JSON.parse(row.background_attestations)
|
|
||||||
: row.background_attestations
|
|
||||||
: undefined,
|
|
||||||
oathCeremony: row.oath_ceremony
|
|
||||||
? typeof row.oath_ceremony === 'string'
|
|
||||||
? JSON.parse(row.oath_ceremony)
|
|
||||||
: row.oath_ceremony
|
|
||||||
: undefined,
|
|
||||||
status: row.status,
|
|
||||||
submittedAt: row.submitted_at ? (row.submitted_at instanceof Date ? row.submitted_at.toISOString() : row.submitted_at) : undefined,
|
|
||||||
reviewedAt: row.reviewed_at ? (row.reviewed_at instanceof Date ? row.reviewed_at.toISOString() : row.reviewed_at) : undefined,
|
|
||||||
reviewedBy: row.reviewed_by || undefined,
|
|
||||||
rejectionReason: row.rejection_reason || undefined,
|
|
||||||
createdAt: row.created_at instanceof Date ? row.created_at.toISOString() : row.created_at,
|
|
||||||
updatedAt: row.updated_at instanceof Date ? row.updated_at.toISOString() : row.updated_at,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Update eCitizenship application
|
|
||||||
*/
|
|
||||||
export async function updateECitizenshipApplication(id, updates) {
|
|
||||||
const fields = [];
|
|
||||||
const values = [];
|
|
||||||
let paramIndex = 1;
|
|
||||||
if (updates.status !== undefined) {
|
|
||||||
fields.push(`status = $${paramIndex++}`);
|
|
||||||
values.push(updates.status);
|
|
||||||
}
|
|
||||||
if (updates.reviewedAt !== undefined) {
|
|
||||||
fields.push(`reviewed_at = $${paramIndex++}`);
|
|
||||||
values.push(updates.reviewedAt);
|
|
||||||
}
|
|
||||||
if (updates.reviewedBy !== undefined) {
|
|
||||||
fields.push(`reviewed_by = $${paramIndex++}`);
|
|
||||||
values.push(updates.reviewedBy);
|
|
||||||
}
|
|
||||||
if (updates.rejectionReason !== undefined) {
|
|
||||||
fields.push(`rejection_reason = $${paramIndex++}`);
|
|
||||||
values.push(updates.rejectionReason);
|
|
||||||
}
|
|
||||||
fields.push(`updated_at = NOW()`);
|
|
||||||
values.push(id);
|
|
||||||
const result = await query(`UPDATE ecitizenship_applications SET ${fields.join(', ')} WHERE id = $${paramIndex} RETURNING *`, values);
|
|
||||||
const row = result.rows[0];
|
|
||||||
return {
|
|
||||||
id: row.id,
|
|
||||||
applicantDid: row.applicant_did,
|
|
||||||
residentDid: row.resident_did,
|
|
||||||
residencyTenure: row.residency_tenure || undefined,
|
|
||||||
sponsorDid: row.sponsor_did || undefined,
|
|
||||||
serviceMerit: row.service_merit
|
|
||||||
? typeof row.service_merit === 'string'
|
|
||||||
? JSON.parse(row.service_merit)
|
|
||||||
: row.service_merit
|
|
||||||
: undefined,
|
|
||||||
videoInterview: row.video_interview
|
|
||||||
? typeof row.video_interview === 'string'
|
|
||||||
? JSON.parse(row.video_interview)
|
|
||||||
: row.video_interview
|
|
||||||
: undefined,
|
|
||||||
backgroundAttestations: row.background_attestations
|
|
||||||
? typeof row.background_attestations === 'string'
|
|
||||||
? JSON.parse(row.background_attestations)
|
|
||||||
: row.background_attestations
|
|
||||||
: undefined,
|
|
||||||
oathCeremony: row.oath_ceremony
|
|
||||||
? typeof row.oath_ceremony === 'string'
|
|
||||||
? JSON.parse(row.oath_ceremony)
|
|
||||||
: row.oath_ceremony
|
|
||||||
: undefined,
|
|
||||||
status: row.status,
|
|
||||||
submittedAt: row.submitted_at ? (row.submitted_at instanceof Date ? row.submitted_at.toISOString() : row.submitted_at) : undefined,
|
|
||||||
reviewedAt: row.reviewed_at ? (row.reviewed_at instanceof Date ? row.reviewed_at.toISOString() : row.reviewed_at) : undefined,
|
|
||||||
reviewedBy: row.reviewed_by || undefined,
|
|
||||||
rejectionReason: row.rejection_reason || undefined,
|
|
||||||
createdAt: row.created_at instanceof Date ? row.created_at.toISOString() : row.created_at,
|
|
||||||
updatedAt: row.updated_at instanceof Date ? row.updated_at.toISOString() : row.updated_at,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=eresidency-applications.js.map
|
|
||||||
File diff suppressed because one or more lines are too long
14
packages/database/src/index.d.ts
vendored
14
packages/database/src/index.d.ts
vendored
@@ -1,14 +0,0 @@
|
|||||||
/**
|
|
||||||
* Database utilities for The Order
|
|
||||||
*/
|
|
||||||
export * from './client';
|
|
||||||
export * from './schema';
|
|
||||||
export * from './credential-lifecycle';
|
|
||||||
export * from './credential-templates';
|
|
||||||
export * from './audit-search';
|
|
||||||
export * from './query-cache';
|
|
||||||
export * from './eresidency-applications';
|
|
||||||
export { getCredentialTemplateByName, renderCredentialFromTemplate, } from './credential-templates';
|
|
||||||
export type { QueryResult, QueryResultRow } from './client';
|
|
||||||
export type { User, Document, Deal, VerifiableCredential, Signature, LedgerEntry, Payment, } from './schema';
|
|
||||||
//# sourceMappingURL=index.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAG1C,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG5D,YAAY,EACV,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,OAAO,GACR,MAAM,UAAU,CAAC"}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
/**
|
|
||||||
* Database utilities for The Order
|
|
||||||
*/
|
|
||||||
export * from './client';
|
|
||||||
export * from './schema';
|
|
||||||
export * from './credential-lifecycle';
|
|
||||||
export * from './credential-templates';
|
|
||||||
export * from './audit-search';
|
|
||||||
export * from './query-cache';
|
|
||||||
export * from './eresidency-applications';
|
|
||||||
// Re-export template functions for convenience
|
|
||||||
export { getCredentialTemplateByName, renderCredentialFromTemplate, } from './credential-templates';
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAE1C,+CAA+C;AAC/C,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC"}
|
|
||||||
33
packages/database/src/query-cache.d.ts
vendored
33
packages/database/src/query-cache.d.ts
vendored
@@ -1,33 +0,0 @@
|
|||||||
/**
|
|
||||||
* Database query caching with Redis
|
|
||||||
* Implements query result caching with automatic invalidation
|
|
||||||
*
|
|
||||||
* Note: This module uses optional dynamic import for @the-order/cache
|
|
||||||
* to avoid requiring it as a direct dependency. If cache is not available,
|
|
||||||
* queries will execute directly without caching.
|
|
||||||
*/
|
|
||||||
import type { QueryResult, QueryResultRow } from './client';
|
|
||||||
export interface CacheOptions {
|
|
||||||
ttl?: number;
|
|
||||||
keyPrefix?: string;
|
|
||||||
enabled?: boolean;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Execute a query with caching
|
|
||||||
*/
|
|
||||||
export declare function cachedQuery<T extends QueryResultRow = QueryResultRow>(sql: string, params?: unknown[], options?: CacheOptions): Promise<QueryResult<T>>;
|
|
||||||
/**
|
|
||||||
* Invalidate cache for a pattern
|
|
||||||
*/
|
|
||||||
export declare function invalidateCache(pattern: string): Promise<number>;
|
|
||||||
/**
|
|
||||||
* Invalidate cache for a specific query
|
|
||||||
*/
|
|
||||||
export declare function invalidateQueryCache(sql: string, params?: unknown[]): Promise<void>;
|
|
||||||
/**
|
|
||||||
* Cache decorator for database functions
|
|
||||||
* Note: This is a simplified implementation. In production, you'd need to
|
|
||||||
* extract SQL and params from the function or pass them as metadata.
|
|
||||||
*/
|
|
||||||
export declare function cached<T extends (...args: unknown[]) => Promise<QueryResult<QueryResultRow>>>(fn: T): T;
|
|
||||||
//# sourceMappingURL=query-cache.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"query-cache.d.ts","sourceRoot":"","sources":["query-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuCD;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EACzE,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,OAAO,EAAE,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA4BzB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMtE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOzF;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAC3F,EAAE,EAAE,CAAC,GACJ,CAAC,CAKH"}
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
/**
|
|
||||||
* Database query caching with Redis
|
|
||||||
* Implements query result caching with automatic invalidation
|
|
||||||
*
|
|
||||||
* Note: This module uses optional dynamic import for @the-order/cache
|
|
||||||
* to avoid requiring it as a direct dependency. If cache is not available,
|
|
||||||
* queries will execute directly without caching.
|
|
||||||
*/
|
|
||||||
import { query } from './client';
|
|
||||||
// Cache client instance (lazy-loaded via dynamic import)
|
|
||||||
let cacheClientPromise = null;
|
|
||||||
/**
|
|
||||||
* Get cache client (lazy-loaded via dynamic import)
|
|
||||||
* Returns null if cache module is not available
|
|
||||||
*/
|
|
||||||
async function getCacheClient() {
|
|
||||||
if (cacheClientPromise === null) {
|
|
||||||
cacheClientPromise = (async () => {
|
|
||||||
try {
|
|
||||||
// Use dynamic import with a string literal that TypeScript can't resolve at compile time
|
|
||||||
// This is done by constructing the import path dynamically
|
|
||||||
const cacheModulePath = '@the-order/cache';
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
||||||
const importFunc = new Function('specifier', 'return import(specifier)');
|
|
||||||
const cacheModule = await importFunc(cacheModulePath);
|
|
||||||
return cacheModule.getCacheClient();
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
// Cache module not available - caching will be disabled
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
}
|
|
||||||
return cacheClientPromise;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Execute a query with caching
|
|
||||||
*/
|
|
||||||
export async function cachedQuery(sql, params, options = {}) {
|
|
||||||
const { ttl = 3600, keyPrefix = 'db:query:', enabled = true } = options;
|
|
||||||
if (!enabled) {
|
|
||||||
return query(sql, params);
|
|
||||||
}
|
|
||||||
const cache = await getCacheClient();
|
|
||||||
if (!cache) {
|
|
||||||
// Cache not available - execute query directly
|
|
||||||
return query(sql, params);
|
|
||||||
}
|
|
||||||
const cacheKey = `${keyPrefix}${sql}:${JSON.stringify(params || [])}`;
|
|
||||||
// Try to get from cache
|
|
||||||
const cached = await cache.get(cacheKey);
|
|
||||||
if (cached) {
|
|
||||||
return cached;
|
|
||||||
}
|
|
||||||
// Execute query
|
|
||||||
const result = await query(sql, params);
|
|
||||||
// Cache result
|
|
||||||
await cache.set(cacheKey, result, ttl);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Invalidate cache for a pattern
|
|
||||||
*/
|
|
||||||
export async function invalidateCache(pattern) {
|
|
||||||
const cache = await getCacheClient();
|
|
||||||
if (!cache) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return cache.invalidate(`db:query:${pattern}*`);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Invalidate cache for a specific query
|
|
||||||
*/
|
|
||||||
export async function invalidateQueryCache(sql, params) {
|
|
||||||
const cache = await getCacheClient();
|
|
||||||
if (!cache) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const cacheKey = `db:query:${sql}:${JSON.stringify(params || [])}`;
|
|
||||||
await cache.delete(cacheKey);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Cache decorator for database functions
|
|
||||||
* Note: This is a simplified implementation. In production, you'd need to
|
|
||||||
* extract SQL and params from the function or pass them as metadata.
|
|
||||||
*/
|
|
||||||
export function cached(fn) {
|
|
||||||
return (async (...args) => {
|
|
||||||
const result = await fn(...args);
|
|
||||||
return result;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=query-cache.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"query-cache.js","sourceRoot":"","sources":["query-cache.ts"],"names":[],"mappings":"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"}
|
|
||||||
98
packages/database/src/schema.d.ts
vendored
98
packages/database/src/schema.d.ts
vendored
@@ -1,98 +0,0 @@
|
|||||||
/**
|
|
||||||
* Database schema types and queries
|
|
||||||
*/
|
|
||||||
export interface User {
|
|
||||||
id: string;
|
|
||||||
email: string;
|
|
||||||
name: string;
|
|
||||||
did?: string;
|
|
||||||
roles?: string[];
|
|
||||||
created_at: Date;
|
|
||||||
updated_at: Date;
|
|
||||||
}
|
|
||||||
export interface Document {
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
type: string;
|
|
||||||
content?: string;
|
|
||||||
file_url?: string;
|
|
||||||
storage_key?: string;
|
|
||||||
user_id?: string;
|
|
||||||
status: string;
|
|
||||||
classification?: string;
|
|
||||||
ocr_text?: string;
|
|
||||||
extracted_data?: unknown;
|
|
||||||
created_at: Date;
|
|
||||||
updated_at: Date;
|
|
||||||
}
|
|
||||||
export interface Deal {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
status: string;
|
|
||||||
dataroom_id?: string;
|
|
||||||
created_by?: string;
|
|
||||||
created_at: Date;
|
|
||||||
updated_at: Date;
|
|
||||||
}
|
|
||||||
export interface VerifiableCredential {
|
|
||||||
id: string;
|
|
||||||
credential_id: string;
|
|
||||||
issuer_did: string;
|
|
||||||
subject_did: string;
|
|
||||||
credential_type: string[];
|
|
||||||
credential_subject: unknown;
|
|
||||||
issuance_date: Date;
|
|
||||||
expiration_date?: Date;
|
|
||||||
proof?: unknown;
|
|
||||||
revoked: boolean;
|
|
||||||
created_at: Date;
|
|
||||||
updated_at: Date;
|
|
||||||
}
|
|
||||||
export interface Signature {
|
|
||||||
id: string;
|
|
||||||
document_id?: string;
|
|
||||||
signer_did: string;
|
|
||||||
signature_data: string;
|
|
||||||
signature_timestamp: Date;
|
|
||||||
signature_type: string;
|
|
||||||
created_at: Date;
|
|
||||||
}
|
|
||||||
export interface LedgerEntry {
|
|
||||||
id: string;
|
|
||||||
account_id: string;
|
|
||||||
type: 'debit' | 'credit';
|
|
||||||
amount: number;
|
|
||||||
currency: string;
|
|
||||||
description?: string;
|
|
||||||
reference?: string;
|
|
||||||
created_at: Date;
|
|
||||||
}
|
|
||||||
export interface Payment {
|
|
||||||
id: string;
|
|
||||||
amount: number;
|
|
||||||
currency: string;
|
|
||||||
status: string;
|
|
||||||
payment_method: string;
|
|
||||||
transaction_id?: string;
|
|
||||||
gateway_response?: unknown;
|
|
||||||
created_at: Date;
|
|
||||||
updated_at: Date;
|
|
||||||
}
|
|
||||||
export declare function createUser(user: Omit<User, 'id' | 'created_at' | 'updated_at'>): Promise<User>;
|
|
||||||
export declare function getUserById(id: string): Promise<User | null>;
|
|
||||||
export declare function createDocument(doc: Omit<Document, 'id' | 'created_at' | 'updated_at'>): Promise<Document>;
|
|
||||||
export declare function getDocumentById(id: string): Promise<Document | null>;
|
|
||||||
export declare function updateDocument(id: string, updates: Partial<Pick<Document, 'status' | 'classification' | 'ocr_text' | 'extracted_data'>>): Promise<Document>;
|
|
||||||
export declare function createDeal(deal: Omit<Deal, 'id' | 'created_at' | 'updated_at'>): Promise<Deal>;
|
|
||||||
export declare function getDealById(id: string): Promise<Deal | null>;
|
|
||||||
export declare function createDealDocument(dealId: string, documentId: string, storageKey: string, accessLevel?: string): Promise<void>;
|
|
||||||
export declare function createVerifiableCredential(vc: Omit<VerifiableCredential, 'id' | 'created_at' | 'updated_at' | 'revoked'>): Promise<VerifiableCredential>;
|
|
||||||
export declare function getVerifiableCredentialById(credentialId: string): Promise<VerifiableCredential | null>;
|
|
||||||
export declare function revokeVerifiableCredential(credentialId: string): Promise<void>;
|
|
||||||
export declare function createSignature(signature: Omit<Signature, 'id' | 'created_at'>): Promise<Signature>;
|
|
||||||
export declare function createLedgerEntry(entry: Omit<LedgerEntry, 'id' | 'created_at'>): Promise<LedgerEntry>;
|
|
||||||
export declare function createPayment(payment: Omit<Payment, 'id' | 'created_at' | 'updated_at'>): Promise<Payment>;
|
|
||||||
export declare function updatePaymentStatus(id: string, status: string, transactionId?: string, gatewayResponse?: unknown): Promise<Payment>;
|
|
||||||
export declare function createWorkflowState(workflowId: string, workflowType: string, documentId: string, state: unknown): Promise<void>;
|
|
||||||
export declare function getWorkflowState(workflowId: string): Promise<unknown>;
|
|
||||||
//# sourceMappingURL=schema.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["schema.ts"],"names":[],"mappings":"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"}
|
|
||||||
@@ -1,193 +0,0 @@
|
|||||||
/**
|
|
||||||
* Database schema types and queries
|
|
||||||
*/
|
|
||||||
import { query } from './client';
|
|
||||||
// User operations
|
|
||||||
export async function createUser(user) {
|
|
||||||
const result = await query(`INSERT INTO users (email, name, did, roles)
|
|
||||||
VALUES ($1, $2, $3, $4)
|
|
||||||
RETURNING *`, [user.email, user.name, user.did || null, user.roles || []]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
export async function getUserById(id) {
|
|
||||||
const result = await query('SELECT * FROM users WHERE id = $1', [id]);
|
|
||||||
return result.rows[0] || null;
|
|
||||||
}
|
|
||||||
// Document operations
|
|
||||||
export async function createDocument(doc) {
|
|
||||||
const result = await query(`INSERT INTO documents (title, type, content, file_url, storage_key, user_id, status, classification, ocr_text, extracted_data)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
|
|
||||||
RETURNING *`, [
|
|
||||||
doc.title,
|
|
||||||
doc.type,
|
|
||||||
doc.content || null,
|
|
||||||
doc.file_url || null,
|
|
||||||
doc.storage_key || null,
|
|
||||||
doc.user_id || null,
|
|
||||||
doc.status || 'pending',
|
|
||||||
doc.classification || null,
|
|
||||||
doc.ocr_text || null,
|
|
||||||
doc.extracted_data ? JSON.stringify(doc.extracted_data) : null,
|
|
||||||
]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
export async function getDocumentById(id) {
|
|
||||||
const result = await query('SELECT * FROM documents WHERE id = $1', [id]);
|
|
||||||
if (result.rows[0]?.extracted_data && typeof result.rows[0].extracted_data === 'string') {
|
|
||||||
result.rows[0].extracted_data = JSON.parse(result.rows[0].extracted_data);
|
|
||||||
}
|
|
||||||
return result.rows[0] || null;
|
|
||||||
}
|
|
||||||
export async function updateDocument(id, updates) {
|
|
||||||
const fields = [];
|
|
||||||
const values = [];
|
|
||||||
let paramIndex = 1;
|
|
||||||
if (updates.status !== undefined) {
|
|
||||||
fields.push(`status = $${paramIndex++}`);
|
|
||||||
values.push(updates.status);
|
|
||||||
}
|
|
||||||
if (updates.classification !== undefined) {
|
|
||||||
fields.push(`classification = $${paramIndex++}`);
|
|
||||||
values.push(updates.classification);
|
|
||||||
}
|
|
||||||
if (updates.ocr_text !== undefined) {
|
|
||||||
fields.push(`ocr_text = $${paramIndex++}`);
|
|
||||||
values.push(updates.ocr_text);
|
|
||||||
}
|
|
||||||
if (updates.extracted_data !== undefined) {
|
|
||||||
fields.push(`extracted_data = $${paramIndex++}`);
|
|
||||||
values.push(JSON.stringify(updates.extracted_data));
|
|
||||||
}
|
|
||||||
fields.push(`updated_at = NOW()`);
|
|
||||||
values.push(id);
|
|
||||||
const result = await query(`UPDATE documents SET ${fields.join(', ')} WHERE id = $${paramIndex} RETURNING *`, values);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
// Deal operations
|
|
||||||
export async function createDeal(deal) {
|
|
||||||
const result = await query(`INSERT INTO deals (name, status, dataroom_id, created_by)
|
|
||||||
VALUES ($1, $2, $3, $4)
|
|
||||||
RETURNING *`, [deal.name, deal.status || 'draft', deal.dataroom_id || null, deal.created_by || null]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
export async function getDealById(id) {
|
|
||||||
const result = await query('SELECT * FROM deals WHERE id = $1', [id]);
|
|
||||||
return result.rows[0] || null;
|
|
||||||
}
|
|
||||||
export async function createDealDocument(dealId, documentId, storageKey, accessLevel = 'viewer') {
|
|
||||||
await query(`INSERT INTO deal_documents (deal_id, document_id, storage_key, access_level)
|
|
||||||
VALUES ($1, $2, $3, $4)
|
|
||||||
ON CONFLICT (deal_id, document_id) DO NOTHING`, [dealId, documentId, storageKey, accessLevel]);
|
|
||||||
}
|
|
||||||
// VC operations
|
|
||||||
export async function createVerifiableCredential(vc) {
|
|
||||||
const result = await query(`INSERT INTO verifiable_credentials
|
|
||||||
(credential_id, issuer_did, subject_did, credential_type, credential_subject, issuance_date, expiration_date, proof)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
||||||
RETURNING *`, [
|
|
||||||
vc.credential_id,
|
|
||||||
vc.issuer_did,
|
|
||||||
vc.subject_did,
|
|
||||||
vc.credential_type,
|
|
||||||
JSON.stringify(vc.credential_subject),
|
|
||||||
vc.issuance_date,
|
|
||||||
vc.expiration_date || null,
|
|
||||||
vc.proof ? JSON.stringify(vc.proof) : null,
|
|
||||||
]);
|
|
||||||
const row = result.rows[0];
|
|
||||||
row.credential_subject = JSON.parse(row.credential_subject);
|
|
||||||
if (row.proof && typeof row.proof === 'string') {
|
|
||||||
row.proof = JSON.parse(row.proof);
|
|
||||||
}
|
|
||||||
return row;
|
|
||||||
}
|
|
||||||
export async function getVerifiableCredentialById(credentialId) {
|
|
||||||
const result = await query('SELECT * FROM verifiable_credentials WHERE credential_id = $1', [credentialId]);
|
|
||||||
if (result.rows[0]) {
|
|
||||||
const row = result.rows[0];
|
|
||||||
row.credential_subject = JSON.parse(row.credential_subject);
|
|
||||||
if (row.proof && typeof row.proof === 'string') {
|
|
||||||
row.proof = JSON.parse(row.proof);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.rows[0] || null;
|
|
||||||
}
|
|
||||||
export async function revokeVerifiableCredential(credentialId) {
|
|
||||||
await query('UPDATE verifiable_credentials SET revoked = TRUE WHERE credential_id = $1', [credentialId]);
|
|
||||||
}
|
|
||||||
// Signature operations
|
|
||||||
export async function createSignature(signature) {
|
|
||||||
const result = await query(`INSERT INTO signatures (document_id, signer_did, signature_data, signature_timestamp, signature_type)
|
|
||||||
VALUES ($1, $2, $3, $4, $5)
|
|
||||||
RETURNING *`, [
|
|
||||||
signature.document_id || null,
|
|
||||||
signature.signer_did,
|
|
||||||
signature.signature_data,
|
|
||||||
signature.signature_timestamp,
|
|
||||||
signature.signature_type || 'kms',
|
|
||||||
]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
// Ledger operations
|
|
||||||
export async function createLedgerEntry(entry) {
|
|
||||||
const result = await query(`INSERT INTO ledger_entries (account_id, type, amount, currency, description, reference)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6)
|
|
||||||
RETURNING *`, [
|
|
||||||
entry.account_id,
|
|
||||||
entry.type,
|
|
||||||
entry.amount.toString(),
|
|
||||||
entry.currency,
|
|
||||||
entry.description || null,
|
|
||||||
entry.reference || null,
|
|
||||||
]);
|
|
||||||
return result.rows[0];
|
|
||||||
}
|
|
||||||
// Payment operations
|
|
||||||
export async function createPayment(payment) {
|
|
||||||
const result = await query(`INSERT INTO payments (amount, currency, status, payment_method, transaction_id, gateway_response)
|
|
||||||
VALUES ($1, $2, $3, $4, $5, $6)
|
|
||||||
RETURNING *`, [
|
|
||||||
payment.amount.toString(),
|
|
||||||
payment.currency,
|
|
||||||
payment.status || 'pending',
|
|
||||||
payment.payment_method,
|
|
||||||
payment.transaction_id || null,
|
|
||||||
payment.gateway_response ? JSON.stringify(payment.gateway_response) : null,
|
|
||||||
]);
|
|
||||||
const row = result.rows[0];
|
|
||||||
if (row.gateway_response && typeof row.gateway_response === 'string') {
|
|
||||||
row.gateway_response = JSON.parse(row.gateway_response);
|
|
||||||
}
|
|
||||||
return row;
|
|
||||||
}
|
|
||||||
export async function updatePaymentStatus(id, status, transactionId, gatewayResponse) {
|
|
||||||
const result = await query(`UPDATE payments
|
|
||||||
SET status = $1, transaction_id = COALESCE($2, transaction_id),
|
|
||||||
gateway_response = COALESCE($3, gateway_response), updated_at = NOW()
|
|
||||||
WHERE id = $4
|
|
||||||
RETURNING *`, [
|
|
||||||
status,
|
|
||||||
transactionId || null,
|
|
||||||
gatewayResponse ? JSON.stringify(gatewayResponse) : null,
|
|
||||||
id,
|
|
||||||
]);
|
|
||||||
const row = result.rows[0];
|
|
||||||
if (row.gateway_response && typeof row.gateway_response === 'string') {
|
|
||||||
row.gateway_response = JSON.parse(row.gateway_response);
|
|
||||||
}
|
|
||||||
return row;
|
|
||||||
}
|
|
||||||
// Workflow operations
|
|
||||||
export async function createWorkflowState(workflowId, workflowType, documentId, state) {
|
|
||||||
await query(`INSERT INTO workflow_state (workflow_id, workflow_type, document_id, state)
|
|
||||||
VALUES ($1, $2, $3, $4)
|
|
||||||
ON CONFLICT (workflow_id) DO UPDATE SET state = $4, updated_at = NOW()`, [workflowId, workflowType, documentId, JSON.stringify(state)]);
|
|
||||||
}
|
|
||||||
export async function getWorkflowState(workflowId) {
|
|
||||||
const result = await query('SELECT state FROM workflow_state WHERE workflow_id = $1', [workflowId]);
|
|
||||||
if (result.rows[0]?.state && typeof result.rows[0].state === 'string') {
|
|
||||||
return JSON.parse(result.rows[0].state);
|
|
||||||
}
|
|
||||||
return result.rows[0]?.state || null;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=schema.js.map
|
|
||||||
File diff suppressed because one or more lines are too long
45
packages/ocr/src/client.d.ts
vendored
45
packages/ocr/src/client.d.ts
vendored
@@ -1,45 +0,0 @@
|
|||||||
/**
|
|
||||||
* OCR service client
|
|
||||||
*/
|
|
||||||
import { StorageClient } from '@the-order/storage';
|
|
||||||
export interface OCRResult {
|
|
||||||
text: string;
|
|
||||||
confidence: number;
|
|
||||||
words: Array<{
|
|
||||||
text: string;
|
|
||||||
confidence: number;
|
|
||||||
bbox: {
|
|
||||||
x0: number;
|
|
||||||
y0: number;
|
|
||||||
x1: number;
|
|
||||||
y1: number;
|
|
||||||
};
|
|
||||||
}>;
|
|
||||||
}
|
|
||||||
export declare class OCRClient {
|
|
||||||
private storageClient?;
|
|
||||||
constructor(storageClient?: StorageClient);
|
|
||||||
/**
|
|
||||||
* Process document from storage key with retry logic
|
|
||||||
*/
|
|
||||||
processFromStorage(storageKey: string, options?: {
|
|
||||||
maxRetries?: number;
|
|
||||||
initialDelay?: number;
|
|
||||||
}): Promise<OCRResult>;
|
|
||||||
/**
|
|
||||||
* Process document from buffer with retry logic
|
|
||||||
*/
|
|
||||||
processBuffer(buffer: Buffer, options?: {
|
|
||||||
maxRetries?: number;
|
|
||||||
initialDelay?: number;
|
|
||||||
}): Promise<OCRResult>;
|
|
||||||
/**
|
|
||||||
* Process with external OCR service
|
|
||||||
*/
|
|
||||||
private processWithExternalService;
|
|
||||||
/**
|
|
||||||
* Process with local Tesseract.js
|
|
||||||
*/
|
|
||||||
private processWithTesseract;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=client.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1D,CAAC,CAAC;CACJ;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,aAAa,CAAC,EAAE,aAAa;IAIzC;;OAEG;IACG,kBAAkB,CACtB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,SAAS,CAAC;IASrB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,SAAS,CAAC;IAkCrB;;OAEG;YACW,0BAA0B;IAkBxC;;OAEG;YACW,oBAAoB;CAwBnC"}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/**
|
|
||||||
* OCR service client
|
|
||||||
*/
|
|
||||||
import { createWorker } from 'tesseract.js';
|
|
||||||
import { getEnv } from '@the-order/shared';
|
|
||||||
export class OCRClient {
|
|
||||||
storageClient;
|
|
||||||
constructor(storageClient) {
|
|
||||||
this.storageClient = storageClient;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Process document from storage key with retry logic
|
|
||||||
*/
|
|
||||||
async processFromStorage(storageKey, options) {
|
|
||||||
if (!this.storageClient) {
|
|
||||||
throw new Error('Storage client required for processing from storage');
|
|
||||||
}
|
|
||||||
const fileBuffer = await this.storageClient.download(storageKey);
|
|
||||||
return this.processBuffer(fileBuffer, options);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Process document from buffer with retry logic
|
|
||||||
*/
|
|
||||||
async processBuffer(buffer, options) {
|
|
||||||
const maxRetries = options?.maxRetries ?? 3;
|
|
||||||
const initialDelay = options?.initialDelay ?? 1000;
|
|
||||||
let lastError = null;
|
|
||||||
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
||||||
try {
|
|
||||||
const env = getEnv();
|
|
||||||
// Use external OCR service if configured
|
|
||||||
if (env.OCR_SERVICE_URL) {
|
|
||||||
return await this.processWithExternalService(buffer);
|
|
||||||
}
|
|
||||||
// Fallback to local Tesseract.js
|
|
||||||
return await this.processWithTesseract(buffer);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
lastError = error instanceof Error ? error : new Error(String(error));
|
|
||||||
// Don't retry on the last attempt
|
|
||||||
if (attempt === maxRetries - 1) {
|
|
||||||
throw lastError;
|
|
||||||
}
|
|
||||||
// Exponential backoff: delay = initialDelay * 2^attempt
|
|
||||||
const delay = initialDelay * Math.pow(2, attempt);
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// This should never be reached, but TypeScript needs it
|
|
||||||
throw lastError || new Error('OCR processing failed after retries');
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Process with external OCR service
|
|
||||||
*/
|
|
||||||
async processWithExternalService(buffer) {
|
|
||||||
const env = getEnv();
|
|
||||||
const response = await fetch(`${env.OCR_SERVICE_URL}/process`, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/octet-stream',
|
|
||||||
Authorization: `Bearer ${env.OCR_SERVICE_API_KEY}`,
|
|
||||||
},
|
|
||||||
body: buffer,
|
|
||||||
});
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error(`OCR service error: ${response.status}`);
|
|
||||||
}
|
|
||||||
return (await response.json());
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Process with local Tesseract.js
|
|
||||||
*/
|
|
||||||
async processWithTesseract(buffer) {
|
|
||||||
const worker = await createWorker('eng');
|
|
||||||
try {
|
|
||||||
const { data } = await worker.recognize(buffer);
|
|
||||||
return {
|
|
||||||
text: data.text,
|
|
||||||
confidence: data.confidence || 0,
|
|
||||||
words: data.words.map((word) => ({
|
|
||||||
text: word.text,
|
|
||||||
confidence: word.confidence || 0,
|
|
||||||
bbox: {
|
|
||||||
x0: word.bbox.x0,
|
|
||||||
y0: word.bbox.y0,
|
|
||||||
x1: word.bbox.x1,
|
|
||||||
y1: word.bbox.y1,
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
await worker.terminate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=client.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"client.js","sourceRoot":"","sources":["client.ts"],"names":[],"mappings":"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"}
|
|
||||||
5
packages/ocr/src/index.d.ts
vendored
5
packages/ocr/src/index.d.ts
vendored
@@ -1,5 +0,0 @@
|
|||||||
/**
|
|
||||||
* OCR service client
|
|
||||||
*/
|
|
||||||
export * from './client';
|
|
||||||
//# sourceMappingURL=index.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC"}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
/**
|
|
||||||
* OCR service client
|
|
||||||
*/
|
|
||||||
export * from './client';
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC"}
|
|
||||||
5
packages/payment-gateway/src/index.d.ts
vendored
5
packages/payment-gateway/src/index.d.ts
vendored
@@ -1,5 +0,0 @@
|
|||||||
/**
|
|
||||||
* Payment gateway integration
|
|
||||||
*/
|
|
||||||
export * from './stripe';
|
|
||||||
//# sourceMappingURL=index.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC"}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
/**
|
|
||||||
* Payment gateway integration
|
|
||||||
*/
|
|
||||||
export * from './stripe';
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC"}
|
|
||||||
26
packages/payment-gateway/src/stripe.d.ts
vendored
26
packages/payment-gateway/src/stripe.d.ts
vendored
@@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* Stripe payment gateway integration
|
|
||||||
*/
|
|
||||||
import Stripe from 'stripe';
|
|
||||||
export interface PaymentIntent {
|
|
||||||
id: string;
|
|
||||||
amount: number;
|
|
||||||
currency: string;
|
|
||||||
status: string;
|
|
||||||
client_secret?: string;
|
|
||||||
}
|
|
||||||
export interface PaymentResult {
|
|
||||||
success: boolean;
|
|
||||||
transactionId: string;
|
|
||||||
status: string;
|
|
||||||
gatewayResponse: unknown;
|
|
||||||
}
|
|
||||||
export declare class StripePaymentGateway {
|
|
||||||
private stripe;
|
|
||||||
constructor();
|
|
||||||
createPaymentIntent(amount: number, currency: string, paymentMethod: string, metadata?: Record<string, string>): Promise<PaymentIntent>;
|
|
||||||
confirmPayment(paymentIntentId: string): Promise<PaymentResult>;
|
|
||||||
processPayment(amount: number, currency: string, paymentMethod: string, metadata?: Record<string, string>): Promise<PaymentResult>;
|
|
||||||
verifyWebhook(payload: string | Buffer, signature: string): Promise<Stripe.Event>;
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=stripe.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["stripe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAS;;IAejB,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC;IAiBnB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAW/D,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC;IAsBnB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;CAUxF"}
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
/**
|
|
||||||
* Stripe payment gateway integration
|
|
||||||
*/
|
|
||||||
import Stripe from 'stripe';
|
|
||||||
import { getEnv } from '@the-order/shared';
|
|
||||||
export class StripePaymentGateway {
|
|
||||||
stripe;
|
|
||||||
constructor() {
|
|
||||||
const env = getEnv();
|
|
||||||
const apiKey = env.PAYMENT_GATEWAY_API_KEY;
|
|
||||||
if (!apiKey) {
|
|
||||||
throw new Error('PAYMENT_GATEWAY_API_KEY is required');
|
|
||||||
}
|
|
||||||
this.stripe = new Stripe(apiKey, {
|
|
||||||
apiVersion: '2023-10-16',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
async createPaymentIntent(amount, currency, paymentMethod, metadata) {
|
|
||||||
const paymentIntent = await this.stripe.paymentIntents.create({
|
|
||||||
amount: Math.round(amount * 100), // Convert to cents
|
|
||||||
currency: currency.toLowerCase(),
|
|
||||||
payment_method_types: [paymentMethod === 'credit_card' ? 'card' : paymentMethod],
|
|
||||||
metadata,
|
|
||||||
});
|
|
||||||
return {
|
|
||||||
id: paymentIntent.id,
|
|
||||||
amount: paymentIntent.amount / 100,
|
|
||||||
currency: paymentIntent.currency.toUpperCase(),
|
|
||||||
status: paymentIntent.status,
|
|
||||||
client_secret: paymentIntent.client_secret || undefined,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
async confirmPayment(paymentIntentId) {
|
|
||||||
const paymentIntent = await this.stripe.paymentIntents.retrieve(paymentIntentId);
|
|
||||||
return {
|
|
||||||
success: paymentIntent.status === 'succeeded',
|
|
||||||
transactionId: paymentIntent.id,
|
|
||||||
status: paymentIntent.status,
|
|
||||||
gatewayResponse: paymentIntent,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
async processPayment(amount, currency, paymentMethod, metadata) {
|
|
||||||
const paymentIntent = await this.createPaymentIntent(amount, currency, paymentMethod, metadata);
|
|
||||||
// For immediate payment, confirm the intent
|
|
||||||
if (paymentIntent.status === 'requires_payment_method') {
|
|
||||||
const confirmed = await this.stripe.paymentIntents.confirm(paymentIntent.id);
|
|
||||||
return {
|
|
||||||
success: confirmed.status === 'succeeded',
|
|
||||||
transactionId: confirmed.id,
|
|
||||||
status: confirmed.status,
|
|
||||||
gatewayResponse: confirmed,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
success: paymentIntent.status === 'succeeded',
|
|
||||||
transactionId: paymentIntent.id,
|
|
||||||
status: paymentIntent.status,
|
|
||||||
gatewayResponse: paymentIntent,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
async verifyWebhook(payload, signature) {
|
|
||||||
const env = getEnv();
|
|
||||||
const webhookSecret = env.PAYMENT_GATEWAY_WEBHOOK_SECRET;
|
|
||||||
if (!webhookSecret) {
|
|
||||||
throw new Error('PAYMENT_GATEWAY_WEBHOOK_SECRET is required for webhook verification');
|
|
||||||
}
|
|
||||||
return this.stripe.webhooks.constructEvent(payload, signature, webhookSecret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=stripe.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"stripe.js","sourceRoot":"","sources":["stripe.ts"],"names":[],"mappings":"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"}
|
|
||||||
136
packages/schemas/src/btc-basket.ts
Normal file
136
packages/schemas/src/btc-basket.ts
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
import { z } from 'zod';
|
||||||
|
|
||||||
|
const EthAddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/);
|
||||||
|
|
||||||
|
export const BasketAllocationSchema = z.object({
|
||||||
|
symbol: z.string().min(2).max(16),
|
||||||
|
targetWeightBps: z.number().int().positive().max(10_000),
|
||||||
|
routeHint: z.string().optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type BasketAllocation = z.infer<typeof BasketAllocationSchema>;
|
||||||
|
|
||||||
|
export const BasketStatusSchema = z.enum(['draft', 'active', 'rebalancing', 'closed']);
|
||||||
|
|
||||||
|
export const BasketMandateSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
clientId: z.string().min(1),
|
||||||
|
mandateName: z.string().min(1),
|
||||||
|
chain138VaultAddress: EthAddressSchema,
|
||||||
|
baseAssetSymbol: z.string().min(2).max(16).default('cBTC'),
|
||||||
|
status: BasketStatusSchema,
|
||||||
|
allocations: z.array(BasketAllocationSchema).min(1),
|
||||||
|
createdAt: z.date().or(z.string().datetime()),
|
||||||
|
updatedAt: z.date().or(z.string().datetime()),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type BasketMandate = z.infer<typeof BasketMandateSchema>;
|
||||||
|
|
||||||
|
export const CreateBasketMandateSchema = BasketMandateSchema.omit({
|
||||||
|
id: true,
|
||||||
|
status: true,
|
||||||
|
createdAt: true,
|
||||||
|
updatedAt: true,
|
||||||
|
}).extend({
|
||||||
|
baseAssetSymbol: z.string().min(2).max(16).default('cBTC'),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type CreateBasketMandate = z.infer<typeof CreateBasketMandateSchema>;
|
||||||
|
|
||||||
|
export const BtcDepositStatusSchema = z.enum([
|
||||||
|
'instruction_created',
|
||||||
|
'pending_confirmations',
|
||||||
|
'confirmed',
|
||||||
|
'minted',
|
||||||
|
'frozen',
|
||||||
|
]);
|
||||||
|
|
||||||
|
export const BtcDepositSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
clientId: z.string().min(1),
|
||||||
|
basketId: z.string().uuid(),
|
||||||
|
chain138VaultAddress: EthAddressSchema,
|
||||||
|
depositAddress: z.string().min(16),
|
||||||
|
expectedAmountSats: z.number().int().positive().optional(),
|
||||||
|
confirmationsRequired: z.number().int().positive(),
|
||||||
|
currentConfirmations: z.number().int().nonnegative(),
|
||||||
|
status: BtcDepositStatusSchema,
|
||||||
|
observedTxId: z.string().optional(),
|
||||||
|
freezeReason: z.string().optional(),
|
||||||
|
createdAt: z.date().or(z.string().datetime()),
|
||||||
|
updatedAt: z.date().or(z.string().datetime()),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type BtcDeposit = z.infer<typeof BtcDepositSchema>;
|
||||||
|
|
||||||
|
export const CreateBtcDepositSchema = z.object({
|
||||||
|
clientId: z.string().min(1),
|
||||||
|
basketId: z.string().uuid().optional(),
|
||||||
|
mandateName: z.string().min(1).optional(),
|
||||||
|
chain138VaultAddress: EthAddressSchema,
|
||||||
|
allocations: z.array(BasketAllocationSchema).min(1).optional(),
|
||||||
|
expectedAmountSats: z.number().int().positive().optional(),
|
||||||
|
clientReference: z.string().min(1).optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type CreateBtcDeposit = z.infer<typeof CreateBtcDepositSchema>;
|
||||||
|
|
||||||
|
export const HoldingStatusSchema = z.enum(['pending_funding', 'funded']);
|
||||||
|
|
||||||
|
export const HoldingSchema = z.object({
|
||||||
|
clientId: z.string().min(1),
|
||||||
|
basketId: z.string().uuid(),
|
||||||
|
symbol: z.string().min(2).max(16),
|
||||||
|
allocationWeightBps: z.number().int().min(0).max(10_000),
|
||||||
|
bookValueSats: z.number().int().nonnegative(),
|
||||||
|
status: HoldingStatusSchema,
|
||||||
|
updatedAt: z.date().or(z.string().datetime()),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type Holding = z.infer<typeof HoldingSchema>;
|
||||||
|
|
||||||
|
export const RebalanceStatusSchema = z.enum(['planned', 'queued', 'executed', 'failed']);
|
||||||
|
|
||||||
|
export const RebalanceSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
clientId: z.string().min(1),
|
||||||
|
basketId: z.string().uuid(),
|
||||||
|
sourceSymbol: z.string().min(2).max(16),
|
||||||
|
targetSymbols: z.array(z.string().min(2).max(16)).min(1),
|
||||||
|
reason: z.string().min(1),
|
||||||
|
status: RebalanceStatusSchema,
|
||||||
|
createdAt: z.date().or(z.string().datetime()),
|
||||||
|
updatedAt: z.date().or(z.string().datetime()),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type Rebalance = z.infer<typeof RebalanceSchema>;
|
||||||
|
|
||||||
|
export const BridgeWithdrawalStatusSchema = z.enum(['pending', 'approved', 'submitted', 'failed']);
|
||||||
|
|
||||||
|
export const BridgeWithdrawalSchema = z.object({
|
||||||
|
id: z.string().uuid(),
|
||||||
|
clientId: z.string().min(1),
|
||||||
|
basketId: z.string().uuid(),
|
||||||
|
sourceSymbol: z.string().min(2).max(16),
|
||||||
|
destinationSymbol: z.string().min(2).max(16),
|
||||||
|
destinationChainId: z.number().int().positive(),
|
||||||
|
destinationAddress: EthAddressSchema,
|
||||||
|
amount: z.string().min(1),
|
||||||
|
status: BridgeWithdrawalStatusSchema,
|
||||||
|
createdAt: z.date().or(z.string().datetime()),
|
||||||
|
updatedAt: z.date().or(z.string().datetime()),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type BridgeWithdrawal = z.infer<typeof BridgeWithdrawalSchema>;
|
||||||
|
|
||||||
|
export const CreateBridgeWithdrawalSchema = BridgeWithdrawalSchema.omit({
|
||||||
|
id: true,
|
||||||
|
status: true,
|
||||||
|
createdAt: true,
|
||||||
|
updatedAt: true,
|
||||||
|
}).extend({
|
||||||
|
sourceSymbol: z.string().min(2).max(16).optional(),
|
||||||
|
destinationSymbol: z.string().min(2).max(16).optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type CreateBridgeWithdrawal = z.infer<typeof CreateBridgeWithdrawalSchema>;
|
||||||
43
packages/schemas/src/deal.d.ts
vendored
43
packages/schemas/src/deal.d.ts
vendored
@@ -1,43 +0,0 @@
|
|||||||
import { z } from 'zod';
|
|
||||||
export declare const DealStatusSchema: z.ZodEnum<["draft", "active", "closed", "archived"]>;
|
|
||||||
export declare const DealSchema: z.ZodObject<{
|
|
||||||
id: z.ZodString;
|
|
||||||
name: z.ZodString;
|
|
||||||
status: z.ZodEnum<["draft", "active", "closed", "archived"]>;
|
|
||||||
dataroomId: z.ZodOptional<z.ZodString>;
|
|
||||||
createdAt: z.ZodUnion<[z.ZodDate, z.ZodString]>;
|
|
||||||
updatedAt: z.ZodUnion<[z.ZodDate, z.ZodString]>;
|
|
||||||
}, "strip", z.ZodTypeAny, {
|
|
||||||
status: "draft" | "active" | "closed" | "archived";
|
|
||||||
name: string;
|
|
||||||
id: string;
|
|
||||||
createdAt: string | Date;
|
|
||||||
updatedAt: string | Date;
|
|
||||||
dataroomId?: string | undefined;
|
|
||||||
}, {
|
|
||||||
status: "draft" | "active" | "closed" | "archived";
|
|
||||||
name: string;
|
|
||||||
id: string;
|
|
||||||
createdAt: string | Date;
|
|
||||||
updatedAt: string | Date;
|
|
||||||
dataroomId?: string | undefined;
|
|
||||||
}>;
|
|
||||||
export type Deal = z.infer<typeof DealSchema>;
|
|
||||||
export declare const CreateDealSchema: z.ZodObject<Omit<{
|
|
||||||
id: z.ZodString;
|
|
||||||
name: z.ZodString;
|
|
||||||
status: z.ZodEnum<["draft", "active", "closed", "archived"]>;
|
|
||||||
dataroomId: z.ZodOptional<z.ZodString>;
|
|
||||||
createdAt: z.ZodUnion<[z.ZodDate, z.ZodString]>;
|
|
||||||
updatedAt: z.ZodUnion<[z.ZodDate, z.ZodString]>;
|
|
||||||
}, "id" | "createdAt" | "updatedAt">, "strip", z.ZodTypeAny, {
|
|
||||||
status: "draft" | "active" | "closed" | "archived";
|
|
||||||
name: string;
|
|
||||||
dataroomId?: string | undefined;
|
|
||||||
}, {
|
|
||||||
status: "draft" | "active" | "closed" | "archived";
|
|
||||||
name: string;
|
|
||||||
dataroomId?: string | undefined;
|
|
||||||
}>;
|
|
||||||
export type CreateDeal = z.infer<typeof CreateDealSchema>;
|
|
||||||
//# sourceMappingURL=deal.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"deal.d.ts","sourceRoot":"","sources":["deal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB,sDAAoD,CAAC;AAElF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;EAOrB,CAAC;AAEH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9C,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;EAI3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
import { z } from 'zod';
|
|
||||||
export const DealStatusSchema = z.enum(['draft', 'active', 'closed', 'archived']);
|
|
||||||
export const DealSchema = z.object({
|
|
||||||
id: z.string().uuid(),
|
|
||||||
name: z.string().min(1),
|
|
||||||
status: DealStatusSchema,
|
|
||||||
dataroomId: z.string().uuid().optional(),
|
|
||||||
createdAt: z.date().or(z.string().datetime()),
|
|
||||||
updatedAt: z.date().or(z.string().datetime()),
|
|
||||||
});
|
|
||||||
export const CreateDealSchema = DealSchema.omit({
|
|
||||||
id: true,
|
|
||||||
createdAt: true,
|
|
||||||
updatedAt: true,
|
|
||||||
});
|
|
||||||
//# sourceMappingURL=deal.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"deal.js","sourceRoot":"","sources":["deal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,gBAAgB;IACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACxC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC7C,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;CAC9C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC;IAC9C,EAAE,EAAE,IAAI;IACR,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;CAChB,CAAC,CAAC"}
|
|
||||||
49
packages/schemas/src/document.d.ts
vendored
49
packages/schemas/src/document.d.ts
vendored
@@ -1,49 +0,0 @@
|
|||||||
import { z } from 'zod';
|
|
||||||
export declare const DocumentTypeSchema: z.ZodEnum<["legal", "treaty", "finance", "history"]>;
|
|
||||||
export declare const DocumentSchema: z.ZodObject<{
|
|
||||||
id: z.ZodString;
|
|
||||||
title: z.ZodString;
|
|
||||||
type: z.ZodEnum<["legal", "treaty", "finance", "history"]>;
|
|
||||||
content: z.ZodOptional<z.ZodString>;
|
|
||||||
fileUrl: z.ZodOptional<z.ZodString>;
|
|
||||||
createdAt: z.ZodUnion<[z.ZodDate, z.ZodString]>;
|
|
||||||
updatedAt: z.ZodUnion<[z.ZodDate, z.ZodString]>;
|
|
||||||
}, "strip", z.ZodTypeAny, {
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
type: "treaty" | "legal" | "finance" | "history";
|
|
||||||
createdAt: string | Date;
|
|
||||||
updatedAt: string | Date;
|
|
||||||
content?: string | undefined;
|
|
||||||
fileUrl?: string | undefined;
|
|
||||||
}, {
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
type: "treaty" | "legal" | "finance" | "history";
|
|
||||||
createdAt: string | Date;
|
|
||||||
updatedAt: string | Date;
|
|
||||||
content?: string | undefined;
|
|
||||||
fileUrl?: string | undefined;
|
|
||||||
}>;
|
|
||||||
export type Document = z.infer<typeof DocumentSchema>;
|
|
||||||
export declare const CreateDocumentSchema: z.ZodObject<Omit<{
|
|
||||||
id: z.ZodString;
|
|
||||||
title: z.ZodString;
|
|
||||||
type: z.ZodEnum<["legal", "treaty", "finance", "history"]>;
|
|
||||||
content: z.ZodOptional<z.ZodString>;
|
|
||||||
fileUrl: z.ZodOptional<z.ZodString>;
|
|
||||||
createdAt: z.ZodUnion<[z.ZodDate, z.ZodString]>;
|
|
||||||
updatedAt: z.ZodUnion<[z.ZodDate, z.ZodString]>;
|
|
||||||
}, "id" | "createdAt" | "updatedAt">, "strip", z.ZodTypeAny, {
|
|
||||||
title: string;
|
|
||||||
type: "treaty" | "legal" | "finance" | "history";
|
|
||||||
content?: string | undefined;
|
|
||||||
fileUrl?: string | undefined;
|
|
||||||
}, {
|
|
||||||
title: string;
|
|
||||||
type: "treaty" | "legal" | "finance" | "history";
|
|
||||||
content?: string | undefined;
|
|
||||||
fileUrl?: string | undefined;
|
|
||||||
}>;
|
|
||||||
export type CreateDocument = z.infer<typeof CreateDocumentSchema>;
|
|
||||||
//# sourceMappingURL=document.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB,sDAAoD,CAAC;AAEpF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;EAQzB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;EAI/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import { z } from 'zod';
|
|
||||||
export const DocumentTypeSchema = z.enum(['legal', 'treaty', 'finance', 'history']);
|
|
||||||
export const DocumentSchema = z.object({
|
|
||||||
id: z.string().uuid(),
|
|
||||||
title: z.string().min(1),
|
|
||||||
type: DocumentTypeSchema,
|
|
||||||
content: z.string().optional(),
|
|
||||||
fileUrl: z.string().url().optional(),
|
|
||||||
createdAt: z.date().or(z.string().datetime()),
|
|
||||||
updatedAt: z.date().or(z.string().datetime()),
|
|
||||||
});
|
|
||||||
export const CreateDocumentSchema = DocumentSchema.omit({
|
|
||||||
id: true,
|
|
||||||
createdAt: true,
|
|
||||||
updatedAt: true,
|
|
||||||
});
|
|
||||||
//# sourceMappingURL=document.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"document.js","sourceRoot":"","sources":["document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAEpF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACpC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC7C,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;CAC9C,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC,IAAI,CAAC;IACtD,EAAE,EAAE,IAAI;IACR,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;CAChB,CAAC,CAAC"}
|
|
||||||
1327
packages/schemas/src/eresidency.d.ts
vendored
1327
packages/schemas/src/eresidency.d.ts
vendored
File diff suppressed because it is too large
Load Diff
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"eresidency.d.ts","sourceRoot":"","sources":["eresidency.ts"],"names":[],"mappings":"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"}
|
|
||||||
@@ -1,315 +0,0 @@
|
|||||||
/**
|
|
||||||
* eResidency and eCitizenship Verifiable Credential Schemas
|
|
||||||
* Based on W3C Verifiable Credentials Data Model
|
|
||||||
* Version 0.9 - MVP Schema Registry
|
|
||||||
*/
|
|
||||||
import { z } from 'zod';
|
|
||||||
/**
|
|
||||||
* Levels of Assurance (LOA)
|
|
||||||
*/
|
|
||||||
export var LevelOfAssurance;
|
|
||||||
(function (LevelOfAssurance) {
|
|
||||||
LevelOfAssurance["LOA1"] = "LOA1";
|
|
||||||
LevelOfAssurance["LOA2"] = "LOA2";
|
|
||||||
LevelOfAssurance["LOA3"] = "LOA3";
|
|
||||||
})(LevelOfAssurance || (LevelOfAssurance = {}));
|
|
||||||
/**
|
|
||||||
* Membership Classes
|
|
||||||
*/
|
|
||||||
export var MembershipClass;
|
|
||||||
(function (MembershipClass) {
|
|
||||||
MembershipClass["RESIDENT"] = "Resident";
|
|
||||||
MembershipClass["CITIZEN"] = "Citizen";
|
|
||||||
MembershipClass["HONORARY"] = "Honorary";
|
|
||||||
MembershipClass["SERVICE"] = "Service";
|
|
||||||
})(MembershipClass || (MembershipClass = {}));
|
|
||||||
/**
|
|
||||||
* Evidence Types
|
|
||||||
*/
|
|
||||||
export var EvidenceType;
|
|
||||||
(function (EvidenceType) {
|
|
||||||
EvidenceType["DocumentVerification"] = "DocumentVerification";
|
|
||||||
EvidenceType["LivenessCheck"] = "LivenessCheck";
|
|
||||||
EvidenceType["SanctionsScreen"] = "SanctionsScreen";
|
|
||||||
EvidenceType["VideoInterview"] = "VideoInterview";
|
|
||||||
EvidenceType["Sponsorship"] = "Sponsorship";
|
|
||||||
EvidenceType["ResidencyTenure"] = "ResidencyTenure";
|
|
||||||
EvidenceType["BackgroundAttestation"] = "BackgroundAttestation";
|
|
||||||
})(EvidenceType || (EvidenceType = {}));
|
|
||||||
/**
|
|
||||||
* Evidence Result
|
|
||||||
*/
|
|
||||||
export var EvidenceResult;
|
|
||||||
(function (EvidenceResult) {
|
|
||||||
EvidenceResult["pass"] = "pass";
|
|
||||||
EvidenceResult["fail"] = "fail";
|
|
||||||
EvidenceResult["manual"] = "manual";
|
|
||||||
})(EvidenceResult || (EvidenceResult = {}));
|
|
||||||
/**
|
|
||||||
* eResident Credential Subject (v0.9)
|
|
||||||
* Matches DSB Schema Registry specification
|
|
||||||
*/
|
|
||||||
export const eResidentCredentialSubjectSchema = z.object({
|
|
||||||
id: z.string().describe('DID of the eResident'),
|
|
||||||
legalName: z.string().describe('Legal name of the eResident'),
|
|
||||||
publicHandle: z.string().optional().describe('Optional pseudonymous public handle'),
|
|
||||||
assuranceLevel: z.enum([LevelOfAssurance.LOA1, LevelOfAssurance.LOA2]).describe('Level of Assurance'),
|
|
||||||
residentNumber: z.string().describe('Unique resident number'),
|
|
||||||
issueJurisdiction: z.literal('DSB').describe('Issuing jurisdiction'),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* eCitizen Credential Subject (v0.9)
|
|
||||||
* Matches DSB Schema Registry specification
|
|
||||||
*/
|
|
||||||
export const eCitizenCredentialSubjectSchema = z.object({
|
|
||||||
id: z.string().describe('DID of the eCitizen'),
|
|
||||||
citizenNumber: z.string().describe('Unique citizen number'),
|
|
||||||
assuranceLevel: z.enum([LevelOfAssurance.LOA2, LevelOfAssurance.LOA3]).describe('Level of Assurance (minimum LOA2)'),
|
|
||||||
oathDate: z.string().describe('ISO 8601 date when oath was taken'),
|
|
||||||
governanceRights: z.array(z.string()).optional().describe('Governance rights granted'),
|
|
||||||
sponsoringMember: z.string().optional().describe('DID of the sponsoring member if applicable'),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* Evidence Schema
|
|
||||||
*/
|
|
||||||
export const evidenceSchema = z.object({
|
|
||||||
type: z.nativeEnum(EvidenceType),
|
|
||||||
verifier: z.string().optional().describe('DID or identifier of the verifier'),
|
|
||||||
txn: z.string().optional().describe('Transaction ID or reference'),
|
|
||||||
result: z.nativeEnum(EvidenceResult),
|
|
||||||
timestamp: z.string().optional().describe('ISO 8601 timestamp of the evidence'),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* Address Attestation Credential Subject
|
|
||||||
*/
|
|
||||||
export const addressAttestationCredentialSubjectSchema = z.object({
|
|
||||||
id: z.string().describe('DID of the subject'),
|
|
||||||
address: z.object({
|
|
||||||
street: z.string(),
|
|
||||||
city: z.string(),
|
|
||||||
region: z.string().optional(),
|
|
||||||
postalCode: z.string(),
|
|
||||||
country: z.string(),
|
|
||||||
}),
|
|
||||||
attestedSince: z.string().describe('ISO 8601 date when address was attested'),
|
|
||||||
attestedUntil: z.string().optional().describe('ISO 8601 date when attestation expires'),
|
|
||||||
attestedBy: z.string().describe('DID of the attesting authority'),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* Good Standing Credential Subject
|
|
||||||
*/
|
|
||||||
export const goodStandingCredentialSubjectSchema = z.object({
|
|
||||||
id: z.string().describe('DID of the subject'),
|
|
||||||
membershipClass: z.nativeEnum(MembershipClass),
|
|
||||||
goodStanding: z.boolean(),
|
|
||||||
verifiedSince: z.string().describe('ISO 8601 date when good standing was verified'),
|
|
||||||
verifiedUntil: z.string().optional().describe('ISO 8601 date when verification expires'),
|
|
||||||
complianceChecks: z
|
|
||||||
.array(z.object({
|
|
||||||
check: z.string(),
|
|
||||||
passed: z.boolean(),
|
|
||||||
checkedAt: z.string(),
|
|
||||||
}))
|
|
||||||
.optional(),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* Professional Order Credential Subject
|
|
||||||
*/
|
|
||||||
export const professionalOrderCredentialSubjectSchema = z.object({
|
|
||||||
id: z.string().describe('DID of the subject'),
|
|
||||||
order: z.string().describe('Name of the professional order'),
|
|
||||||
role: z.string().describe('Role within the order'),
|
|
||||||
membershipSince: z.string().describe('ISO 8601 date when membership began'),
|
|
||||||
membershipUntil: z.string().optional().describe('ISO 8601 date when membership expires'),
|
|
||||||
credentials: z.array(z.string()).optional().describe('Professional credentials held'),
|
|
||||||
status: z.enum(['active', 'suspended', 'revoked', 'expired']),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* eResident Credential Schema (v0.9)
|
|
||||||
* Matches DSB Schema Registry specification
|
|
||||||
*/
|
|
||||||
export const eResidentCredentialSchema = z.object({
|
|
||||||
'@context': z.array(z.string()).min(1),
|
|
||||||
type: z.array(z.string()).refine((arr) => arr.includes('VerifiableCredential') && arr.includes('eResidentCredential'), {
|
|
||||||
message: 'Type must include VerifiableCredential and eResidentCredential',
|
|
||||||
}),
|
|
||||||
issuer: z.string().describe('DID of the issuing authority'),
|
|
||||||
issuanceDate: z.string().describe('ISO 8601 date when credential was issued'),
|
|
||||||
expirationDate: z.string().optional().describe('ISO 8601 date when credential expires'),
|
|
||||||
credentialSubject: eResidentCredentialSubjectSchema,
|
|
||||||
credentialStatus: z
|
|
||||||
.object({
|
|
||||||
id: z.string(),
|
|
||||||
type: z.string(),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
evidence: z.array(evidenceSchema).optional().describe('Evidence supporting the credential'),
|
|
||||||
proof: z.object({
|
|
||||||
type: z.string(),
|
|
||||||
created: z.string(),
|
|
||||||
proofPurpose: z.string(),
|
|
||||||
verificationMethod: z.string(),
|
|
||||||
jws: z.string().optional(),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* eCitizen Credential Schema (v0.9)
|
|
||||||
* Matches DSB Schema Registry specification
|
|
||||||
*/
|
|
||||||
export const eCitizenCredentialSchema = z.object({
|
|
||||||
'@context': z.array(z.string()).min(1),
|
|
||||||
type: z.array(z.string()).refine((arr) => arr.includes('VerifiableCredential') && arr.includes('eCitizenCredential'), {
|
|
||||||
message: 'Type must include VerifiableCredential and eCitizenCredential',
|
|
||||||
}),
|
|
||||||
issuer: z.string().describe('DID of the issuing authority'),
|
|
||||||
issuanceDate: z.string().describe('ISO 8601 date when credential was issued'),
|
|
||||||
expirationDate: z.string().optional().describe('ISO 8601 date when credential expires'),
|
|
||||||
credentialSubject: eCitizenCredentialSubjectSchema,
|
|
||||||
credentialStatus: z
|
|
||||||
.object({
|
|
||||||
id: z.string(),
|
|
||||||
type: z.string(),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
evidence: z.array(evidenceSchema).optional().describe('Evidence supporting the credential'),
|
|
||||||
proof: z.object({
|
|
||||||
type: z.string(),
|
|
||||||
created: z.string(),
|
|
||||||
proofPurpose: z.string(),
|
|
||||||
verificationMethod: z.string(),
|
|
||||||
jws: z.string().optional(),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* Verifiable Presentation Schema
|
|
||||||
*/
|
|
||||||
export const verifiablePresentationSchema = z.object({
|
|
||||||
'@context': z.array(z.string()).min(1),
|
|
||||||
type: z.array(z.string()).refine((arr) => arr.includes('VerifiablePresentation'), {
|
|
||||||
message: 'Type must include VerifiablePresentation',
|
|
||||||
}),
|
|
||||||
verifiableCredential: z.array(z.union([eResidentCredentialSchema, eCitizenCredentialSchema])).min(1),
|
|
||||||
holder: z.string().describe('DID of the holder'),
|
|
||||||
proof: z.object({
|
|
||||||
type: z.string(),
|
|
||||||
created: z.string(),
|
|
||||||
challenge: z.string().optional(),
|
|
||||||
proofPurpose: z.string(),
|
|
||||||
verificationMethod: z.string(),
|
|
||||||
jws: z.string().optional(),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* Application Status
|
|
||||||
*/
|
|
||||||
export var ApplicationStatus;
|
|
||||||
(function (ApplicationStatus) {
|
|
||||||
ApplicationStatus["DRAFT"] = "draft";
|
|
||||||
ApplicationStatus["SUBMITTED"] = "submitted";
|
|
||||||
ApplicationStatus["UNDER_REVIEW"] = "under_review";
|
|
||||||
ApplicationStatus["KYC_PENDING"] = "kyc_pending";
|
|
||||||
ApplicationStatus["APPROVED"] = "approved";
|
|
||||||
ApplicationStatus["REJECTED"] = "rejected";
|
|
||||||
ApplicationStatus["APPEALED"] = "appealed";
|
|
||||||
ApplicationStatus["CANCELLED"] = "cancelled";
|
|
||||||
})(ApplicationStatus || (ApplicationStatus = {}));
|
|
||||||
/**
|
|
||||||
* eResidency Application Schema
|
|
||||||
*/
|
|
||||||
export const eResidencyApplicationSchema = z.object({
|
|
||||||
id: z.string().uuid(),
|
|
||||||
applicantDid: z.string().optional(),
|
|
||||||
email: z.string().email(),
|
|
||||||
givenName: z.string(),
|
|
||||||
familyName: z.string(),
|
|
||||||
dateOfBirth: z.string().optional(),
|
|
||||||
nationality: z.string().optional(),
|
|
||||||
phone: z.string().optional(),
|
|
||||||
address: z
|
|
||||||
.object({
|
|
||||||
street: z.string().optional(),
|
|
||||||
city: z.string().optional(),
|
|
||||||
region: z.string().optional(),
|
|
||||||
postalCode: z.string().optional(),
|
|
||||||
country: z.string().optional(),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
deviceFingerprint: z.string().optional(),
|
|
||||||
identityDocument: z
|
|
||||||
.object({
|
|
||||||
type: z.enum(['passport', 'national_id', 'drivers_license']),
|
|
||||||
number: z.string(),
|
|
||||||
issuingCountry: z.string(),
|
|
||||||
expiryDate: z.string().optional(),
|
|
||||||
documentHash: z.string().optional(),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
selfieLiveness: z
|
|
||||||
.object({
|
|
||||||
imageHash: z.string(),
|
|
||||||
livenessScore: z.number().min(0).max(1),
|
|
||||||
verifiedAt: z.string(),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
status: z.nativeEnum(ApplicationStatus),
|
|
||||||
submittedAt: z.string().optional(),
|
|
||||||
reviewedAt: z.string().optional(),
|
|
||||||
reviewedBy: z.string().optional(),
|
|
||||||
rejectionReason: z.string().optional(),
|
|
||||||
kycStatus: z.enum(['pending', 'passed', 'failed', 'requires_edd']).optional(),
|
|
||||||
sanctionsStatus: z.enum(['pending', 'clear', 'flag']).optional(),
|
|
||||||
pepStatus: z.enum(['pending', 'clear', 'flag']).optional(),
|
|
||||||
riskScore: z.number().min(0).max(1).optional(),
|
|
||||||
kycResults: z.record(z.unknown()).optional(),
|
|
||||||
sanctionsResults: z.record(z.unknown()).optional(),
|
|
||||||
riskAssessment: z.record(z.unknown()).optional(),
|
|
||||||
createdAt: z.string(),
|
|
||||||
updatedAt: z.string(),
|
|
||||||
});
|
|
||||||
/**
|
|
||||||
* eCitizenship Application Schema
|
|
||||||
*/
|
|
||||||
export const eCitizenshipApplicationSchema = z.object({
|
|
||||||
id: z.string().uuid(),
|
|
||||||
applicantDid: z.string(),
|
|
||||||
residentDid: z.string().describe('DID of the eResident applying for citizenship'),
|
|
||||||
residencyTenure: z.number().describe('Months as eResident'),
|
|
||||||
sponsorDid: z.string().optional().describe('DID of the sponsor if applicable'),
|
|
||||||
serviceMerit: z
|
|
||||||
.object({
|
|
||||||
serviceHours: z.number(),
|
|
||||||
contributions: z.array(z.string()),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
videoInterview: z
|
|
||||||
.object({
|
|
||||||
scheduledAt: z.string().optional(),
|
|
||||||
completedAt: z.string().optional(),
|
|
||||||
recordingHash: z.string().optional(),
|
|
||||||
interviewerDid: z.string().optional(),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
backgroundAttestations: z
|
|
||||||
.array(z.object({
|
|
||||||
attesterDid: z.string(),
|
|
||||||
attestation: z.string(),
|
|
||||||
attestedAt: z.string(),
|
|
||||||
}))
|
|
||||||
.optional(),
|
|
||||||
oathCeremony: z
|
|
||||||
.object({
|
|
||||||
scheduledAt: z.string().optional(),
|
|
||||||
completedAt: z.string().optional(),
|
|
||||||
ceremonyHash: z.string().optional(),
|
|
||||||
oathVersion: z.string().optional(),
|
|
||||||
})
|
|
||||||
.optional(),
|
|
||||||
status: z.nativeEnum(ApplicationStatus),
|
|
||||||
submittedAt: z.string().optional(),
|
|
||||||
reviewedAt: z.string().optional(),
|
|
||||||
reviewedBy: z.string().optional(),
|
|
||||||
rejectionReason: z.string().optional(),
|
|
||||||
createdAt: z.string(),
|
|
||||||
updatedAt: z.string(),
|
|
||||||
});
|
|
||||||
//# sourceMappingURL=eresidency.js.map
|
|
||||||
File diff suppressed because one or more lines are too long
11
packages/schemas/src/index.d.ts
vendored
11
packages/schemas/src/index.d.ts
vendored
@@ -1,11 +0,0 @@
|
|||||||
/**
|
|
||||||
* The Order Schemas
|
|
||||||
*/
|
|
||||||
export * from './user';
|
|
||||||
export * from './document';
|
|
||||||
export * from './deal';
|
|
||||||
export * from './vc';
|
|
||||||
export * from './payment';
|
|
||||||
export * from './ledger';
|
|
||||||
export * from './eresidency';
|
|
||||||
//# sourceMappingURL=index.d.ts.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
/**
|
|
||||||
* The Order Schemas
|
|
||||||
*/
|
|
||||||
export * from './user';
|
|
||||||
export * from './document';
|
|
||||||
export * from './deal';
|
|
||||||
export * from './vc';
|
|
||||||
export * from './payment';
|
|
||||||
export * from './ledger';
|
|
||||||
export * from './eresidency';
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
|
|
||||||
@@ -9,4 +9,4 @@ export * from './vc';
|
|||||||
export * from './payment';
|
export * from './payment';
|
||||||
export * from './ledger';
|
export * from './ledger';
|
||||||
export * from './eresidency';
|
export * from './eresidency';
|
||||||
|
export * from './btc-basket';
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user