import { v4 as uuidv4 } from 'uuid'; import Axios from 'axios'; import { baseURLApi } from '../../config'; function extractExtensionFrom(filename) { if (!filename) { return null; } const regex = /(?:\.([^.]+))?$/; return regex.exec(filename)[1]; } export default class FileUploader { static validate(file, schema) { if (!schema) { return; } if (schema.image) { if (!file.type.startsWith('image')) { throw new Error('You must upload an image'); } } if (schema.size && file.size > schema.size) { throw new Error('File is too big.'); } const extension = extractExtensionFrom(file.name); if (schema.formats && !schema.formats.includes(extension)) { throw new Error('Invalid format'); } } static async upload(path, file, schema) { try { this.validate(file, schema); } catch (error) { return Promise.reject(error); } const extension = extractExtensionFrom(file.name); const id = uuidv4(); const filename = `${id}.${extension}`; const privateUrl = `${path}/${filename}`; const publicUrl = await this.uploadToServer(file, path, filename); return { id: id, name: file.name, sizeInBytes: file.size, privateUrl, publicUrl, new: true, }; } static async uploadToServer(file, path, filename) { const formData = new FormData(); formData.append('file', file); formData.append('filename', filename); const uri = `/file/upload/${path}`; await Axios.post(uri, formData, { headers: { 'Content-Type': 'multipart/form-data', }, }); const privateUrl = `${path}/${filename}`; console.log( 'process.env.NODE_ENV in uploadToServer function', process.env.NODE_ENV, ); console.log('baseURLApi in uploadToServer function', baseURLApi); return `${baseURLApi}/file/download?privateUrl=${privateUrl}`; } }