@dalmore/api-contracts 1.0.5 → 1.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -5
- package/src/common/types/account-contact.types.ts +98 -0
- package/src/common/types/account-detail.types.ts +27 -0
- package/src/common/types/account-integration.types.ts +143 -0
- package/src/common/types/account-manager.types.ts +124 -0
- package/src/common/types/account.types.ts +296 -0
- package/src/common/types/activity.types.ts +274 -0
- package/src/common/types/address.spec.ts +203 -0
- package/src/common/types/address.types.ts +41 -0
- package/src/common/types/aic.types.ts +246 -0
- package/src/common/types/aml.types.ts +18 -0
- package/src/common/types/api-key-logs.types.ts +66 -0
- package/src/common/types/api-keys.types.ts +69 -0
- package/src/common/types/asset.types.ts +338 -0
- package/src/common/types/auth.types.ts +370 -0
- package/src/common/types/batch-jobs.types.ts +151 -0
- package/src/common/types/bonus-tier.types.ts +147 -0
- package/src/common/types/cart.types.ts +18 -0
- package/src/common/types/checklist-items.types.ts +70 -0
- package/src/common/types/checklist.types.ts +97 -0
- package/src/common/types/common.types.spec.ts +336 -0
- package/src/common/types/common.types.ts +1520 -0
- package/src/common/types/comply-advantage-api.types.ts +316 -0
- package/src/common/types/comply-advantage.types.ts +25 -0
- package/src/common/types/contact-us.types.ts +107 -0
- package/src/common/types/contract-helpers.ts +205 -0
- package/src/common/types/countries.types.ts +375 -0
- package/src/common/types/covered-person.types.ts +274 -0
- package/src/common/types/dashboard.types.ts +799 -0
- package/src/common/types/data-record.types.ts +325 -0
- package/src/common/types/data-room.types.ts +242 -0
- package/src/common/types/default-theme-config.types.ts +87 -0
- package/src/common/types/disbursement-adjustment.types.ts +32 -0
- package/src/common/types/disbursement-approval-user.types.ts +100 -0
- package/src/common/types/disbursement-review.types.ts +110 -0
- package/src/common/types/disbursement-transaction.types.ts +72 -0
- package/src/common/types/disbursements.types.ts +310 -0
- package/src/common/types/domain-filter.types.ts +55 -0
- package/src/common/types/email-theme.types.ts +442 -0
- package/src/common/types/entity.types.ts +15 -0
- package/src/common/types/error-responses.types.ts +135 -0
- package/src/common/types/escrow-account.types.ts +104 -0
- package/src/common/types/exchange-api-key.types.ts +121 -0
- package/src/common/types/exchange-import.types.ts +36 -0
- package/src/common/types/exchange-provider.types.ts +329 -0
- package/src/common/types/file.types.ts +461 -0
- package/src/common/types/files.types.spec.ts +154 -0
- package/src/common/types/health.types.ts +29 -0
- package/src/common/types/index.ts +48 -0
- package/src/common/types/individuals.types.ts +554 -0
- package/src/common/types/investor-account.types.ts +1239 -0
- package/src/common/types/investorAccountIdSchema.type.ts +0 -0
- package/src/common/types/investors-offering.types.ts +65 -0
- package/src/common/types/invite.types.ts +133 -0
- package/src/common/types/issuer-bank-account.types.ts +107 -0
- package/src/common/types/issuer-offering.types.ts +306 -0
- package/src/common/types/issuer-payment-method.types.spec.ts +612 -0
- package/src/common/types/issuer-payment-method.types.ts +341 -0
- package/src/common/types/issuer.types.ts +312 -0
- package/src/common/types/job-item.types.ts +119 -0
- package/src/common/types/jobs.types.ts +171 -0
- package/src/common/types/kyb.types.ts +53 -0
- package/src/common/types/kyc.types.ts +188 -0
- package/src/common/types/legal-entity.types.ts +185 -0
- package/src/common/types/login-history.types.ts +46 -0
- package/src/common/types/mail-template.types.ts +436 -0
- package/src/common/types/north-cap-integration.types.ts +190 -0
- package/src/common/types/note.types.ts +109 -0
- package/src/common/types/notification.types.ts +58 -0
- package/src/common/types/notion-api.types.ts +374 -0
- package/src/common/types/notion-database.types.ts +125 -0
- package/src/common/types/notion-page.types.ts +267 -0
- package/src/common/types/offering-reports.types.ts +153 -0
- package/src/common/types/offering-submission.types.ts +314 -0
- package/src/common/types/offering.types.spec.ts +91 -0
- package/src/common/types/offering.types.ts +590 -0
- package/src/common/types/page-revision.types.ts +86 -0
- package/src/common/types/page.types.ts +436 -0
- package/src/common/types/password.type.ts +15 -0
- package/src/common/types/payment-methods.types.ts +298 -0
- package/src/common/types/phone.spec.ts +76 -0
- package/src/common/types/phone.type.ts +27 -0
- package/src/common/types/portfolio.types.ts +50 -0
- package/src/common/types/privacy-policy-and-tos.types.ts +231 -0
- package/src/common/types/queue.types.ts +112 -0
- package/src/common/types/registered-reps.types.ts +25 -0
- package/src/common/types/rejection-reasons.types.ts +56 -0
- package/src/common/types/reminder-config.types.ts +40 -0
- package/src/common/types/review.types.ts +133 -0
- package/src/common/types/role.types.ts +26 -0
- package/src/common/types/secondary-customer.types.ts +66 -0
- package/src/common/types/secondary-issuer.types.ts +50 -0
- package/src/common/types/secondary-order.types.ts +58 -0
- package/src/common/types/secondary-security.types.ts +60 -0
- package/src/common/types/secondary-trade.entity.ts +16 -0
- package/src/common/types/secondary-trade.types.ts +95 -0
- package/src/common/types/secure-request.types.ts +68 -0
- package/src/common/types/signer.types.ts +651 -0
- package/src/common/types/site-link.types.spec.ts +134 -0
- package/src/common/types/site-link.types.ts +166 -0
- package/src/common/types/site-settings.types.ts +726 -0
- package/src/common/types/site.types.ts +270 -0
- package/src/common/types/sms.types.ts +30 -0
- package/src/common/types/state-machine.types.ts +177 -0
- package/src/common/types/states.types.ts +163 -0
- package/src/common/types/subdoc-preview.types.ts +35 -0
- package/src/common/types/task.types.ts +258 -0
- package/src/common/types/trade-adjustment.type.ts +33 -0
- package/src/common/types/trade-line-item.type.ts +132 -0
- package/src/common/types/trade.types.ts +929 -0
- package/src/common/types/transaction.types.ts +198 -0
- package/src/common/types/trusted-contact.types.ts +122 -0
- package/src/common/types/typography.types.ts +75 -0
- package/src/common/types/user-manual.types.ts +290 -0
- package/src/common/types/user-setting.types.ts +133 -0
- package/src/common/types/user.types.ts +320 -0
- package/src/common/types/webhook.types.ts +588 -0
- package/src/common/types/zip.type.ts +36 -0
- package/src/contracts/clients/accounts/index.ts +61 -0
- package/src/contracts/clients/aic/index.ts +59 -0
- package/src/contracts/clients/api-key-logs/index.ts +53 -0
- package/src/contracts/clients/api-keys/index.ts +73 -0
- package/src/contracts/clients/assets/index.ts +102 -0
- package/src/contracts/clients/auth/index.ts +50 -0
- package/src/contracts/clients/files/index.ts +166 -0
- package/src/contracts/clients/files-public/index.ts +166 -0
- package/src/contracts/clients/index.ts +44 -0
- package/src/contracts/clients/individuals/index.ts +93 -0
- package/src/contracts/clients/investor-accounts/index.ts +93 -0
- package/src/contracts/clients/issuers/index.ts +94 -0
- package/src/contracts/clients/legal-entities/index.ts +93 -0
- package/src/contracts/clients/offerings/index.ts +117 -0
- package/src/contracts/clients/secure-requests/index.ts +34 -0
- package/src/contracts/clients/sites/index.ts +56 -0
- package/src/contracts/clients/trades/index.ts +122 -0
- package/index.d.mts +0 -17
- package/index.d.ts +0 -17
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { extendZodWithOpenApi } from '@anatine/zod-openapi';
|
|
2
|
+
import { TypeID } from 'typeid-js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import {
|
|
5
|
+
IPaginationMeta,
|
|
6
|
+
TargetTableConfig,
|
|
7
|
+
TargetTableEnum,
|
|
8
|
+
} from './common.types';
|
|
9
|
+
import { accountIdSchema } from './account.types';
|
|
10
|
+
import { IBaseEntity } from './entity.types';
|
|
11
|
+
import { batchJobIdSchema } from './batch-jobs.types';
|
|
12
|
+
|
|
13
|
+
extendZodWithOpenApi(z);
|
|
14
|
+
|
|
15
|
+
export enum JobItemStatus {
|
|
16
|
+
PENDING = 'PENDING',
|
|
17
|
+
IN_PROGRESS = 'IN_PROGRESS',
|
|
18
|
+
COMPLETED = 'COMPLETED',
|
|
19
|
+
FAILED = 'FAILED',
|
|
20
|
+
APPROVED = 'APPROVED',
|
|
21
|
+
REJECTED = 'REJECTED',
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const JobItemIdSchema = z.string().refine(
|
|
25
|
+
(value) => {
|
|
26
|
+
try {
|
|
27
|
+
const tid = TypeID.fromString(value);
|
|
28
|
+
return tid.getType() === 'job_item';
|
|
29
|
+
} catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
message:
|
|
35
|
+
'Invalid job item ID format. Must be a valid TypeID with "job_item" prefix.',
|
|
36
|
+
},
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
export const CreateJobItemZod = z.object({
|
|
40
|
+
targetTable: z.enum(TargetTableEnum),
|
|
41
|
+
bullJobId: z.string(),
|
|
42
|
+
accountId: accountIdSchema,
|
|
43
|
+
batchJobId: batchJobIdSchema,
|
|
44
|
+
targetId: z.string().refine(
|
|
45
|
+
(value) => {
|
|
46
|
+
try {
|
|
47
|
+
const tid = TypeID.fromString(value);
|
|
48
|
+
return Object.values(TargetTableConfig).some(
|
|
49
|
+
(config) => config.idPrefix === tid.getType(),
|
|
50
|
+
);
|
|
51
|
+
} catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
message: `Invalid target ID format. Must match the corresponding table's ID prefix. Valid prefix: ${TargetTableEnum.toString().toLowerCase()}. Example: disbursement_01j6aqmtfyfwy9spjdcnh7yqk7`,
|
|
57
|
+
},
|
|
58
|
+
),
|
|
59
|
+
});
|
|
60
|
+
export type CreateJobItemZod = z.infer<typeof CreateJobItemZod>;
|
|
61
|
+
|
|
62
|
+
export const JobItemZod = IBaseEntity.extend({
|
|
63
|
+
id: JobItemIdSchema,
|
|
64
|
+
targetTable: z.enum(TargetTableEnum),
|
|
65
|
+
bullJobId: z.string(),
|
|
66
|
+
accountId: accountIdSchema,
|
|
67
|
+
batchJobId: batchJobIdSchema,
|
|
68
|
+
targetId: z.string(),
|
|
69
|
+
status: z.nativeEnum(JobItemStatus),
|
|
70
|
+
errorMessage: z.string().optional().nullable(),
|
|
71
|
+
processedAt: z.date().optional().nullable(),
|
|
72
|
+
});
|
|
73
|
+
export type JobItemZod = z.infer<typeof JobItemZod>;
|
|
74
|
+
export const IPaginatedJobItem = z.object({
|
|
75
|
+
items: z.array(JobItemZod),
|
|
76
|
+
meta: IPaginationMeta,
|
|
77
|
+
});
|
|
78
|
+
export type IPaginatedJobItem = z.infer<typeof IPaginatedJobItem>;
|
|
79
|
+
|
|
80
|
+
export const JobItemFiltersZod = z.object({
|
|
81
|
+
targetTable: z.enum(TargetTableEnum).optional(),
|
|
82
|
+
status: z.nativeEnum(JobItemStatus).optional(),
|
|
83
|
+
batchJobId: batchJobIdSchema.optional(),
|
|
84
|
+
targetId: z.string().optional(),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const jobItemsInclude = z.enum(['account', 'batchJob']);
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* @description Query parameters for including related entities
|
|
91
|
+
* @xample in contract us as -> query: z.object({}).merge(AccountsIncludeQuery),
|
|
92
|
+
*/
|
|
93
|
+
export const JobItemsIncludeQuery = z.object({
|
|
94
|
+
include: z
|
|
95
|
+
.string()
|
|
96
|
+
.optional()
|
|
97
|
+
.transform((str) => (str ? str.split(',') : []))
|
|
98
|
+
.refine(
|
|
99
|
+
(includes) =>
|
|
100
|
+
includes.every((include) =>
|
|
101
|
+
jobItemsInclude.options.includes(include as any),
|
|
102
|
+
),
|
|
103
|
+
{
|
|
104
|
+
message: `Invalid include option provided. Valid options are: ${jobItemsInclude.options.join(',')}`,
|
|
105
|
+
},
|
|
106
|
+
)
|
|
107
|
+
.openapi({
|
|
108
|
+
example: `${jobItemsInclude.options.join(',')}`,
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
export interface JobItemsIncludeQuery
|
|
112
|
+
extends z.infer<typeof JobItemsIncludeQuery> {}
|
|
113
|
+
|
|
114
|
+
export const PatchJobItemZod = z.object({
|
|
115
|
+
status: z.nativeEnum(JobItemStatus),
|
|
116
|
+
errorMessage: z.string().optional(),
|
|
117
|
+
processedAt: z.date().optional(),
|
|
118
|
+
});
|
|
119
|
+
export type PatchJobItemZod = z.infer<typeof PatchJobItemZod>;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { TypeID } from 'typeid-js';
|
|
3
|
+
import { extendZodWithOpenApi } from '@anatine/zod-openapi';
|
|
4
|
+
import { tradeIdSchema } from './trade.types';
|
|
5
|
+
extendZodWithOpenApi(z);
|
|
6
|
+
|
|
7
|
+
export enum JobNames {
|
|
8
|
+
SUBSCRIPTION_AGREEMENT = 'SUBSCRIPTION_AGREEMENT',
|
|
9
|
+
CHECK_INVESTOR = 'CHECK_INVESTOR',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// type of the data source
|
|
13
|
+
export enum SourceType {
|
|
14
|
+
TRADES = 'trades',
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// lower case to match the database table names
|
|
18
|
+
export enum TargetTables {
|
|
19
|
+
TRADES = 'trades',
|
|
20
|
+
INVESTOR_ACCOUNTS = 'investor_accounts',
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export enum TargetIdPrefix {
|
|
24
|
+
TRADE = 'trade',
|
|
25
|
+
INVESTOR_ACCOUNT = 'investor_account',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// lower case to match the database column names
|
|
29
|
+
export enum TargeFields {
|
|
30
|
+
SA_CHECK = 'sa_check',
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export enum TargetLogFields {
|
|
34
|
+
SA_LOG = 'sa_log',
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export enum TargetTimeStamps {
|
|
38
|
+
SA_CHECKED_AT = 'sa_checked_at',
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// camelCase to match the database column names as they come back from the entity
|
|
42
|
+
export enum ValueFields {
|
|
43
|
+
SA_STATUS = 'saStatus',
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export enum PassValue {
|
|
47
|
+
APPROVED = 'APPROVED',
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export enum FailValue {
|
|
51
|
+
PENDING = 'PENDING',
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export enum Method {
|
|
55
|
+
SCHEDULE = 'SCHEDULE',
|
|
56
|
+
MANUAL = 'MANUAL',
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export enum CheckType {
|
|
60
|
+
COMPARE = 'COMPARE',
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Define the allowed ID types
|
|
64
|
+
const allowedIdTypes = ['trade', 'offering', 'investor_account'] as const;
|
|
65
|
+
export type JobAllowedIdType = (typeof allowedIdTypes)[number];
|
|
66
|
+
|
|
67
|
+
// Create a schema for validating TypeIDs
|
|
68
|
+
const typeIdSchema = (allowedTypes: readonly string[]) =>
|
|
69
|
+
z.string().refine(
|
|
70
|
+
(value) => {
|
|
71
|
+
try {
|
|
72
|
+
const tid = TypeID.fromString(value);
|
|
73
|
+
return allowedTypes.includes(tid.getType());
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
message: `Invalid ID format. Must be a valid TypeID with one of these prefixes: ${allowedTypes.join(', ')}.`,
|
|
80
|
+
},
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
export const DataSchema = z.object({
|
|
84
|
+
expected: z.array(z.string()),
|
|
85
|
+
});
|
|
86
|
+
export type Data = z.infer<typeof DataSchema>;
|
|
87
|
+
|
|
88
|
+
export const CheckSchema = z.object({
|
|
89
|
+
name: z.string(),
|
|
90
|
+
type: z.nativeEnum(CheckType),
|
|
91
|
+
required: z.boolean(),
|
|
92
|
+
valueField: z.nativeEnum(ValueFields),
|
|
93
|
+
message: z.string(),
|
|
94
|
+
data: DataSchema,
|
|
95
|
+
});
|
|
96
|
+
export type Check = z.infer<typeof CheckSchema>;
|
|
97
|
+
|
|
98
|
+
export const ConfigurationSchema = z.object({
|
|
99
|
+
name: z.nativeEnum(JobNames),
|
|
100
|
+
sourceType: z.nativeEnum(SourceType),
|
|
101
|
+
source: z.string(),
|
|
102
|
+
targetTable: z.nativeEnum(TargetTables),
|
|
103
|
+
targetIdPrefix: z.nativeEnum(TargetIdPrefix),
|
|
104
|
+
targetField: z.nativeEnum(TargeFields),
|
|
105
|
+
targetLogField: z.nativeEnum(TargetLogFields),
|
|
106
|
+
targetTimeStamp: z.nativeEnum(TargetTimeStamps),
|
|
107
|
+
passValue: z.nativeEnum(PassValue),
|
|
108
|
+
failValue: z.nativeEnum(FailValue),
|
|
109
|
+
checks: z.array(CheckSchema),
|
|
110
|
+
});
|
|
111
|
+
export type Configuration = z.infer<typeof ConfigurationSchema>;
|
|
112
|
+
|
|
113
|
+
export const JobParamsSchema = z.object({
|
|
114
|
+
method: z.nativeEnum(Method),
|
|
115
|
+
names: z
|
|
116
|
+
.array(z.nativeEnum(JobNames))
|
|
117
|
+
.min(1, 'At least one name is required')
|
|
118
|
+
.max(50, 'Maximum of 50 names allowed')
|
|
119
|
+
.openapi({
|
|
120
|
+
example: ['SUBSCRIPTION_AGREEMENT'],
|
|
121
|
+
}),
|
|
122
|
+
ids: z
|
|
123
|
+
.array(typeIdSchema(allowedIdTypes))
|
|
124
|
+
.max(50, 'Maximum of 50 IDs allowed')
|
|
125
|
+
.openapi({
|
|
126
|
+
example: [
|
|
127
|
+
'trade_01j5ty4wbpe1zb171d02tqz9x6',
|
|
128
|
+
'offering_01j5ty4wbgfxqsp1sgaspaqaye',
|
|
129
|
+
],
|
|
130
|
+
}),
|
|
131
|
+
});
|
|
132
|
+
export type JobParams = z.infer<typeof JobParamsSchema>;
|
|
133
|
+
|
|
134
|
+
export const CheckInvestorParamsSchema = z.object({
|
|
135
|
+
method: z.nativeEnum(Method),
|
|
136
|
+
names: z
|
|
137
|
+
.array(z.nativeEnum(TargetIdPrefix))
|
|
138
|
+
.min(1, 'At least one name is required')
|
|
139
|
+
.max(50, 'Maximum of 50 names allowed')
|
|
140
|
+
.openapi({
|
|
141
|
+
example: ['investor_account'],
|
|
142
|
+
}),
|
|
143
|
+
ids: z
|
|
144
|
+
.array(typeIdSchema(allowedIdTypes))
|
|
145
|
+
.max(50, 'Maximum of 50 IDs allowed')
|
|
146
|
+
.openapi({
|
|
147
|
+
example: ['investor_account_01j9kqb7sce108yhpvth20a5w1'],
|
|
148
|
+
}),
|
|
149
|
+
});
|
|
150
|
+
export type CheckInvestorParams = z.infer<typeof CheckInvestorParamsSchema>;
|
|
151
|
+
|
|
152
|
+
export const CheckResultLogSchema = z.object({
|
|
153
|
+
name: z.string(),
|
|
154
|
+
type: z.nativeEnum(CheckType),
|
|
155
|
+
message: z.string().nullable(),
|
|
156
|
+
data: DataSchema,
|
|
157
|
+
result: z.boolean(),
|
|
158
|
+
});
|
|
159
|
+
export type CheckResultLog = z.infer<typeof CheckResultLogSchema>;
|
|
160
|
+
|
|
161
|
+
export const CheckResultSchema = z.object({
|
|
162
|
+
name: z.string(),
|
|
163
|
+
pass: z.boolean(),
|
|
164
|
+
logs: z.array(CheckResultLogSchema),
|
|
165
|
+
});
|
|
166
|
+
export type CheckResult = z.infer<typeof CheckResultSchema>;
|
|
167
|
+
|
|
168
|
+
export const QueueTradeSaLogSchema = z.object({
|
|
169
|
+
tradeIds: z.lazy(() => z.array(tradeIdSchema).min(1).max(50)),
|
|
170
|
+
});
|
|
171
|
+
export type QueueTradeSaLog = z.infer<typeof QueueTradeSaLogSchema>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { IBaseEntity } from './entity.types';
|
|
3
|
+
import { IPaginationMeta, KYBStatus } from './common.types';
|
|
4
|
+
import { extendZodWithOpenApi } from '@anatine/zod-openapi';
|
|
5
|
+
import { TypeID } from 'typeid-js';
|
|
6
|
+
extendZodWithOpenApi(z);
|
|
7
|
+
|
|
8
|
+
export const kybIdSchema = z.string().refine(
|
|
9
|
+
(value) => {
|
|
10
|
+
try {
|
|
11
|
+
const tid = TypeID.fromString(value);
|
|
12
|
+
return tid.getType() === 'kyb';
|
|
13
|
+
} catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
message: 'Invalid kyb ID format. Must be a valid TypeID with "kyb" prefix.',
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export const KybZod = IBaseEntity.extend({
|
|
23
|
+
thirdPartyId: z.string().openapi({ example: 'third_party_kyb_123' }),
|
|
24
|
+
platform: z.string().openapi({ example: 'KYB Platform' }),
|
|
25
|
+
legalEntityId: z
|
|
26
|
+
.string()
|
|
27
|
+
.openapi({ example: 'legal_entity_01j1xgme5qeqq97gpdztd7e4a6' }),
|
|
28
|
+
|
|
29
|
+
documentType: z.string().openapi({ example: 'Certificate of Incorporation' }),
|
|
30
|
+
documentImage: z
|
|
31
|
+
.string()
|
|
32
|
+
.openapi({ example: 'https://example.com/document.pdf' }),
|
|
33
|
+
kybStatus: z.nativeEnum(KYBStatus).openapi({ example: 'PENDING' }),
|
|
34
|
+
reason: z
|
|
35
|
+
.string()
|
|
36
|
+
.nullable()
|
|
37
|
+
.openapi({ example: 'Additional information required' }),
|
|
38
|
+
response: z
|
|
39
|
+
.string()
|
|
40
|
+
.nullable()
|
|
41
|
+
.openapi({ example: 'Submitted additional documents' }),
|
|
42
|
+
});
|
|
43
|
+
export type KybZod = z.infer<typeof KybZod>;
|
|
44
|
+
|
|
45
|
+
export const IPaginatedKyb = z.object({
|
|
46
|
+
items: z.array(KybZod),
|
|
47
|
+
meta: IPaginationMeta,
|
|
48
|
+
});
|
|
49
|
+
export type IPaginatedKyb = z.infer<typeof IPaginatedKyb>;
|
|
50
|
+
|
|
51
|
+
export const KybFiltersZod = z.object({
|
|
52
|
+
kybStatus: z.nativeEnum(KYBStatus).optional(),
|
|
53
|
+
});
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { IBaseEntity } from './entity.types';
|
|
3
|
+
import { IPaginationMeta, KYCStatus } from './common.types';
|
|
4
|
+
import { extendZodWithOpenApi } from '@anatine/zod-openapi';
|
|
5
|
+
import { TypeID } from 'typeid-js';
|
|
6
|
+
extendZodWithOpenApi(z);
|
|
7
|
+
|
|
8
|
+
export const kycIdSchema = z.string().refine(
|
|
9
|
+
(value) => {
|
|
10
|
+
try {
|
|
11
|
+
const tid = TypeID.fromString(value);
|
|
12
|
+
return tid.getType() === 'kyc';
|
|
13
|
+
} catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
message: 'Invalid kyc ID format. Must be a valid TypeID with "kyc" prefix.',
|
|
19
|
+
},
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
export const KycZod = IBaseEntity.extend({
|
|
23
|
+
tid: z.string().openapi({ example: 'third_party_kyc_123' }).nullable(),
|
|
24
|
+
platform: z.string().openapi({ example: 'KYC Platform' }),
|
|
25
|
+
individualId: z
|
|
26
|
+
.string()
|
|
27
|
+
.openapi({ example: 'individual_01j1xgme5qeqq97gpdztd7e4a6' }),
|
|
28
|
+
documentType: z.string().openapi({ example: 'Passport' }),
|
|
29
|
+
documentImage: z
|
|
30
|
+
.string()
|
|
31
|
+
.openapi({ example: 'https://example.com/passport.jpg' }),
|
|
32
|
+
kycStatus: z.nativeEnum(KYCStatus).openapi({ example: 'PENDING' }),
|
|
33
|
+
reason: z.string().nullable().openapi({ example: 'Document unclear' }),
|
|
34
|
+
response: z
|
|
35
|
+
.string()
|
|
36
|
+
.nullable()
|
|
37
|
+
.openapi({ example: 'Submitted clearer document' }),
|
|
38
|
+
});
|
|
39
|
+
export type KycZod = z.infer<typeof KycZod>;
|
|
40
|
+
|
|
41
|
+
export const IPaginatedKyc = z.object({
|
|
42
|
+
items: z.array(KycZod),
|
|
43
|
+
meta: IPaginationMeta,
|
|
44
|
+
});
|
|
45
|
+
export type IPaginatedKyc = z.infer<typeof IPaginatedKyc>;
|
|
46
|
+
|
|
47
|
+
export const KycFiltersZod = z.object({
|
|
48
|
+
kycStatus: z.nativeEnum(KYCStatus).optional(),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export enum KYCPlatformProvider {
|
|
52
|
+
WITH_PERSONA = 'WITH_PERSONA',
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export const inquiryIdSchema = z.string().regex(/^inq_[a-zA-Z0-9_-]{10,64}$/, {
|
|
56
|
+
message: 'Invalid inquiry ID format.',
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
export const InquiryResponse = z.object({
|
|
60
|
+
data: z.object({
|
|
61
|
+
type: z.literal('inquiry'),
|
|
62
|
+
id: z.string(),
|
|
63
|
+
attributes: z.object({
|
|
64
|
+
status: z.string(),
|
|
65
|
+
'reference-id': z.string(),
|
|
66
|
+
note: z.any().nullable(),
|
|
67
|
+
behaviors: z.object({
|
|
68
|
+
'api-version-less-than-minimum-count': z.any().nullable(),
|
|
69
|
+
'autofill-cancels': z.number(),
|
|
70
|
+
'autofill-starts': z.number(),
|
|
71
|
+
'behavior-threat-level': z.string(),
|
|
72
|
+
'bot-score': z.number(),
|
|
73
|
+
'completion-time': z.number(),
|
|
74
|
+
'debugger-attached': z.boolean(),
|
|
75
|
+
'devtools-open': z.boolean(),
|
|
76
|
+
'distraction-events': z.number(),
|
|
77
|
+
'hesitation-baseline': z.number(),
|
|
78
|
+
'hesitation-count': z.number(),
|
|
79
|
+
'hesitation-percentage': z.number(),
|
|
80
|
+
'hesitation-time': z.number(),
|
|
81
|
+
'mobile-sdk-version-less-than-minimum-count': z.any().nullable(),
|
|
82
|
+
'request-spoof-attempts': z.number(),
|
|
83
|
+
'shortcut-copies': z.number(),
|
|
84
|
+
'shortcut-pastes': z.number(),
|
|
85
|
+
'user-agent-spoof-attempts': z.number(),
|
|
86
|
+
}),
|
|
87
|
+
tags: z.array(z.any()),
|
|
88
|
+
creator: z.string(),
|
|
89
|
+
'reviewer-comment': z.any().nullable(),
|
|
90
|
+
'updated-at': z.string(),
|
|
91
|
+
'created-at': z.string(),
|
|
92
|
+
'started-at': z.any().nullable(),
|
|
93
|
+
'expires-at': z.any().nullable(),
|
|
94
|
+
'completed-at': z.any().nullable(),
|
|
95
|
+
'failed-at': z.any().nullable(),
|
|
96
|
+
'marked-for-review-at': z.any().nullable(),
|
|
97
|
+
'decisioned-at': z.string(),
|
|
98
|
+
'expired-at': z.any().nullable(),
|
|
99
|
+
'redacted-at': z.any().nullable(),
|
|
100
|
+
'previous-step-name': z.string(),
|
|
101
|
+
'next-step-name': z.string(),
|
|
102
|
+
'name-first': z.any().nullable(),
|
|
103
|
+
'name-middle': z.any().nullable(),
|
|
104
|
+
'name-last': z.any().nullable(),
|
|
105
|
+
birthdate: z.string(),
|
|
106
|
+
'address-street-1': z.any().nullable(),
|
|
107
|
+
'address-street-2': z.any().nullable(),
|
|
108
|
+
'address-city': z.any().nullable(),
|
|
109
|
+
'address-subdivision': z.any().nullable(),
|
|
110
|
+
'address-subdivision-abbr': z.any().nullable(),
|
|
111
|
+
'address-postal-code': z.any().nullable(),
|
|
112
|
+
'address-postal-code-abbr': z.any().nullable(),
|
|
113
|
+
'social-security-number': z.any().nullable(),
|
|
114
|
+
'identification-number': z.any().nullable(),
|
|
115
|
+
'email-address': z.any().nullable(),
|
|
116
|
+
'phone-number': z.any().nullable(),
|
|
117
|
+
fields: z.record(
|
|
118
|
+
z.object({
|
|
119
|
+
type: z.string(),
|
|
120
|
+
value: z.any().nullable(),
|
|
121
|
+
}),
|
|
122
|
+
),
|
|
123
|
+
}),
|
|
124
|
+
relationships: z.object({
|
|
125
|
+
account: z.object({
|
|
126
|
+
data: z.object({
|
|
127
|
+
type: z.string(),
|
|
128
|
+
id: z.string(),
|
|
129
|
+
}),
|
|
130
|
+
}),
|
|
131
|
+
template: z.object({ data: z.any().nullable() }),
|
|
132
|
+
'inquiry-template': z.object({
|
|
133
|
+
data: z.object({
|
|
134
|
+
type: z.string(),
|
|
135
|
+
id: z.string(),
|
|
136
|
+
}),
|
|
137
|
+
}),
|
|
138
|
+
'inquiry-template-version': z.object({
|
|
139
|
+
data: z.object({
|
|
140
|
+
type: z.string(),
|
|
141
|
+
id: z.string(),
|
|
142
|
+
}),
|
|
143
|
+
}),
|
|
144
|
+
transaction: z.object({ data: z.any().nullable() }),
|
|
145
|
+
reviewer: z.object({ data: z.any().nullable() }),
|
|
146
|
+
reports: z.object({ data: z.array(z.any()) }),
|
|
147
|
+
verifications: z.object({ data: z.array(z.any()) }),
|
|
148
|
+
sessions: z.object({
|
|
149
|
+
data: z.array(
|
|
150
|
+
z.object({
|
|
151
|
+
type: z.literal('inquiry-session'),
|
|
152
|
+
id: z.string(),
|
|
153
|
+
}),
|
|
154
|
+
),
|
|
155
|
+
}),
|
|
156
|
+
documents: z.object({ data: z.array(z.any()) }),
|
|
157
|
+
selfies: z.object({ data: z.array(z.any()) }),
|
|
158
|
+
}),
|
|
159
|
+
}),
|
|
160
|
+
included: z.array(z.any()),
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
export type InquiryResponse = z.infer<typeof InquiryResponse>;
|
|
164
|
+
|
|
165
|
+
export const KycTimelineEvent = z.object({
|
|
166
|
+
kyc_id: z.string(),
|
|
167
|
+
kyc_tid: z.string().nullable(),
|
|
168
|
+
platform: z.string(),
|
|
169
|
+
individual_id: z.string(),
|
|
170
|
+
kyc_status: z.string(),
|
|
171
|
+
last_event_at: z.date(),
|
|
172
|
+
event_id: z.string(),
|
|
173
|
+
external_event_id: z.string(),
|
|
174
|
+
inquiry_id: z.string(),
|
|
175
|
+
event_type: z.string(),
|
|
176
|
+
event_created_at: z.date(),
|
|
177
|
+
event_processed_at: z.date().nullable(),
|
|
178
|
+
event_kyc_status: z.string().nullable(),
|
|
179
|
+
skipped: z.boolean(),
|
|
180
|
+
skip_reason: z.string().nullable(),
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
export const KycTimelineResponse = InquiryResponse.extend({
|
|
184
|
+
timeline_events: z.array(KycTimelineEvent),
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
export type KycTimelineEvent = z.infer<typeof KycTimelineEvent>;
|
|
188
|
+
export type KycTimelineResponse = z.infer<typeof KycTimelineResponse>;
|