import { PUDO_ID, PUDO_SECRET, PUDO_URL, PUDO_URL_AUTH } from '../lib/constants' import { isNaN, merge, path, reduce, splitEvery, trim } from 'ramda' import Model from '@oyst/utils/lib/model' import { makeError } from '@oyst/utils' import restClient from 'unirest' const handleError = (code: any): { code: number, msg: string } => { switch (true) { case code === 401: return { code: 401, msg: 'invalid-auth' } case code === 400: return { code: 500, msg: 'undefined-pudos' } default: return { code: 500, msg: 'unhandled-error' } } } const getHours = (data: any): Object => { const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] return reduce((acc, key: any) => { const item = acc[days[key.dayId - 1]] const hours = { begin: key.startTime, end: key.endTime } item ? item.push(hours) : acc[days[key.dayId - 1]] = [hours] return acc }, {}, data) } const handleResults = (results: any[]): Object[] => { const pickupStores = [] results.map(data => { const pickupStore = { address: { city: data.city, latitude: data.latitude, longitude: data.longitude, name: data.name, postalCode: data.zipCode, street: trim(`${data.address1} ${data.address2} ${data.address3}`), }, distance: data.distance, id: data.id, informations: [data.locationHint], map: '', openingHours: getHours(data.openingHours) } if (data.available) { pickupStores.push(pickupStore) } }) return pickupStores } export default class Pudo extends Model { private client: any = null private id: string = PUDO_ID private secret: string = PUDO_SECRET private language: string = 'FR' private countryCode: string = 'FRA' private token: string = null constructor (o?: any) { super() this.init(o) } private getToken (): Promise { return new Promise((resolve, reject) => { const header = new Buffer(`${this.id}:${this.secret}`).toString('base64') restClient.get(`${PUDO_URL_AUTH}?realm=http:%2F%2Fpickup.c2c.fr`) .header('Authorization', `Basic ${header}`) .header('Content-Type', 'application/json') .end(res => { if (res.status === 200) { this.token = res.body.access_token return resolve(this.token) } reject(res.error.message) }) }) } public async searchByPostalCode (postalCode: string): Promise { return new Promise(async (resolve, reject) => { try { await this.getToken() const header = `Basic ${this.token}` restClient.post(`${PUDO_URL}/GetPudoList`) .header('Authorization', header) .header('Content-Type', 'application/json') .send({ address: { addressLine: '-', city: '-', countryCode: this.countryCode, zipCode: postalCode }, maxDistanceSearch: 10000, maxPudoNumber: 10, partnerName: this.id, pudoType: 'destination' }) .end(res => { if (res.status !== 200) { const error = handleError(parseInt(res.status, 10)) return reject(makeError(`RELAY-${error.code}`, error.msg)) } if (!res.body.pudos) { return reject(makeError('RELAY-500', 'undefined-pudos')) } resolve(handleResults(res.body.pudos)) }) } catch (err) { reject(err) } }) } }