forked from Shared/esg
feat: add car inquiries with resilience, ownership privacy, and retry visibility
Introduce plate, chassis, and third-party car endpoints, a wall-clock inquiry deadline with transport-only retries, and ownership-safe no-match errors so another person's identity never leaks. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -31,12 +31,12 @@ export interface TejaratNouConfig {
|
||||
enabled: boolean;
|
||||
timeout: number;
|
||||
maxRetries: number;
|
||||
authUrl: string;
|
||||
baseUrl: string;
|
||||
inquiryBaseUrl: string;
|
||||
clientId: string;
|
||||
clientSecret: string;
|
||||
username: string;
|
||||
password: string;
|
||||
inquiries: Partial<Record<InquiryType, InquiryConfig>>;
|
||||
}
|
||||
|
||||
export interface InquiryRoutingConfig {
|
||||
@@ -84,15 +84,14 @@ export default () => ({
|
||||
tejaratnou: {
|
||||
enabled: process.env.TEJARATNOU_ENABLED !== 'false',
|
||||
timeout: parseInt(process.env.TEJARATNOU_TIMEOUT ?? '15000', 10),
|
||||
maxRetries: parseInt(process.env.TEJARATNOU_MAX_RETRIES ?? '2', 10),
|
||||
authUrl: process.env.TEJARATNOU_AUTH_URL ?? 'https://accounts.tejaratnoins.ir',
|
||||
maxRetries: parseInt(process.env.TEJARATNOU_MAX_RETRIES ?? '3', 10),
|
||||
baseUrl: process.env.TEJARATNOU_BASE_URL ?? 'https://accounts.tejaratnoins.ir',
|
||||
inquiryBaseUrl:
|
||||
process.env.TEJARATNOU_INQUIRY_BASE_URL ?? 'https://gateway.tejaratnoins.ir',
|
||||
clientId: process.env.TEJARATNOU_CLIENT_ID ?? 'api-gateway',
|
||||
clientSecret: process.env.TEJARATNOU_CLIENT_SECRET ?? '',
|
||||
username: process.env.TEJARATNOU_USERNAME ?? '',
|
||||
password: process.env.TEJARATNOU_PASSWORD ?? '',
|
||||
inquiries: {
|
||||
[InquiryType.PERSON]: buildInquiryConfig('TEJARATNOU', 'PERSON'),
|
||||
},
|
||||
} satisfies TejaratNouConfig,
|
||||
inquiryRouting: {
|
||||
[InquiryType.PERSON]: buildInquiryRoutingConfig('PERSON', ProviderName.PARSIAN, [
|
||||
@@ -101,12 +100,14 @@ export default () => ({
|
||||
]),
|
||||
[InquiryType.REAL_ESTATE]: buildInquiryRoutingConfig('REAL_ESTATE', ProviderName.HAMTA, [
|
||||
ProviderName.MOALLEM,
|
||||
ProviderName.TEJARATNOU,
|
||||
]),
|
||||
[InquiryType.SHEBA]: buildInquiryRoutingConfig('SHEBA', ProviderName.PARSIAN, [
|
||||
ProviderName.HAMTA,
|
||||
]),
|
||||
[InquiryType.SHAHKAR]: buildInquiryRoutingConfig('SHAHKAR', ProviderName.PARSIAN, [
|
||||
ProviderName.HAMTA,
|
||||
ProviderName.TEJARATNOU,
|
||||
]),
|
||||
[InquiryType.POSTAL_CODE]: buildInquiryRoutingConfig('POSTAL_CODE', ProviderName.MOALLEM, [
|
||||
ProviderName.HAMTA,
|
||||
@@ -114,7 +115,10 @@ export default () => ({
|
||||
[InquiryType.LEGAL_PERSON]: buildInquiryRoutingConfig('LEGAL_PERSON', ProviderName.HAMTA, [
|
||||
ProviderName.MOALLEM,
|
||||
]),
|
||||
[InquiryType.CAR_PLATE]: buildInquiryRoutingConfig('CAR_PLATE', ProviderName.HAMTA, []),
|
||||
[InquiryType.CAR_PLATE]: buildInquiryRoutingConfig('CAR_PLATE', ProviderName.TEJARATNOU, []),
|
||||
[InquiryType.CAR_BY_PLATE]: buildInquiryRoutingConfig('CAR_BY_PLATE', ProviderName.PARSIAN, []),
|
||||
[InquiryType.CAR_BY_CHASSIS]: buildInquiryRoutingConfig('CAR_BY_CHASSIS', ProviderName.PARSIAN, []),
|
||||
[InquiryType.THIRD_PARTY_CAR]: buildInquiryRoutingConfig('THIRD_PARTY_CAR', ProviderName.PARSIAN, []),
|
||||
[InquiryType.POLICY_BY_CHASSIS]: buildInquiryRoutingConfig(
|
||||
'POLICY_BY_CHASSIS',
|
||||
ProviderName.PARSIAN,
|
||||
@@ -142,6 +146,9 @@ function buildProviderConfig(prefix: string): ProviderEnvConfig {
|
||||
InquiryType.POSTAL_CODE,
|
||||
InquiryType.LEGAL_PERSON,
|
||||
InquiryType.CAR_PLATE,
|
||||
InquiryType.CAR_BY_PLATE,
|
||||
InquiryType.CAR_BY_CHASSIS,
|
||||
InquiryType.THIRD_PARTY_CAR,
|
||||
InquiryType.POLICY_BY_CHASSIS,
|
||||
InquiryType.POLICY_BY_PLATE,
|
||||
InquiryType.POLICY_BY_NATIONAL_CODE,
|
||||
@@ -159,7 +166,7 @@ function buildProviderConfig(prefix: string): ProviderEnvConfig {
|
||||
return {
|
||||
enabled: process.env[`${prefix}_ENABLED`] !== 'false',
|
||||
timeout: parseInt(process.env[`${prefix}_TIMEOUT`] ?? '10000', 10),
|
||||
maxRetries: parseInt(process.env[`${prefix}_MAX_RETRIES`] ?? '2', 10),
|
||||
maxRetries: parseInt(process.env[`${prefix}_MAX_RETRIES`] ?? '3', 10),
|
||||
inquiries,
|
||||
};
|
||||
}
|
||||
@@ -183,6 +190,9 @@ function inquiryTypeToEnvName(inquiryType: InquiryType): string {
|
||||
[InquiryType.POSTAL_CODE]: 'POSTAL_CODE',
|
||||
[InquiryType.LEGAL_PERSON]: 'LEGAL_PERSON',
|
||||
[InquiryType.CAR_PLATE]: 'CAR_PLATE',
|
||||
[InquiryType.CAR_BY_PLATE]: 'CAR_BY_PLATE',
|
||||
[InquiryType.CAR_BY_CHASSIS]: 'CAR_BY_CHASSIS',
|
||||
[InquiryType.THIRD_PARTY_CAR]: 'THIRD_PARTY_CAR',
|
||||
[InquiryType.POLICY_BY_CHASSIS]: 'POLICY_BY_CHASSIS',
|
||||
[InquiryType.POLICY_BY_PLATE]: 'POLICY_BY_PLATE',
|
||||
[InquiryType.POLICY_BY_NATIONAL_CODE]: 'POLICY_BY_NATIONAL_CODE',
|
||||
|
||||
Reference in New Issue
Block a user