@kobdev/yelp-fusion-plus
Version:
Node.js Client for Yelp Fusion Services
65 lines • 5.61 kB
JavaScript
import * as https from 'https';
import axios from 'axios';
import Bottleneck from 'bottleneck';
export class Client {
axiosInstance;
baseUrl = 'https://api.yelp.com';
limiter = new Bottleneck({
minTime: 200, // execute 6 requests per second
});
constructor(clientOptions) {
if (clientOptions.axiosInstance) {
this.axiosInstance = clientOptions.axiosInstance;
if (!this.axiosInstance.defaults.headers.Authorization) {
this.axiosInstance.defaults.headers = {
Authorization: `Bearer ${clientOptions.apiKey}`,
};
}
}
else {
this.axiosInstance = this.createNewAxiosInstance(clientOptions.apiKey);
}
}
// public functions
/** returns detailed business */
async businessDetailsAsync(id) {
const url = `${this.baseUrl}/v3/businesses/${id}`;
const axiosResponse = await this.limiter.schedule(() => this.axiosInstance.get(url));
return axiosResponse.data;
}
/** return detailed business for ids */
async businessesDetailsAsync(ids) {
const promises = ids.map((id) => this.businessDetailsAsync(id));
return await Promise.all(promises);
}
/** returns businesses based on the provided search criteria */
async businessesSearchAsync(businessesSearchRequest) {
const qs = Object.keys(businessesSearchRequest)
.map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(businessesSearchRequest[key])}`)
.join('&');
const url = `${this.baseUrl}/v3/businesses/search?${qs}`;
return (await this.axiosInstance.get(url)).data;
}
/** returns detailed businesses based on the provided search criteria */
async businessesSearchDetailsAsync(businessesSearchRequest) {
const response = await this.businessesSearchAsync(businessesSearchRequest);
const businessIDs = response.businesses.map((b) => b.id);
const detailedBusinesses = await this.businessesDetailsAsync(businessIDs);
return {
businesses: detailedBusinesses,
region: response.region,
total: response.total,
};
}
// private functions
createNewAxiosInstance(apiKey) {
const httpsAgent = new https.Agent({ keepAlive: true });
return axios.create({
headers: {
Authorization: `Bearer ${apiKey}`,
},
httpsAgent: httpsAgent,
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQVMvQixPQUFPLEtBQXdCLE1BQU0sT0FBTyxDQUFDO0FBQzdDLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQU9wQyxNQUFNLE9BQU8sTUFBTTtJQUNULGFBQWEsQ0FBZ0I7SUFDN0IsT0FBTyxHQUFHLHNCQUFzQixDQUFDO0lBRXpDLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQztRQUN2QixPQUFPLEVBQUUsR0FBRyxFQUFFLGdDQUFnQztLQUMvQyxDQUFDLENBQUM7SUFFSCxZQUFZLGFBQTZCO1FBQ3ZDLElBQUksYUFBYSxDQUFDLGFBQWEsRUFBRTtZQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxhQUFhLENBQUM7WUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRztvQkFDcEMsYUFBYSxFQUFFLFVBQVUsYUFBYSxDQUFDLE1BQU0sRUFBRTtpQkFDaEQsQ0FBQzthQUNIO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4RTtJQUNILENBQUM7SUFFRCxtQkFBbUI7SUFFbkIsZ0NBQWdDO0lBQ2hDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFVO1FBQ25DLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sa0JBQWtCLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ3JELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUM1QixDQUFDO1FBQ0YsT0FBTyxhQUFhLENBQUMsSUFBdUIsQ0FBQztJQUMvQyxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxHQUFhO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsS0FBSyxDQUFDLHFCQUFxQixDQUN6Qix1QkFFbUM7UUFFbkMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQzthQUM1QyxHQUFHLENBQ0YsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNOLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksa0JBQWtCLENBQzlDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUM3QixFQUFFLENBQ047YUFDQSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDYixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLHlCQUF5QixFQUFFLEVBQUUsQ0FBQztRQUN6RCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQWdDLENBQUM7SUFDOUUsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSxLQUFLLENBQUMsNEJBQTRCLENBQ2hDLHVCQUVtQztRQUVuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRSxPQUFPO1lBQ0wsVUFBVSxFQUFFLGtCQUFrQjtZQUM5QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQ2EsQ0FBQztJQUN2QyxDQUFDO0lBRUQsb0JBQW9CO0lBRVosc0JBQXNCLENBQUMsTUFBYztRQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN4RCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDbEIsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxVQUFVLE1BQU0sRUFBRTthQUNsQztZQUNELFVBQVUsRUFBRSxVQUFVO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiJ9