1
0
forked from Yara724/api

merge upstream

This commit is contained in:
2026-03-29 12:22:53 +03:30

View File

@@ -29,7 +29,144 @@ export class SandHubService {
private readonly sandHubDbService: SandHubDbService,
) {}
/**
* When false (default), no outbound HTTP to SandHub/Tejarat gateways — all inquiries return mocks.
* Set `SANDHUB_USE_REAL_API=true` to restore live calls.
*/
private useLiveSandHubApis(): boolean {
return process.env.SANDHUB_USE_REAL_API === "true";
}
/** Fixed plate/insurance inquiry payload used everywhere we mock block-inquiry style APIs. */
private getDefaultMockPlateInquiryRaw(): Record<string, unknown> {
return {
PrntPlcyCmpDocNo: "1403/1143-70591/200/35",
MapTypNam: "پرايد هاچ بک -111",
MtrNum: "5215907",
ShsNum: "NAS431100E5798656",
DisFnYrNum: "0",
DisLfYrNum: "0",
DisPrsnYrNum: "0",
DisPrsnYrPrcnt: "0",
DisFnYrPrcnt: "0",
DisLfYrPrcnt: "0",
vin: "IRPC941V2BD798656",
MapVehicleSystemName: "ثبت نشده",
LfCvrCptl: 0,
FnCvrCptl: 0,
PrsnCvrCptl: 0,
VehicleSystemCode: 1,
EdrsJson: '[{"id":1,"Dsc":" الحاقيه توضيحات ندارد"}]',
PersonCvrCptl: 12000000000,
LifeCvrCptl: 16000000000,
FinancialCvrCptl: 4000000000,
CarGroupCode: 3,
CylCnt: 4,
LastCompanyDocumentNumber: "03/1031/2835/1001/662",
UsageCode: "8",
MapUsageCode: 1,
MapUsageName: "شخصي",
Plk1: 59,
Plk2: 16,
Plk3: 419,
PlkSrl: 78,
PrintEndorsCompanyDocumentNumber: "بيمه نامه الحاقيه ندارد.",
EndorseDate: null,
InsuranceFullName: null,
SystemField: "سايپا",
TypeField: "111SE",
UsageField: "سواري",
MainColorField: "سفيد",
SecondColorField: "سفيد شيري",
ModelField: "1394",
CapacityField: "جمعا 4 نفر",
CylinderNumberField: "4",
EngineNumberField: "5215907",
ChassisNumberField: "NAS431100E5798656",
VinNumberField: "IRPC941V2BD798656",
InstallDateField: "1403/03/01",
AxelNumberField: "2",
WheelNumberField: "4",
CompanyName: "بیمه سامان",
CompanyCode: "15",
IssueDate: "1403/04/06",
SatrtDate: "1403/04/06",
EndDate: "1404/04/06",
Thrname: "",
EndorseText: null,
PolicyHealthLossCount: 0,
PolicyFinancialLossCount: 0,
PolicyPersonLossCount: 0,
Tonage: 0,
ThirdPolicyCode: 10502330579,
DiscountPersonPercent: null,
DiscountThirdPercent: null,
SystemCodeCii: 0,
SystemNameCii: "ثبت نشده",
TypeCodeCii: 12189,
TypeNameCii: "پرايد هاچ بک -111",
UsageNameCii: "سواري",
UsageCodeCii: 1,
ModelCii: 1394,
damageTypes: [],
StatusTypeCode: 1,
};
}
/**
* Bodies returned from `makeSandHubRequest` in mock mode (same shape callers expect from real API).
*/
private buildMockSandHubResponseForUrl(url: string): any {
const u = (url || "").toLowerCase();
if (u.includes("personal-inquiry")) {
return {
message: "success",
data: {
firstName: "نام",
lastName: "خانوادگی",
fatherName: "-",
birthCertificateNumber: "-",
nin: "-",
},
};
}
if (u.includes("driver-license-check")) {
return {
data: {
IsSucceed: true,
Message: "mock",
},
};
}
if (u.includes("ownership")) {
return {
data: {
IsSuccess: true,
},
};
}
if (u.includes("sheba")) {
return {
ReturnValue: true,
HasError: false,
Message: "mock-sheba-ok",
};
}
if (u.includes("block-inquiry") || u.includes("tejarat")) {
return this.mapNewApiResponseToOldFormat(
this.getDefaultMockPlateInquiryRaw(),
);
}
this.logger.warn(
`[MOCK] Unrecognized SandHub URL; returning generic OK: ${url}`,
);
return { data: {}, message: "mock-ok" };
}
private async getAccessToken(): Promise<string> {
if (!this.useLiveSandHubApis()) {
return "mock-sandhub-access-token";
}
if (this.loginToken && this.tokenExpiry && this.tokenExpiry > new Date()) {
return this.loginToken;
}
@@ -67,6 +204,9 @@ export class SandHubService {
}
private async getTejaratAccessToken(): Promise<string> {
if (!this.useLiveSandHubApis()) {
return "mock-tejarat-access-token";
}
if (
this.tejaratAccessToken &&
this.tejaratTokenExpiry &&
@@ -122,6 +262,10 @@ export class SandHubService {
}
private async makeTejaratRequest(url: string, payload: any, maxRetries = 2) {
if (!this.useLiveSandHubApis()) {
this.logger.log(`[MOCK] Tejarat POST skipped: ${url}`);
return this.getDefaultMockPlateInquiryRaw();
}
const INITIAL_DELAY = 500;
const BACKOFF_FACTOR = 2;
@@ -183,78 +327,13 @@ export class SandHubService {
};
const requestUrl = `${baseUrl}/block-inquiry-tejarat`;
// const raw = await this.makeTejaratRequest(requestUrl, requestPayload);
const raw = {
"PrntPlcyCmpDocNo": "1403/1143-70591/200/35",
"MapTypNam": "پرايد هاچ بک -111",
"MtrNum": "5215907",
"ShsNum": "NAS431100E5798656",
"DisFnYrNum": "0",
"DisLfYrNum": "0",
"DisPrsnYrNum": "0",
"DisPrsnYrPrcnt": "0",
"DisFnYrPrcnt": "0",
"DisLfYrPrcnt": "0",
"vin": "IRPC941V2BD798656",
"MapVehicleSystemName": "ثبت نشده",
"LfCvrCptl": 0,
"FnCvrCptl": 0,
"PrsnCvrCptl": 0,
"VehicleSystemCode": 1,
"EdrsJson": "[{\"id\":1,\"Dsc\":\" الحاقيه توضيحات ندارد\"}]",
"PersonCvrCptl": 12000000000,
"LifeCvrCptl": 16000000000,
"FinancialCvrCptl": 4000000000,
"CarGroupCode": 3,
"CylCnt": 4,
"LastCompanyDocumentNumber": "03/1031/2835/1001/662",
"UsageCode": "8",
"MapUsageCode": 1,
"MapUsageName": "شخصي",
"Plk1": 59,
"Plk2": 16,
"Plk3": 419,
"PlkSrl": 78,
"PrintEndorsCompanyDocumentNumber": "بيمه نامه الحاقيه ندارد.",
"EndorseDate": null,
"InsuranceFullName": null,
"SystemField": "سايپا",
"TypeField": "111SE",
"UsageField": "سواري",
"MainColorField": "سفيد",
"SecondColorField": "سفيد شيري",
"ModelField": "1394",
"CapacityField": "جمعا 4 نفر",
"CylinderNumberField": "4",
"EngineNumberField": "5215907",
"ChassisNumberField": "NAS431100E5798656",
"VinNumberField": "IRPC941V2BD798656",
"InstallDateField": "1403/03/01",
"AxelNumberField": "2",
"WheelNumberField": "4",
"CompanyName": "بیمه سامان",
"CompanyCode": "15",
"IssueDate": "1403/04/06",
"SatrtDate": "1403/04/06",
"EndDate": "1404/04/06",
"Thrname": "",
"EndorseText": null,
"PolicyHealthLossCount": 0,
"PolicyFinancialLossCount": 0,
"PolicyPersonLossCount": 0,
"Tonage": 0,
"ThirdPolicyCode": 10502330579,
"DiscountPersonPercent": null,
"DiscountThirdPercent": null,
"SystemCodeCii": 0,
"SystemNameCii": "ثبت نشده",
"TypeCodeCii": 12189,
"TypeNameCii": "پرايد هاچ بک -111",
"UsageNameCii": "سواري",
"UsageCodeCii": 1,
"ModelCii": 1394,
"damageTypes": [],
"StatusTypeCode": 1
const raw = this.useLiveSandHubApis()
? await this.makeTejaratRequest(requestUrl, requestPayload)
: this.getDefaultMockPlateInquiryRaw();
if (!this.useLiveSandHubApis()) {
this.logger.debug(
`[MOCK] getTejaratBlockInquiry plate=${JSON.stringify(requestPayload)}`,
);
}
const mapped = this.mapNewApiResponseToOldFormat(raw);
return { raw, mapped };
@@ -265,6 +344,10 @@ export class SandHubService {
}
private async makeSandHubRequest(url: string, payload: any, maxRetries = 3) {
if (!this.useLiveSandHubApis()) {
this.logger.log(`[MOCK] SandHub POST skipped: ${url}`);
return this.buildMockSandHubResponseForUrl(url);
}
const token = await this.getAccessToken();
const INITIAL_DELAY = 1000;
const BACKOFF_FACTOR = 2;
@@ -365,84 +448,20 @@ export class SandHubService {
rightTwoDigits: String(userDetail.plate.ir),
nationalCode: userDetail.nationalCodeOfInsurer,
};
// const requestUrl = `${process.env.SANDHUB_BASE_URL}/block-inquiry-tejarat`;
// const response = await this.makeSandHubRequest(requestUrl, requestPayload);
const base = process.env.SANDHUB_BASE_URL ?? "";
const requestUrl = `${base}/block-inquiry-tejarat`;
let response = {
"PrntPlcyCmpDocNo": "1403/1143-70591/200/35",
"MapTypNam": "پرايد هاچ بک -111",
"MtrNum": "5215907",
"ShsNum": "NAS431100E5798656",
"DisFnYrNum": "0",
"DisLfYrNum": "0",
"DisPrsnYrNum": "0",
"DisPrsnYrPrcnt": "0",
"DisFnYrPrcnt": "0",
"DisLfYrPrcnt": "0",
"vin": "IRPC941V2BD798656",
"MapVehicleSystemName": "ثبت نشده",
"LfCvrCptl": 0,
"FnCvrCptl": 0,
"PrsnCvrCptl": 0,
"VehicleSystemCode": 1,
"EdrsJson": "[{\"id\":1,\"Dsc\":\" الحاقيه توضيحات ندارد\"}]",
"PersonCvrCptl": 12000000000,
"LifeCvrCptl": 16000000000,
"FinancialCvrCptl": 4000000000,
"CarGroupCode": 3,
"CylCnt": 4,
"LastCompanyDocumentNumber": "03/1031/2835/1001/662",
"UsageCode": "8",
"MapUsageCode": 1,
"MapUsageName": "شخصي",
"Plk1": 59,
"Plk2": 16,
"Plk3": 419,
"PlkSrl": 78,
"PrintEndorsCompanyDocumentNumber": "بيمه نامه الحاقيه ندارد.",
"EndorseDate": null,
"InsuranceFullName": null,
"SystemField": "سايپا",
"TypeField": "111SE",
"UsageField": "سواري",
"MainColorField": "سفيد",
"SecondColorField": "سفيد شيري",
"ModelField": "1394",
"CapacityField": "جمعا 4 نفر",
"CylinderNumberField": "4",
"EngineNumberField": "5215907",
"ChassisNumberField": "NAS431100E5798656",
"VinNumberField": "IRPC941V2BD798656",
"InstallDateField": "1403/03/01",
"AxelNumberField": "2",
"WheelNumberField": "4",
"CompanyName": "بیمه سامان",
"CompanyCode": "15",
"IssueDate": "1403/04/06",
"SatrtDate": "1403/04/06",
"EndDate": "1404/04/06",
"Thrname": "",
"EndorseText": null,
"PolicyHealthLossCount": 0,
"PolicyFinancialLossCount": 0,
"PolicyPersonLossCount": 0,
"Tonage": 0,
"ThirdPolicyCode": 10502330579,
"DiscountPersonPercent": null,
"DiscountThirdPercent": null,
"SystemCodeCii": 0,
"SystemNameCii": "ثبت نشده",
"TypeCodeCii": 12189,
"TypeNameCii": "پرايد هاچ بک -111",
"UsageNameCii": "سواري",
"UsageCodeCii": 1,
"ModelCii": 1394,
"damageTypes": [],
"StatusTypeCode": 1
let response: any;
if (this.useLiveSandHubApis()) {
response = await this.makeSandHubRequest(requestUrl, requestPayload);
} else {
this.logger.debug(
`[MOCK] getSandHubResponse plate=${JSON.stringify(requestPayload)}`,
);
response = this.getDefaultMockPlateInquiryRaw();
}
// // Map the new API response format to the old format
let result = this.mapNewApiResponseToOldFormat(response);
const result = this.mapNewApiResponseToOldFormat(response);
// if (result.usgCod !== "8") {
// throw new Error("خودرو شما شخصی / سواری نمی باشد")