Skip to content

Instantly share code, notes, and snippets.

@bainfu
Last active March 23, 2021 21:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bainfu/b1d812a1201dc4827dbfe10e846e1e6f to your computer and use it in GitHub Desktop.
Save bainfu/b1d812a1201dc4827dbfe10e846e1e6f to your computer and use it in GitHub Desktop.
Realm Serverless Cloudinary Upload Function
exports = async (bsonFileData, fileName, venueId) => {
// Define dependencies
const axios = require('axios');
const crypto = require('crypto');
// Define Variables from context
const cloud_name = context.values.get("cloudinaryAccount"); // <-- Cloudinary Account Name
const api_key = context.values.get("cloudinaryApiKey"); // <-- Cloudinary Public API Key
const api_secret = context.values.get("cloudinarySecretApiKey"); // <-- Links to Secret: Cloudinary Secret API Key
if (cloud_name === undefined || api_key === undefined || api_secret === undefined) {
console.log(`Context Values / Secrets not defined.`);
throw new Error('Realm Application not setup correctly');
}
// Define Reusable function - eventually replace in library?
const createCloudinarySignature = (uploadParameters) => {
var input = '';
const exclusionList = ['file', 'cloud_name', 'resource_type', 'api_key', 'api_secret'];
Object.keys(uploadParameters)
.filter((key) => !exclusionList.includes(key))
.sort()
.forEach((key) => {
input += `${input !== '' ? '&' : ''}${key}=${uploadParameters[key]}`;
});
console.log(`Signature Input: ${input}`);
// Adding the Signature...
input += `${uploadParameters.api_secret}`;
const signature = crypto.createHash('sha256').update(input).digest('hex');
console.log(`Signature received: ${signature}`);
return signature;
};
// Begin core sequence...
console.log(`File Upload Data from BSON received!`);
let file = bsonFileData.join('');
console.log(`Beyond concatenation...`);
// Additional Values
const public_id = fileName;
const folder = venueId;
const resource_type = 'image';
const overwrite = true;
const timestamp = Date.now();
const uploadParameters = {
api_key,
api_secret,
file,
folder,
cloud_name,
resource_type,
public_id,
overwrite,
timestamp
};
const signature = createCloudinarySignature(uploadParameters);
uploadParameters.signature = signature;
const hostname = `api.cloudinary.com`;
const path = `/v1_1/${cloud_name}/${resource_type}/upload`;
const imageUrl = `https://${hostname}${path}`;
console.log(`About to upload to: ${imageUrl}`);
try {
const response = await axios.post(imageUrl, { file, folder, public_id, overwrite, timestamp, signature, api_key });
const { asset_id, created_at, format, overwritten, secure_url, url, version } = response.data;
console.log(`AssetID: ${asset_id}`);
console.log(`Created At: ${created_at}`);
console.log(`format: ${format}`);
console.log(`secure_url: ${secure_url}`);
console.log(`url: ${url}`);
console.log(`version: ${version}`);
console.log(`overwritten: ${overwritten}`);
return response.data;
} catch (reason) {
console.log(`Caught an error ${reason}`);
return reason;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment