async function processSubs()

in src/weekly/export.ts [96:190]


async function processSubs(
	downloadStream: MultiStream,
	deliveryDate: Moment,
	stage: string,
	holidaySuspensions: Set<string>,
): Promise<Array<Filename>> {
	const config = await fetchConfig();
	console.log('loaded ' + holidaySuspensions.size + ' holiday suspensions');
	const rowExporter = new WeeklyExporter(
		'Rest of the world',
		deliveryDate,
		config.fulfilments.weekly.ROW.uploadFolder,
	);

	const exporters = [
		new WeeklyExporter(
			'United Kingdom',
			deliveryDate,
			config.fulfilments.weekly.UK.uploadFolder,
		),
		new CaExporter(
			'Canada',
			deliveryDate,
			config.fulfilments.weekly.CA.uploadFolder,
		),
		new CaHandDeliveryExporter(
			'Canada',
			deliveryDate,
			config.fulfilments.weekly.CAHAND.uploadFolder,
		),
		new USExporter(
			'United States',
			deliveryDate,
			config.fulfilments.weekly.US.uploadFolder,
		),
		new UpperCaseAddressExporter(
			australiaFulfilmentCountries,
			deliveryDate,
			config.fulfilments.weekly.AU.uploadFolder,
		),
		new UpperCaseAddressExporter(
			'New Zealand',
			deliveryDate,
			config.fulfilments.weekly.NZ.uploadFolder,
		),
		new UpperCaseAddressExporter(
			'Vanuatu',
			deliveryDate,
			config.fulfilments.weekly.VU.uploadFolder,
		),
		new EuExporter(
			'EU',
			deliveryDate,
			config.fulfilments.weekly.EU.uploadFolder,
		),
		rowExporter,
	];

	const writableCsvPromise: Promise<void> = new Promise((resolve, reject) => {
		downloadStream
			.pipe(csv.parse({ headers: true }))
			.on('error', (error) => {
				console.log('ignoring invalid data: ', error);
				reject(error);
			})
			.on('data', (row) => {
				const subscriptionName = row[SUBSCRIPTION_NAME];
				if (holidaySuspensions.has(subscriptionName)) return;
				const selectedExporter =
					exporters.find((exporter) => exporter.useForRow(row)) || rowExporter;
				selectedExporter.processRow(row);
			})
			.on('end', (rowCount: number) => {
				console.log(`Successfully written ${rowCount} rows`);
				exporters.map((exporter) => {
					exporter.end();
				});
				resolve();
			});
	});

	await writableCsvPromise;
	const uploads = exporters.map(async (exporter) => {
		const outputFileName = generateFilename(deliveryDate, 'WEEKLY');
		/**
		 * WARNING: Although AWS S3.upload docs seem to indicate we can upload a stream object directly via
		 * 'Body: stream' params field, it does not seem to work with the stream provided by csv-parser,
		 * thus we had to convert the stream to string using get-stream package.
		 */
		const streamAsString = await getStream(exporter.writeCSVStream);
		await upload(streamAsString, outputFileName, exporter.folder);
		return outputFileName;
	});
	return Promise.all(uploads);
}