methods/content/saveContentItem.js

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

/**
 * Saves a content item.
 * @memberof AgilityManagement.Client.Content
 * @param {Object} requestParams - The paramaters for the API request.
 * @param {AgilityManagement.Types.ContentItem} requestParams.contentItem - The contentItem to be saved.
 * @param {string} requestParams.languageCode - The language code of the content you want to retrieve.
 * @param {string} requestParams.referenceName - The referenceName of the list or single item that you are updating.

 * @returns {Promise<number>} - Returns the contentID.
 * @example
 *
 * import agilityMgmt from '@agility/content-management'
 *
 * #Create a new instance API client
 * const api = agilityMgmt.getApi({
 *   location: 'MyLocation',
 *   websiteName: 'MyWebsiteName',
 *   securityKey: 'MySecurityKey'
 * });
 * 
 * #Set the contentItem structure
 * #Important: The fields are not camel case - make sure the field names match EXACTLY with your content definition in Agility instance
 * #The example below shows how to structure your fields with simple types and nested objects
 * let contentItem = {
 *  contentID: -1,
 *  fields: {
 *   "Title": "Test Title",
 *   "Image": {
 *    "mediaID": 123,
 *    "label": "Test Image"
 *   }
 *  }
 * }
 * 
 * #Set language code and reference name of content you want to save
 * let languageCode = "en-us";
 * let referenceName = "MyReferenceName";
 * 
 * api.saveContentItem({
 *  contentItem,
 *  languageCode,
 *  referenceName
 * })
 * .then(function(contentID) {
 *  #check contentID is greater > 0 for success
 *  #update contentID of saved item
 *  contentIDToWorkOn = contentID;
 * })
 * .catch(function(error) {
 *  #handle error
 * });
 * 
 * 
*/

function saveContentItem(requestParams) {

	validateRequestParams(requestParams);

	const args = {
		"contentID": requestParams.contentItem.contentID,
		"languageCode": requestParams.languageCode,
		"referenceName": requestParams.referenceName
	}

	const methodName = "SaveContentItem";

	const {fields, attachments} = pulloutAttachments(requestParams.contentItem);

	let encodedContentItem = JSON.stringify(fields)
	let attachmentsEncoded = JSON.stringify(attachments);

	const form = new FormData()
	form.append("contentItem", encodedContentItem);
	form.append("attachments", attachmentsEncoded);

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

    return this.makeRequest(req);
}

function validateRequestParams(requestParams) {
    if(!requestParams.languageCode) {
		throw new TypeError('You must include a languageCode in your request params.')
	} else if(!requestParams.contentItem) {
		throw new TypeError('You must include a contentItem object in your request params.');
	} else if(!requestParams.contentItem.contentID) {
		throw new TypeError('You must include a contentItem.contentID number in your request params.');
    } else {
        return;
    }
}

function pulloutAttachments(contentItem)
{

	let fields = {};
	let attachments= [];

	for (const fieldName in contentItem.fields) {
		if (contentItem.fields.hasOwnProperty(fieldName)) {
			const value = contentItem.fields[fieldName];

			if (value.mediaID !== undefined || value.clearAttachment !== undefined) {

				//this is an attachment...
				attachments.push({
					managerID: fieldName,
					AssetMediaID: value.mediaID,
					clearAttachment: value.clearAttachment,
					label: value.label
				});

			} else {
				//regular field...
				fields[fieldName] = value;

			}

		}
	}

	return {fields, attachments };

}


export default saveContentItem;