'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = createCdaApi;
var _space = require('./entities/space');
var _contentType = require('./entities/content-type');
var _entry = require('./entities/entry');
var _asset = require('./entities/asset');
var _sync = require('./sync');
var _sync2 = _interopRequireDefault(_sync);
var _createRequestConfig = require('./create-request-config');
var _createRequestConfig2 = _interopRequireDefault(_createRequestConfig);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @memberof CDAClient
* @typedef {Object} ClientAPI
* @prop {function} getSpace
* @prop {function} getContentType
* @prop {function} getContentTypes
* @prop {function} getEntry
* @prop {function} getEntries
* @prop {function} getAsset
* @prop {function} getAssets
* @prop {function} sync
*/
/**
* Contentful CDA API
* @namespace CDAClient
*/
/**
* @namespace Entities
*/
function errorHandler(error) {
if (error.data) {
throw error.data;
}
throw error;
}
/**
* Link resolution can be turned off for the methods that use it, or it can
* be turned off globally. The local setting overrides the global setting.
* @private
* @param {Object} query - regular query object used for collection endpoints
* @param {boolean} globalSetting - Global library setting for link resolution
*/
function shouldLinksResolve(query, globalSetting) {
return !!('resolveLinks' in query ? query.resolveLinks : globalSetting);
}
/**
* Creates CDA API object
* @private
* @param {Object} http - HTTP client instance
* @param {boolean} resolveLinksGlobalSetting - Global library setting for link resolution
* @return {ClientAPI}
*/
function createCdaApi(http, resolveLinksGlobalSetting) {
/**
* Gets the Space which the client is currently configured to use
* @memberof CDAClient
* @return {Promise<Entities.Space>} Promise for a Space
* @example
* client.getSpace()
* .then(space => console.log(space))
*/
function getSpace() {
return http.get('').then(function (response) {
return (0, _space.wrapSpace)(response.data);
}, errorHandler);
}
/**
* Gets a Content Type
* @memberof CDAClient
* @param {string} id
* @return {Promise<Entities.ContentType>} Promise for a Content Type
* @example
* client.getContentType('contentTypeId')
* .then(contentType => console.log(contentType))
*/
function getContentType(id) {
return http.get('content_types/' + id).then(function (response) {
return (0, _contentType.wrapContentType)(response.data);
}, errorHandler);
}
/**
* Gets a collection of Content Types
* @memberof CDAClient
* @param {Entities.Query=} query - Query object
* @return {Promise<Entities.ContentTypeCollection>} Promise for a collection of Content Types
* @example
* client.getContentTypes()
* .then(contentTypes => console.log(contentTypes.items))
*/
function getContentTypes() {
var query = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
return http.get('content_types', (0, _createRequestConfig2.default)({ query: query })).then(function (response) {
return (0, _contentType.wrapContentTypeCollection)(response.data);
}, errorHandler);
}
/**
* Gets an Entry
* @memberof CDAClient
* @param {string} id
* @return {Promise<Entities.Entry>} Promise for an Entry
* @example
* client.getEntry('entryId')
* .then(entry => console.log(entry))
*/
function getEntry(id) {
return http.get('entries/' + id).then(function (response) {
return (0, _entry.wrapEntry)(response.data);
}, errorHandler);
}
/**
* Gets a collection of Entries
* @memberof CDAClient
* @param {Object=} query - Object with search parameters. Check <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters">Search Parameters</a> for more details.
* @param {boolean=} query.resolveLinks - When true, links to other Entries or Assets are resolved. Default: true.
* @return {Promise<Entities.EntryCollection>} Promise for a collection of Entries
* @example
* client.getEntries({content_type: 'contentTypeId'})
* .then(entries => console.log(entries.items))
*/
function getEntries() {
var query = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var resolveLinks = shouldLinksResolve(query, resolveLinksGlobalSetting);
return http.get('entries', (0, _createRequestConfig2.default)({ query: query })).then(function (response) {
return (0, _entry.wrapEntryCollection)(response.data, resolveLinks);
}, errorHandler);
}
/**
* Gets an Asset
* @memberof CDAClient
* @param {string} id
* @return {Promise<Entities.Asset>} Promise for an Asset
* @example
* client.getAsset('assetId')
* .then(asset => console.log(asset))
*/
function getAsset(id) {
return http.get('assets/' + id).then(function (response) {
return (0, _asset.wrapAsset)(response.data);
}, errorHandler);
}
/**
* Gets a collection of Assets
* @memberof CDAClient
* @param {Object=} query - Object with search parameters. Check <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/search-parameters">Search Parameters</a> for more details.
* @return {Promise<Entities.AssetCollection>} Promise for a collection of Assets
* @example
* client.getAssets()
* .then(assets => console.log(assets.items))
*/
function getAssets() {
var query = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
return http.get('assets', (0, _createRequestConfig2.default)({ query: query })).then(function (response) {
return (0, _asset.wrapAssetCollection)(response.data);
}, errorHandler);
}
/**
* Synchronizes either all the content or only new content since last sync
* See <a href="https://www.contentful.com/developers/docs/concepts/sync/">Synchronization</a> for more information.
* @memberof CDAClient
* @param {Object} query - Query object for the sync call. One of initial or nextSyncToken always needs to be specified, but not both.
* @param {boolean?} query.initial - Indicates if this is the first sync. Use it if you don't have a sync token.
* @param {string?} query.nextSyncToken - The token you got the last time you used this method. Ensures you only get changed content.
* @param {string=} query.type - Filter by this type (Entry or Asset)
* @param {string=} query.content_type - Filter by this content type id
* @param {boolean=} query.resolveLinks - When true, links to other Entries or Assets are resolved. Default: true.
* @return {Promise<Sync.SyncCollection>} Promise for the collection resulting of a sync operation
* @example
* client.sync()
* .then(response => console.log(response.entries, response.assets, response.nextSyncToken))
*/
function sync() {
var query = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var resolveLinks = shouldLinksResolve(query, resolveLinksGlobalSetting);
return (0, _sync2.default)(http, query, resolveLinks);
}
return {
getSpace: getSpace,
getContentType: getContentType,
getContentTypes: getContentTypes,
getEntry: getEntry,
getEntries: getEntries,
getAsset: getAsset,
getAssets: getAssets,
sync: sync
};
}
/**
* System metadata. See <a href="https://www.contentful.com/developers/docs/references/content-delivery-api/#/introduction/common-resource-attributes">Common Resource Attributes</a> for more details.
* @memberof Entities
* @typedef Sys
* @prop {string} type
* @prop {string} id
* @prop {Entities.Link} space
* @prop {string} createdAt
* @prop {string} updatedAt
* @prop {number} revision
*/
/**
* Link to another entity. See <a href="https://www.contentful.com/developers/docs/concepts/links/">Links</a> for more details.
* @memberof Entities
* @typedef Link
* @prop {string} type - type of this entity. Always link.
* @prop {string} id
* @prop {string} linkType - type of this link. If defined, either Entry or Asset
*/
/**
* @namespace EntryFields
*/
/**
* @memberof EntryFields
* @typedef Symbol
* @type string
*/
/**
* @memberof EntryFields
* @typedef Text
* @type string
*/
/**
* @memberof EntryFields
* @typedef Integer
* @type number
*/
/**
* @memberof EntryFields
* @typedef Number
* @type number
*/
/**
* @memberof EntryFields
* @typedef Date
* @type string
*/
/**
* @memberof EntryFields
* @typedef Boolean
* @type boolean
*/
/**
* @memberof EntryFields
* @typedef Location
* @prop {string} lat - latitude
* @prop {string} lon - longitude
*/
/**
* A Field in an Entry can have one of the following types that can be defined in Contentful. See <a href="https://www.contentful.com/developers/docs/references/field-type/">Field Types</a> for more details.
* @memberof Entities
* @typedef Field
* @type EntryFields.Symbol | EntryFields.Text | EntryFields.Integer | EntryFields.Number | EntryFields.Date | EntryFields.Boolean | EntryFields.Location | Entities.Link | Array<EntryFields.Symbol|Entities.Link> | Object
*/