UNPKG

ckeditor5-google-do

Version:

Google Cloud and DigitalOcean Spaces upload plugin for ckeditor5

159 lines (141 loc) 4.02 kB
const express = require('express'); const app = express(); const rp = require('request-promise'); // Credentials const fs = require('fs'); const dotenv = require('dotenv'); const envConfig = dotenv.parse(fs.readFileSync('./config/dev.env')); // Override process.env by default will skip pre-existing variables // e.g. GOOGLE_APPLICATION_CREDENTIALS set by gcloud etc not recommended but necessary in my case // use require('dotenv').config({ path: './config/dev.env' }); instead for (var k in envConfig) { process.env[k] = envConfig[k]; } const keys = require('./config/keys'); // Google Cloud Storage requirements const Storage = require('@google-cloud/storage'); const storage = Storage({ keyFilename: keys.s3.keyfile }); // DigitalOcean/AWS requirements const AWS = require('aws-sdk'); const spacesEndpoint = new AWS.Endpoint(keys.s3.endpoint); const s3 = new AWS.S3({ accessKeyId: keys.s3.accessKeyId, secretAccessKey: keys.s3.secretAccessKey, signatureVersion: keys.s3.signature, region: keys.s3.region, endpoint: spacesEndpoint // DO Spaces specific }); app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); next(); }); /* * Google Cloud Storage Buckets get pre-signed url */ app.get('/api/upload-google', (req, res) => { // const filename = 'File to access, e.g. file.txt'; const filename = `${req.query.filename}`; // These options will allow temporary read access to the file const options = { action: keys.s3.policy, expires: keys.s3.expiry, contentType: req.query.filetype }; // These options will set the parameters for the request to AppEngine let uri = `${keys.s3.endpoint}/${keys.s3.bucket}/${filename}`; if (req.query.mode == 'serve') { uri = `https://${keys.project_id}.appspot.com/?name=${filename}&size=${ keys.default_size }&crop=${keys.default_crop}`; } // Get a signed URL for the file storage .bucket(keys.s3.bucket) .file(filename) .getSignedUrl(options) .then(async results => { const url = results[0]; res.send({ endpoint_url: url, location: uri, acl: keys.s3.policy }); }) .catch(err => { console.error('ERROR:', err); }); }); /* * Google App Engine create ServingUrl */ app.get('/api/serve', async (req, res) => { const filename = `${req.query.filename}`; const uri = `https://${keys.project_id}.appspot.com/?name=${filename}&size=${ keys.default_size }&crop=${keys.default_crop}`; const dynImageOptions = { method: 'GET', uri: uri, json: true }; try { const dynImageService = await rp(dynImageOptions); res.send({ serveUrl: dynImageService.url, blobkey: dynImageService.blobkey.blobKey }); } catch (err) { console.error('ERROR:', err); res.status(500).json({ error: "Oh no! We've encountered an error!" }); } }); /* * Google App Engine delete ServingUrl */ app.delete('/api/serve', async (req, res) => { const blobkey = `${req.query.key}`; const uri = `https://${keys.project_id}.appspot.com?key=${blobkey}`; const dynImageOptions = { method: 'DELETE', uri: uri, body: { key: blobkey }, json: true }; try { const dynImageService = await rp(dynImageOptions); res.send({ success: true }); } catch (err) { console.error('ERROR:', err); res.status(500).json({ error: "Oh no! We've encountered an error!" }); } }); /* * DigitalOcean Spaces get pre-signed url */ app.get('/api/upload-do', (req, res) => { const key = `${req.query.filename}`; // Get a signed URL for the file s3.getSignedUrl( 'putObject', { Bucket: keys.s3.bucket, ContentType: req.query.filetype, Key: key, ACL: keys.s3.policy }, (err, url) => res.send({ endpoint_url: url, location: `https://${keys.s3.bucket}.${keys.s3.endpoint}/${key}`, acl: keys.s3.policy }) ); }); const PORT = process.env.PORT || 5000; app.listen(PORT);