From f277d87dfa70b766a48d4da8e792632498f497e8 Mon Sep 17 00:00:00 2001 From: "s.yahyaee" Date: Sun, 29 Mar 2026 11:46:56 +0330 Subject: [PATCH] Mocked all external API calls --- src/sand-hub/sand-hub.service.ts | 315 ++++++++++++++++--------------- 1 file changed, 167 insertions(+), 148 deletions(-) diff --git a/src/sand-hub/sand-hub.service.ts b/src/sand-hub/sand-hub.service.ts index 72a4cf9..5f18a09 100644 --- a/src/sand-hub/sand-hub.service.ts +++ b/src/sand-hub/sand-hub.service.ts @@ -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 { + 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 { + 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 { + 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("خودرو شما شخصی / سواری نمی باشد")