Re_Backend/src/services/dealerExternal.service.ts

94 lines
3.8 KiB
TypeScript

import axios from 'axios';
import logger from '../utils/logger';
export interface ExternalDealerResponse {
dealer: string;
'dealer name': string;
'item group': string | null;
'proprietor/Driector Names': string | null;
gstin: string | null;
pan: string | null;
'irn eligibility': string;
'region id': string | null;
're state code': string | null;
're city': string | null;
'store address': string | null;
pincode: string | null;
'dealer email': string | null;
'dealer phone': string | null;
}
export class DealerExternalService {
private apiUrl: string;
private authHeader: string;
private authToken: string;
constructor() {
this.apiUrl = process.env.RE_DEALER_API_URL || 'https://api-uat2.royalenfield.com/DealerMaster';
this.authHeader = process.env.RE_DEALER_API_AUTH || 'q7WlK9ZpT2JfV8mXc4sB0nYdH6R3aQeU1CjGxL5uPzI=';
this.authToken = process.env.RE_DEALER_API_TOKEN || 're_c92b9cf291d2be65a1704207aa25352d69432b643e6c9e9a172938c964809f2d';
}
/**
* Fetch dealer information from external Royal Enfield API by dealer code
* @param dealerCode The code of the dealer to search for
*/
async getDealerByCode(dealerCode: string): Promise<ExternalDealerResponse | null> {
try {
logger.info(`[DealerExternalService] Fetching dealer info for code: ${dealerCode}`);
const response = await axios.get(this.apiUrl, {
params: { dealer_code: dealerCode },
headers: {
'auth': this.authHeader,
'Authorization': `Bearer ${this.authToken}`
}
});
if (!response.data) {
logger.warn(`[DealerExternalService] No data returned for dealer code: ${dealerCode}`);
return null;
}
// The API returns an object or array? Based on user request, it looks like a single object
// but usually these APIs return arrays. Let's handle both just in case.
const data = Array.isArray(response.data) ? response.data[0] : response.data;
if (!data || Object.keys(data).length === 0) {
logger.warn(`[DealerExternalService] Empty dealer data for code: ${dealerCode}`);
return null;
}
// Map the response to the requested format if it's different,
// but user's response example seems to be the literal API response structure.
// We'll return it as is but ensure types match.
return {
dealer: data.dealer || dealerCode,
'dealer name': data['dealer name'] || '',
'item group': data['item group'] || null,
'proprietor/Driector Names': data['proprietor/Driector Names'] || null,
gstin: data.gstin || null,
pan: data.pan || null,
'irn eligibility': data['irn eligibility'] || 'no',
'region id': data['region id'] || null,
're state code': data['re state code'] || null,
're city': data['re city'] || null,
'store address': data['store address'] || null,
pincode: data.pincode || null,
'dealer email': data['dealer email'] || null,
'dealer phone': data['dealer phone'] || null
};
} catch (error) {
if (axios.isAxiosError(error)) {
logger.error(`[DealerExternalService] API Error: ${error.response?.status} - ${JSON.stringify(error.response?.data)}`);
} else {
logger.error(`[DealerExternalService] Unexpected Error: ${error instanceof Error ? error.message : 'Unknown'}`);
}
throw error;
}
}
}
export const dealerExternalService = new DealerExternalService();