API Docs for: 0.9.1
Show:

File: lib/service/endPoint.js

var ServiceObject = require('./abstract/serviceObject');

var ServiceNewEntry = require('./newEntry');
var ServiceEntry = require('./entry');
var ServiceList = require('./list');

var _ = require('underscore');

/**
 * @class ServiceEndPoint
 * @extends ServiceObject
 *
 * @property {string} _moduleName
 */
var ServiceEndPoint = ServiceObject.extend(

	{
		/**
		 * Gets the singular module identifier
		 *
		 * @method getSingularModuleName
		 * @return {string}
		 */
		getSingularModuleName: function () {
			return this.constructor.moduleNames.singular;
		},

		/**
		 * Gets the plural module identifier
		 *
		 * @method getPluralModuleName
		 * @return {string}
		 */
		getPluralModuleName: function () {
			return this.constructor.moduleNames.plural;
		},


		/**
		 * Gets a list of fields available
		 *
		 * @method getFields
		 * @return {string[]}
		 */
		getFields: function () {
			return _.keys(this.constructor.fields);
		},

		/**
		 * Checks if a field is available
		 *
		 * @method hasField
		 * @param {string} field
		 * @return {boolean}
		 */
		hasField: function (field) {
			return (this.getFields().indexOf(field) !== -1);
		},

		/**
		 * Gets details field information
		 *
		 * @method getFieldInfo
		 * @param {string} field
		 * @return {object}
		 */
		getFieldInfo: function (field) {

			if (!this.hasField(field)) {
				throw new Error('Field ' + field + ' cannot be found');
			}

			return this.constructor.fields[field];
		},


		/**
		 * Retrieves a new entry object
		 *
		 * @method newEntry
		 * @param {object} [entry]
		 * @return {ServiceEntry}
		 */
		newEntry: function (entry) {
			var Class = this.constructor.objects.NewEntry;
			return new Class(entry, this._getChildOptions());
		},

		/**
		 * Retrieves a list object
		 *
		 * @method loadList
		 * @param {ServiceEntry[]} items
		 * @param {object} [options]
		 * @return {ServiceList}
		 */
		loadList: function (items, options) {
			var localOptions = this._getChildOptions(),
				Class = this.constructor.objects.List;

			localOptions.container = options.container;
			return new Class(items, localOptions);
		},

		/**
		 * Retrieves an entry object
		 *
		 * @method loadEntry
		 * @param {object} entry
		 * @param {object} [options]
		 * @return {ServiceEntry}
		 */
		loadEntry: function (entry, options) {
			var localOptions = this._getChildOptions(),
				Class = this.constructor.objects.Entry;

			localOptions.container = options.container;
			return new Class(entry, localOptions);
		},


		/**
		 * Gets the options for children
		 *
		 * @method _getChildOptions
		 * @return {object}
		 * @private
		 */
		_getChildOptions: function () {
			return {
				request: this.getRequest(),
				service: this.getService(),
				endPoint: this
			};
		},


		/**
		 * Removes an item
		 *
		 * @method removeItem
		 * @param {string} id
		 * @return {Promise} With {string} id
		 */
		removeItem: function (id) {
			var url = encodeURIComponent(this.getPluralModuleName()) + '/' + encodeURIComponent(id);
			this.getRequest().sendRequest("DELETE", url).then(function () {
				return id;
			});
		},

		/**
		 * Gets a list of items
		 *
		 * @method getAllItems
		 * @param {object} [options]
		 * @return {Promise} With {ServiceList}
		 */
		getAllItems: function (options) {
			var url = encodeURIComponent(this.getPluralModuleName()),
				components = [],
				localOptions = options || {},
				keys = _.keys(localOptions);

			if (keys.length > 0) {
				url += '?';
			}
			_.each(keys, function (key) {
				components.push(encodeURIComponent(key) + '=' + encodeURIComponent(localOptions[key]));
			}, this);
			if (keys.length > 0) {
				url += components.join('&');
			}

			return this.getRequest().sendRequest("GET", url).then(function (data) {
				var container = this.getService().parse(data),
					moduleName = this.getPluralModuleName(),
					moduleList = container.getModuleList(moduleName);

				return moduleList;
			}.bind(this));
		},

		/**
		 * Gets an item
		 *
		 * @method getItem
		 * @param {string} id
		 * @return {Promise} With {ServiceEntry}
		 */
		getItem: function (id) {
			var url = encodeURIComponent(this.getPluralModuleName()) + '/' + encodeURIComponent(id);

			return this.getRequest().sendRequest("GET", url).then(function (data) {
				var container = this.getService().parse(data),
					moduleName = this.getPluralModuleName(),
					moduleList = container.getModuleList(moduleName);

				return moduleList.getItem(id);
			}.bind(this));
		},

		/**
		 * Queries a list of items
		 *
		 * @method queryItems
		 * @param {string} query
		 * @param {object} [options]
		 * @return {Promise} With {ServiceList}
		 */
		queryItems: function (query, options) {
			var url = encodeURIComponent(this.getPluralModuleName()) + '?',
				components = [],
				localOptions = options || {
					query: query
				},
				keys = _.keys(localOptions);

			keys.push('query');
			_.each(keys, function (key) {
				components.push(encodeURIComponent(key) + '=' + encodeURIComponent(localOptions[key]));
			}, this);
			if (keys.length > 0) {
				url += components.join('&');
			}

			return this.getRequest().sendRequest("GET", url).then(function (data) {
				var container = this.getService().parse(data),
					moduleName = this.getPluralModuleName(),
					moduleList = container.getModuleList(moduleName);

				return moduleList;
			}.bind(this));
		}
	},
	{
		/**
		 * @property TYPE
		 * @type {string}
		 * @static
		 */
		TYPE: 'ServiceEndPoint',

		moduleNames: {
			singular: null,
			plural: null
		},

		objects: {
			NewEntry: ServiceNewEntry,
			Entry: ServiceEntry,
			List: ServiceList
		},

		fields: {},

		RELATION_ONE_TO_ONE: 'oneToOne',
		RELATION_ONE_TO_MANY: 'oneToMany'
	}
);

module.exports = ServiceEndPoint;