import moment from 'moment' import * as uuid from 'uuid' import { Storage, File } from '@google-cloud/storage' const projectId = process.env.PROJECT_ID const serviceAccountFilename = process.env.KEY_FILENAME const bucketName = process.env.FILES_BUCKET_NAME const storage = new Storage({ projectId, keyFilename: serviceAccountFilename }) function getFileName(file, index) { return `walter/upload/${moment().unix()}-${uuid.v4()}-${file[index].name .replace(/[&/\\#,+()$~%.'":*?<>{}];/g, '') .replace(/#/g, '') .replace(/&/g, '') .split('.') .slice(0, -1) .join('') .trim()}` } export async function uploadFiles(files) { const uploadedFiles = await Promise.all( Object.keys(files).map((key) => { return uploadBuffer({ requestFile: files[key], name: getFileName(files, key), }) }) ) return uploadedFiles.map((file: any) => ({ ...file, url: file.mediaLink, })) } function uploadBuffer({ requestFile, name = `walter/${moment().unix()}_${uuid.v4()}` }) { const bucket = storage.bucket(bucketName) const file = bucket.file(name) const blobStream = file.createWriteStream() return new Promise((resolve, reject) => { blobStream.end(requestFile.data) blobStream.on('finish', () => { resolve(file) }) blobStream.on('error', (err) => { reject(err) }) }).then(async (file: Partial) => { await file.setMetadata({ contentType: requestFile.mimetype }) return getMetadata(file.name, bucket.name) }) } async function getMetadata(filename, bucketname) { const [metadata] = await storage.bucket(bucketname).file(filename).getMetadata() return metadata } export async function uploadLocalFile(filePath: string) { const [file] = await storage.bucket(bucketName).upload(filePath, { gzip: true, metadata: { cacheControl: 'no-cache', }, }) return file } export async function makePublic(files) { for await (const file of files) { await storage.bucket(bucketName).file(file.name).makePublic() } }