synt_backend
Version:
Synt light-weight node backend service
67 lines (61 loc) • 1.79 kB
JavaScript
const { formidable } = require("formidable");
import { uploadFileToBucket } from "./upload";
export function handleFormidableForm(req) {
return new Promise((resolve, reject) => {
let formFiles;
let formData = {};
const form = formidable({ multiples: true }); // multipart required
form.parse(req, async (err, fields, files) => {
if (err) {
reject(err);
}
formFiles = files.files;
});
form.on("field", (fieldName, fieldValue) => {
let value;
try {
value = JSON.parse(fieldValue);
} catch (error) {
value = fieldValue;
}
formData[fieldName] = value;
});
form.once("end", () => {
console.log("done");
resolve({ formFiles, formData });
});
});
}
export async function uploadFiles(formFiles, formData, bucket, callback) {
// handle form and check fields
let calls = [];
console.log("Uploading files");
// If formFiles is not an array, convert it to an array containing a single File object
if (!Array.isArray(formFiles)) {
formFiles = [formFiles];
}
formFiles.forEach((f) =>
calls.push(
new Promise((resolve, reject) => {
uploadFileToBucket(f, bucket)
.then((response) => {
if (response.success) {
resolve(response.File);
} else {
reject(response);
}
})
.catch((err) => reject(err));
})
)
);
// make sure all calls are done before callback
let Files = await Promise.all(calls);
formData.Files = Files;
callback(formData);
}
export async function uploadFilesAsync(formFiles, formData, bucket) {
return new Promise((resolve) => {
uploadFiles(formFiles, formData, bucket, (formData) => resolve(formData));
});
}