export function handler()

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);
			}
		});
}