methods/media/uploadMedia.js

import FormData from 'form-data'
import { buildAPIUrl, buildAuthHeader } from '../../utils'

/**
 * Uploads a file to the media repository.
 * @memberof AgilityManagement.Client.Media
 * @param {Object} requestParams - The paramaters for the API request.
 * @param {string} requestParams.fileName - The name of the file.
 * @param {object} requestParams.fileContent - The contents of the file.
 * @param {string} [requestParams.mediaFolder] - (Optional) The folder to upload the file to.
 *
 * @returns {Promise<AgilityManagement.Types.MediaReturn>} - Returns the mediaObj.
 * @example
 *
 * import agilityMgmt from '@agility/content-management'
 *
 * #Create a new instance API client
 * const api = agilityMgmt.getApi({
 *   location: 'MyLocation',
 *   websiteName: 'MyWebsiteName',
 *   securityKey: 'MySecurityKey'
 * });
 * 
 * 
 * #Create media stream, save blob variable and set filename
 * let blob = fs.createReadStream('./test/sample/logo.png')
 * let filename = `test-${new Date().toISOString().replace(/\./g, "").replace(/:/g, "")}.png`;
 * 
 * api.uploadMedia({
 *  fileName: filename,
 *  fileContent: blob
 * })
 * .then(function(mediaObj) {
 *  #check if media is not null/empty and has valid url for success
 * })
 * .catch(function(error) {
 *  #handle error
 * });
 *
*/

function uploadMedia(requestParams) {

	validateRequestParams(requestParams);

	if (! requestParams.mediaFolder) requestParams.mediaFolder = ""

	const args = {
		"folder": requestParams.mediaFolder
	}

	const methodName = "UploadMedia";

	//prep the file upload...
	const form = new FormData()
	form.append("uploadedfile", requestParams.fileContent, requestParams.fileName)

    const req = {
        url: buildAPIUrl({methodName, args}),
        method: 'post',
        baseURL: this.config.baseURL,
        headers: { ... buildAuthHeader({config:this.config, methodName, args}), ... form.getHeaders() },
        data: form
    };

	let promise = new Promise((resolve, reject) => {

		this.makeRequest(req)
			.then(function(resData) {
				if (resData && resData.MediaID) {
					const m = {
						mediaID: resData.MediaID,
						url: resData.Url,
						size: resData.Size,
						contentType: resData.ContentType
					}
					resolve(m);
				} else {
					reject(new Error("The UploadMedia call did not return the expected value."))
				}
			})
			.catch(function(err) {
				reject(err);
			});

	});

	return promise;

}

function validateRequestParams(requestParams) {
    if(!requestParams.fileName) {
		throw new TypeError('You must include a fileName in your request params.')
	} else if(! requestParams.fileContent) {
		throw new TypeError('You must include a fileContent Blob object in your request params.');
	} else {
        return;
    }
}

export default uploadMedia;