net_userDatumAuxiliaryUrlHelperMixin.js

import UrlHelper from "./urlHelper.js";
import UserUrlHelperMixin from "./userUrlHelperMixin.js";
import { timestampFormat } from "../format/date.js";
import PropMap from "../util/propMap.js";

/**
 * Create a UserDatumAuxiliaryUrlHelperMixin class.
 *
 * @param {module:net~UrlHelper} superclass the UrlHelper class to mix onto
 * @return {module:net~UserDatumAuxiliaryUrlHelperMixin} the mixin class
 */
const UserDatumAuxiliaryUrlHelperMixin = (superclass) =>
	/**
	 * A mixin class that adds user datum auxiliary support to {@link module:net~UrlHelper}.
	 *
	 * @mixin
	 * @alias module:net~UserDatumAuxiliaryUrlHelperMixin
	 */
	class extends superclass {
		userDatumAuxiliaryBaseUrl() {
			return this.baseUrl() + "/datum/auxiliary";
		}

		/**
		 * Generate a URL for viewing the configured user's metadata via a `GET` request.
		 *
		 * @param {module:domain~DatumFilter} filter the search criteria
		 * @returns {string} the URL
		 */
		listUserDatumAuxiliaryUrl(filter) {
			let result = this.userDatumAuxiliaryBaseUrl();
			if (filter) {
				const params = filter.toUriEncoding();
				if (params.length > 0) {
					result += "?" + params;
				}
			}
			return result;
		}

		/**
		 * Generate a URL for accessing a specific `DatumAuxiliaryType` by its primary key.
		 *
		 * If `sourceId` contains any `/` characters, then {@link module:net~UserDatumAuxiliaryUrlHelperMixin#userDatumAuxiliaryIdQueryUrl}
		 * will be invoked instead.
		 *
		 * @param {module:domain~DatumAuxiliaryType} type the datum auxiliary type
		 * @param {number} nodeId the node ID
		 * @param {Date} date a date
		 * @param {string} sourceId the source ID
		 * @returns {string} the URL
		 */
		userDatumAuxiliaryIdUrl(type, nodeId, date, sourceId) {
			if (sourceId && sourceId.indexOf("/") >= 0) {
				// force use of query parameters if source ID has slash characters
				return this.userDatumAuxiliaryIdQueryUrl(type, nodeId, date, sourceId);
			}
			let result = this.userDatumAuxiliaryBaseUrl();
			result +=
				"/" +
				encodeURIComponent(type.name ? type.name : type) +
				"/" +
				encodeURIComponent(nodeId) +
				"/" +
				encodeURIComponent(timestampFormat(date)) +
				"/" +
				encodeURIComponent(sourceId);
			return result;
		}

		/**
		 * Generate a URL for accessing a specific `DatumAuxiliaryType` by its primary key,
		 * using query parameters for id components.
		 *
		 * @param {module:domain~DatumAuxiliaryType} type the datum auxiliary type
		 * @param {number} nodeId the node ID
		 * @param {Date} date a date
		 * @param {string} sourceId the source ID
		 * @returns {string} the URL
		 */
		userDatumAuxiliaryIdQueryUrl(type, nodeId, date, sourceId) {
			let result = this.userDatumAuxiliaryBaseUrl();
			let props = new PropMap({
				type: type,
				nodeId: nodeId,
				date: timestampFormat(date),
				sourceId: sourceId,
			});
			let query = props.toUriEncoding();
			if (query.length > 0) {
				result += "?" + query;
			}
			return result;
		}

		/**
		 * Generate a URL for storing a `DatumAuxiliaryType` via a `POST` request.
		 *
		 * The {@link module:net~UserDatumAuxiliaryUrlHelperMixin#userDatumAuxiliaryIdUrl} method is used
		 * to generate the URL.
		 *
		 * @param {module:domain~DatumAuxiliaryType} type the datum auxiliary type
		 * @param {number} nodeId the node ID
		 * @param {Date} date a date
		 * @param {string} sourceId the source ID
		 * @returns {string} the URL
		 */
		storeUserDatumAuxiliaryUrl(type, nodeId, date, sourceId) {
			return this.userDatumAuxiliaryIdUrl(type, nodeId, date, sourceId);
		}

		/**
		 * Generate a URL for viewing a `DatumAuxiliaryType` via a `GET` request.
		 *
		 * The {@link module:net~UserDatumAuxiliaryUrlHelperMixin#userDatumAuxiliaryIdUrl} method is used
		 * to generate the URL.
		 *
		 * @param {module:domain~DatumAuxiliaryType} type the datum auxiliary type
		 * @param {number} nodeId the node ID
		 * @param {Date} date a date
		 * @param {string} sourceId the source ID
		 * @returns {string} the URL
		 */
		viewUserDatumAuxiliaryUrl(type, nodeId, date, sourceId) {
			return this.userDatumAuxiliaryIdUrl(type, nodeId, date, sourceId);
		}

		/**
		 * Generate a URL for deleting a `DatumAuxiliaryType` via a `DELETE` request.
		 *
		 * The {@link module:net~UserDatumAuxiliaryUrlHelperMixin#userDatumAuxiliaryIdUrl} method is used
		 * to generate the URL.
		 *
		 * @param {module:domain~DatumAuxiliaryType} type the datum auxiliary type
		 * @param {number} nodeId the node ID
		 * @param {Date} date a date
		 * @param {string} sourceId the source ID
		 * @returns {string} the URL
		 */
		deleteUserDatumAuxiliaryUrl(type, nodeId, date, sourceId) {
			return this.userDatumAuxiliaryIdUrl(type, nodeId, date, sourceId);
		}
	};

/**
 * A concrete {@link module:net~UrlHelper} with the {@link module:net~UserDatumAuxiliaryUrlHelperMixin}
 * and {@link module:net~UserUrlHelperMixin} mixins.
 *
 * @mixes module:net~UserDatumAuxiliaryUrlHelperMixin
 * @mixes module:net~UserUrlHelperMixin
 * @extends module:net~UrlHelper
 * @alias module:net~UserDatumAuxiliaryUrlHelper
 */
class UserDatumAuxiliaryUrlHelper extends UserDatumAuxiliaryUrlHelperMixin(
	UserUrlHelperMixin(UrlHelper),
) {}

export default UserDatumAuxiliaryUrlHelperMixin;
export { UserDatumAuxiliaryUrlHelper };