Skip to content

Instantly share code, notes, and snippets.

@turingmachine
Created June 29, 2018 09:10
Show Gist options
  • Save turingmachine/24e5caa16a5bded2d5b62ba6e3514d01 to your computer and use it in GitHub Desktop.
Save turingmachine/24e5caa16a5bded2d5b62ba6e3514d01 to your computer and use it in GitHub Desktop.
if (Meteor.isServer) {
import { HTTP } from 'meteor/http';
import { _ } from 'lodash';
import { moment } from 'meteor/momentjs:moment';
import { Requests } from '../collections/Requests.js';
import { doesFitPackaging } from '../lib/pricing.js';
const SMALL_ITEMS_PACKAGING_SIZES = [
{
id: 'PACKAGE_SIZE_1',
dimensions: [28.5, 16.9, 14.3],
},
{
id: 'PACKAGE_SIZE_2',
dimensions: [33.5, 29.0, 10.2],
},
{
id: 'PACKAGE_SIZE_3',
dimensions: [35.1, 26.0, 21.0],
},
{
id: 'PACKAGE_SIZE_4',
dimensions: [45.9, 31.9, 29.5],
},
{
id: 'PACKAGE_SIZE_5',
dimensions: [45.9, 31.9, 40.1],
},
];
const getSmallestFittingPackaging = (packagingSizes, item) => {
return _(packagingSizes).filter(packaging => {
return doesFitPackaging(packaging.dimensions, [item]);
}).first().id;
}
const getStreetName = (street) => {
if (!street) return;
return _.trim(street.replace(/[0-9]+[a-zA-Z]?/g, ""));
};
const getStreetNumber = (street) => {
if (!street) return;
return _.first(street.match(/[0-9]+[a-zA-Z]?/));
};
const weightMap = {
2: 'TWO',
10: 'TWENTY',
30: 'THIRTY',
};
sendingTypeMap = {
"small": 'ECO',
"small-bulky": 'ECOSP',
};
const apiEndpoint = _.get(Meteor.settings, 'public.env', 'dev') === 'production'
? 'XXX'
: 'XXX';
const apiAuth = _.get(Meteor.settings, 'public.env', 'dev') === 'production'
? 'XXX'
: 'XXX';
Meteor.methods({
'pickAtHomeDates'(inquiry) {
apiData = {
"pickupAddress": {
"firstname": inquiry.senderName,
"lastname": inquiry.senderName,
"street": getStreetName(inquiry.senderStreet),
"houseNr": getStreetNumber(inquiry.senderStreet),
"zip": _.split(inquiry.senderPlace, ' ')[0],
"city": _.split(inquiry.senderPlace, ' ').slice(1).join(' '),
},
};
let result = HTTP.call('POST', apiEndpoint, {
auth: apiAuth,
data: apiData,
});
if (result.statusCode !== 201 || !_.isEmpty(result.data.errors)) {
console.log({
statusCode: result.statusCode,
errors: result.data.errors,
});
return null;
}
result = HTTP.call('GET', `${apiEndpoint}/${result.data.orderKey}/infos`, {
auth: apiAuth,
});
if (result.data.pickupDates) {
return result.data.pickupDates.map(date => date.date);
}
return null;
},
'pickAtHomeOrder'(inquiry) {
let apiData = {};
try {
inquiry.items.map(item => {
// generate Label
Meteor.call('generateLabel', inquiry, item, (error, label) => {
if (error) {
Requests.update(inquiry._id, {
$push: { pickAtHomeErrors: error },
});
throw error;
}
console.log(label);
// prepare request
apiData = {
"pickupDate": moment(inquiry.pickupDate).format('YYYY-MM-DD'),
"pickupPlace": inquiry.pickupHandover,
"additionalPickupInfo": _.toString(inquiry.pickupAdditionalInformation),
"klpId": "12143722", // [email protected]
"pickupAddress": {
"firstname": inquiry.senderName,
"lastname": inquiry.senderName,
"street": getStreetName(inquiry.senderStreet),
"houseNr": getStreetNumber(inquiry.senderStreet),
"zip": _.split(inquiry.senderPlace, ' ')[0],
"city": _.split(inquiry.senderPlace, ' ').slice(1).join(' '),
},
"parcel": {
"identcode": label.identcode,
"senderAddress": {
"firstname": inquiry.senderName,
"lastname": inquiry.senderName,
"street": getStreetName(inquiry.senderStreet),
"houseNr": getStreetNumber(inquiry.senderStreet),
"zip": _.split(inquiry.senderPlace, ' ')[0],
"city": _.split(inquiry.senderPlace, ' ').slice(1).join(' '),
},
"senderReference": inquiry._id,
"weight": weightMap[item.weight],
"labelShipment": true,
"sendingType": sendingTypeMap[inquiry.channel],
}
};
// add packaging
if (inquiry.packaging == 'post') {
apiData["parcel"]["packagingSize"] = getSmallestFittingPackaging(SMALL_ITEMS_PACKAGING_SIZES, item);
}
// save request for debugging purposes
Requests.update(inquiry._id, {
$push: { pickAtHomeRequests: apiData },
});
// create order
let result = HTTP.call('POST', apiEndpoint, {
auth: apiAuth,
data: apiData,
});
if (result.statusCode !== 201 || !_.isEmpty(result.data.errors)) {
const errors = {
statusCode: result.statusCode,
errors: result.data.errors,
};
Requests.update(inquiry._id, {
$push: { pickAtHomeErrors: errors },
});
throw errors;
}
// get parcelKey
result = HTTP.call('GET', `${apiEndpoint}/${result.data.orderKey}/parcels`, {
auth: apiAuth,
});
if (result.statusCode !== 200 || !_.isEmpty(result.data.errors)) {
const errors = {
statusCode: result.statusCode,
errors: result.data.errors,
};
Requests.update(inquiry._id, {
$push: { pickAtHomeErrors: errors },
});
throw errors;
}
// add label to parcel
let boundary = '3cc6d52cb19500f900214f6a778c15ef';
result = HTTP.call('PUT', `${apiEndpoint}/${result.data.orderKey}/parcels/${result.data.relations[0]['parcelKey']}/label`, {
auth: apiAuth,
headers: {
'Content-Type': 'multipart/form-data; boundary=3cc6d52cb19500f900214f6a778c15ef',
},
content: [
'--3cc6d52cb19500f900214f6a778c15ef',
'Content-Disposition: form-data; name="label"; filename="label.png"',
'Content-Type: application/octet-stream',
'Content-Transfer-Encoding: base64',
'',
label.image,
'--3cc6d52cb19500f900214f6a778c15ef--',
'',
].join('\r\n'),
});
if (result.statusCode !== 200 || !_.isEmpty(result.data.errors)) {
const errors = {
statusCode: result.statusCode,
errors: result.data.errors,
};
Requests.update(inquiry._id, {
$push: { pickAtHomeErrors: errors },
});
throw errors;
}
// approve order
result = HTTP.call('POST', `${apiEndpoint}/${result.data.orderKey}/approval`, {
auth: apiAuth,
data: {},
});
if (result.statusCode !== 200 || !_.isEmpty(result.data.errors)) {
const errors = {
statusCode: result.statusCode,
errors: result.data.errors,
};
Requests.update(inquiry._id, {
$push: { pickAtHomeErrors: errors },
});
throw errors;
}
});
Requests.update(inquiry._id, {
$push: { pickAtHomeResult: result.data },
});
})
} catch(err) {
console.log('ERROR:');
console.log(err);
}
},
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment