src/lib/S3ToSalesforceUploader.ts (59 lines of code) (raw):

import { AWSError, S3 } from 'aws-sdk'; import type { Salesforce, Folder } from './salesforceAuthenticator'; import type { S3Folder } from './storage'; import { getObject } from './storage'; import util from 'util'; import { PromiseResult } from 'aws-sdk/lib/request'; export type sfDestination = { sfDescription: string; sfFolder: Folder; fileName: string; }; export type FileUpload = { destination: sfDestination; fileData: { file: PromiseResult<S3.GetObjectOutput, AWSError> }; }; export type UploadInfo = { source: S3Folder; destination: sfDestination; }; export async function uploadFiles( filesToUpload: UploadInfo[], salesforce: Salesforce, ) { const filesFromS3 = filesToUpload.map(async (fileToUpload) => { const fileData = await getFromS3(fileToUpload.source); return { destination: fileToUpload.destination, fileData: fileData, }; }); const s3files = await Promise.all(filesFromS3); const uploadResults = s3files.map((s3File) => uploadToSalesforce(s3File, salesforce), ); return Promise.all(uploadResults); } async function uploadToSalesforce(fUp: FileUpload, salesforce: Salesforce) { const folderName = fUp.destination.sfFolder.name; const sfFileName = fUp.destination.fileName; console.log(`Uploading to Salesforce ${folderName}/${sfFileName}`); const uploadResult = await salesforce.uploadDocument( sfFileName, fUp.destination.sfFolder, fUp.destination.sfDescription, fUp.fileData.file.Body, ); return { name: sfFileName, id: uploadResult.id }; } async function getFromS3(source: S3Folder) { try { const s3Path = source.prefix; const file = await getObject(s3Path); return { s3Path: s3Path, file: file }; } catch (err) { throw new Error( `Failed to download ${source.prefix} from S3 ${util.inspect(err)}`, ); } }