in src/salesforce_uploader.ts [75:184]
export function handler(
input: apiGatewayLambdaInput,
context: any,
callback: (error: any, apiResponse: ApiResponse) => void,
) {
function validationError(message: string) {
console.log(message);
callback(null, badRequest(message));
}
async function salesforceUpload(
fileData: {
date: Moment;
s3Path: string;
file: PromiseResult<S3.GetObjectOutput, AWSError>;
},
stage: string,
salesforce: Salesforce,
sfFolder: Folder & S3Folder,
) {
const dayOfTheWeek = fileData.date.format('dddd');
const dateSuffix = fileData.date.format('DD_MM_YYYY');
const outputFileName = `HOME_DELIVERY_${dayOfTheWeek}_${dateSuffix}.csv`;
console.log(`uploading ${outputFileName} to ${sfFolder.name}`);
const sfFileDescription = `Home Delivery fulfilment file ${outputFileName}`;
const uploadResult = await salesforce.uploadDocument(
outputFileName,
sfFolder,
sfFileDescription,
fileData.file.Body,
);
const lastModified = moment(fileData.file.LastModified).format(
'YYYY-MM-DD',
);
await copyToUploadedFolder(stage, fileData.s3Path, outputFileName);
return Promise.resolve({
name: outputFileName,
id: uploadResult.id,
lastModified: lastModified,
});
}
async function getFileData(stage: string, date: Moment) {
const s3FileName = date.format(DATE_FORMAT) + '_HOME_DELIVERY.csv';
const s3Path = `fulfilment_output/${s3FileName}`;
const file = await getObject(s3Path);
return Promise.resolve({
s3Path: s3Path,
file: file,
date: date,
});
}
async function asyncHandler(
startDate: Moment,
amount: number,
providedToken: string,
) {
const config = await fetchConfig();
console.log('Config fetched successfully.');
await validateToken(config.api.expectedToken, providedToken);
console.log('token validated successfully');
const salesforce = await authenticate(config);
console.log('Finding fulfilment folder.');
const folder = config.fulfilments.homedelivery.uploadFolder;
console.log(folder);
const filePromises = range(amount).map((offset) => {
const date = moment(startDate, DATE_FORMAT).add(offset, 'days');
return getFileData(config.stage, date);
});
const files = await Promise.all(filePromises);
const results = files.map((fileData) => {
return salesforceUpload(fileData, config.stage, salesforce, folder);
});
return Promise.all(results);
}
const body = JSON.parse(input.body);
if (!body.amount || !body.date) {
validationError('missing amount or date');
return;
}
if (body.amount < 1 || body.amount > MAX_DAYS) {
validationError(`amount should be a number between 1 and ${MAX_DAYS}`);
return;
}
const providedToken = input.headers.apiToken;
if (!providedToken) {
validationError('ApiToken header missing');
return;
}
asyncHandler(body.date, body.amount, providedToken)
.then((uploadedFiles) => {
console.log('returning success api response');
callback(null, new SuccessResponse(uploadedFiles));
})
.catch((error) => {
console.log(error);
if (error instanceof ApiResponse) {
callback(null, error);
} else {
callback(null, serverError);
}
});
}