UNPKG

strapi-provider-upload-filerobot

Version:

Strapi v3 upload provider for Filerobot by Scaleflex

216 lines (171 loc) 6.16 kB
'use strict'; const fetch = require("node-fetch"); const fs = require('fs'); const localUpload = require('strapi-provider-upload-local'); module.exports = { init(config) { const filerobotApiDomain = 'https://api.filerobot.com'; const removeQueryParam = (link, paramName) => { var url = new URL(link); var params = new URLSearchParams(url.search); params.delete(paramName); var newUrl = params.toString() ? `${url.origin}${url.pathname}?${params.toString()}` : `${url.origin}${url.pathname}`; return newUrl; } const adjustForCname = (link, configs) => { if (!configs.cname) { return link; } link = link.replace(`https://${configs.token}.filerobot.com/v7`, `https://${configs.cname}`); return link; } const getConfigs = async () => { var pluginStore = strapi.store({ environment: strapi.config.environment, type: 'plugin', name: 'filerobot' }); var configs = await pluginStore.get({key:'options'}); return configs; } const getFilerobotUploader = (base64, file, configs) => { const uploadImage = async () => { var uploadHeaders = new fetch.Headers(); uploadHeaders.append("Content-Type", "application/json"); uploadHeaders.append("X-Filerobot-Key", configs.sass); var raw = JSON.stringify({ "name": file.name, "data": base64, "postactions": "decode_base64" }); var uploadRequestOptions = { method: 'POST', headers: uploadHeaders, body: raw }; var response = await fetch(`${filerobotApiDomain}/${configs.token}/v4/files?folder=/${configs.folder}`, uploadRequestOptions); var data = await response.json(); if (data.status !== 'success') { throw new Error('System Error: Upload API call to Filerobot went wrong.'); } var url = data.file.url.cdn; url = removeQueryParam(url, 'vh'); url = adjustForCname(url, configs); file.url = url; file.hash = data.file.hash.sha1; file.alternativeText = data.file.uuid; } return uploadImage(); } const getSass = async (configs) => { var headers = new fetch.Headers(); headers.append("Content-Type", "application/json"); var requestOptions = { method: 'GET', headers: headers }; if (typeof(Storage) !== "undefined" && sessionStorage.getItem("sassKey")) { // Have in-browser Sass Key var sass = sessionStorage.getItem("sassKey"); var headers = new fetch.Headers(); headers.append("Content-Type", "application/json"); headers.append("X-Filerobot-Key", sass); var requestOptions = { method: 'GET', headers: headers, redirect: 'follow' }; var response = await fetch(`${filerobotApiDomain}/${configs.token}/v4/files/`, requestOptions); var data = await response.json(); if (data.code !== 'KEY_EXPIRED' && data.code !== 'UNAUTHORIZED') { // In-browser Sass Key still valid return sass; } else { // Need another new Sass Key var sass = await getNewSass(configs, requestOptions); return sass; } } else { // Need first Sass Key var sass = await getNewSass(configs, requestOptions); return sass; } } const getNewSass = async (configs, requestOptions) => { var response = await fetch(`${filerobotApiDomain}/${configs.token}/key/${configs.sec_temp}`, requestOptions); var data = await response.json(); if (data.status !== 'success') { throw new Error('System Error: SASS API call to Filerobot went wrong.'); } var sass = data.key; if (typeof(Storage) !== "undefined") { sessionStorage.setItem("sassKey", sass); } return sass; } return { async uploadStream(file) { var filerobotConfigs = await getConfigs(); filerobotConfigs = JSON.parse(filerobotConfigs); if (!filerobotConfigs) { return localUpload.init().upload(file); } var sass = await getSass(filerobotConfigs); filerobotConfigs.sass = sass; var base64 = fs.readFileSync((file.stream.path), {encoding: 'base64'}); return getFilerobotUploader(base64, file, filerobotConfigs); }, async upload(file) { var filerobotConfigs = await getConfigs(); filerobotConfigs = JSON.parse(filerobotConfigs); if (!filerobotConfigs) { return localUpload.init().upload(file); } var sass = await getSass(filerobotConfigs); filerobotConfigs.sass = sass; var base64 = file.buffer.toString('base64'); return getFilerobotUploader(base64, file, filerobotConfigs); }, async delete(file) { var filerobotConfigs = await getConfigs(); filerobotConfigs = JSON.parse(filerobotConfigs); if (!filerobotConfigs) { return localUpload.init().delete(file); } var sass = await getSass(filerobotConfigs); //if (file.id) //{ // Ignore Strapi CMS's size variations var headers = new fetch.Headers(); headers.append("Content-Type", "application/json"); headers.append("X-Filerobot-Key", sass); var deleteOptions = { method: 'DELETE', headers: headers, redirect: 'follow' }; var response = await fetch(`${filerobotApiDomain}/${filerobotConfigs.token}/v4/files/${file.alternativeText}`, deleteOptions); var result = await response.text(); console.log(result); //} }, }; }, };