Skip to content

Commit

Permalink
feat(push-to-space): Add support for importing editor Interfaces (#71)
Browse files Browse the repository at this point in the history
  • Loading branch information
Khaledgarbaya committed Nov 10, 2016
1 parent 8b3aebc commit 03fb8ba
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 73 deletions.
148 changes: 77 additions & 71 deletions lib/push/push-to-space.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import Promise from 'bluebird'
import log from 'npmlog'
import {partial} from 'lodash/function'
import {defaults} from 'lodash/object'
import partial from 'lodash/partial'
import { defaults } from 'lodash/object'
import * as creation from './creation'
import * as publishing from './publishing'
import * as assets from './assets'
Expand All @@ -15,7 +15,10 @@ const DEFAULT_CONTENT_STRUCTURE = {
deletedEntries: [],
deletedAssets: [],
deletedContentTypes: [],
deletedLocales: []
deletedLocales: [],
webhooks: [],
editorInterfaces: []
// roles: []
}

/**
Expand All @@ -38,17 +41,7 @@ const DEFAULT_CONTENT_STRUCTURE = {
* - skipContentModel: synchronizes only entries and assets
* - skipContentPublishing: create content but don't publish it
*/
export default function ({
sourceContent,
destinationContent = {},
managementClient,
spaceId,
prePublishDelay,
contentModelOnly,
skipContentModel,
skipLocales,
skipContentPublishing
}) {
export default function ({sourceContent, destinationContent = {}, managementClient, spaceId, prePublishDelay, contentModelOnly, skipContentModel, skipLocales, skipContentPublishing}) {
if (contentModelOnly && skipContentModel) {
throw new Error('contentModelOnly and skipContentModel cannot be used together')
}
Expand All @@ -63,71 +56,84 @@ export default function ({
log.info('Pushing content to destination space')

return managementClient.getSpace(spaceId)
.then((space) => {
let result = Promise.resolve()
.then((space) => {
let result = Promise.resolve()

// Unpublish and delete Entries and Assets
if (!contentModelOnly) {
result = result
.then(partial(publishing.unpublishEntities, sourceContent.deletedEntries))
.delay(prePublishDelay)
.then(partial(deletion.deleteEntities, sourceContent.deletedEntries))

.then(partial(publishing.unpublishEntities, sourceContent.deletedAssets))
.delay(prePublishDelay)
.then(partial(deletion.deleteEntities, sourceContent.deletedAssets))
}

// Unpublish and delete Locales and Content Types
// Create and publish new Locales and Content Types
if (!skipContentModel) {
if (!skipLocales) {
// Unpublish and delete Entries and Assets
if (!contentModelOnly) {
result = result
.then(partial(deletion.deleteEntities, sourceContent.deletedLocales))
.then(partial(publishing.unpublishEntities, sourceContent.deletedEntries))
.delay(prePublishDelay)
.then(partial(deletion.deleteEntities, sourceContent.deletedEntries))

.then(partial(publishing.unpublishEntities, sourceContent.deletedAssets))
.delay(prePublishDelay)
.then(partial(deletion.deleteEntities, sourceContent.deletedAssets))
}

result = result
.then(partial(publishing.unpublishEntities, sourceContent.deletedContentTypes))
.delay(prePublishDelay)
.then(partial(deletion.deleteEntities, sourceContent.deletedContentTypes))
// Unpublish and delete Locales and Content Types
// Create and publish new Locales and Content Types
if (!skipContentModel) {
if (!skipLocales) {
result = result
.then(partial(deletion.deleteEntities, sourceContent.deletedLocales))
}

if (!skipLocales) {
result = result
.then(partial(creation.createEntities,
{space: space, type: 'Locale'}, sourceContent.locales, destinationContent.locales))
}
.then(partial(publishing.unpublishEntities, sourceContent.deletedContentTypes))
.delay(prePublishDelay)
.then(partial(deletion.deleteEntities, sourceContent.deletedContentTypes))

result = result
.then(partial(creation.createEntities,
{space: space, type: 'ContentType'}, sourceContent.contentTypes, destinationContent.contentTypes))
.delay(prePublishDelay)
.then(partial(publishing.publishEntities))
}
if (!skipLocales) {
result = result
.then(partial(creation.createEntities,
{space: space, type: 'Locale'}, sourceContent.locales, destinationContent.locales))
}
result = result
.then(partial(creation.createEntities,
{space: space, type: 'ContentType'}, sourceContent.contentTypes, destinationContent.contentTypes))
.delay(prePublishDelay)
.then(partial(publishing.publishEntities))
.then((contentTypes) => {
let contentTypesWithEditorInterface = contentTypes.map((contentType) => {
for (let editorInterface of sourceContent.editorInterfaces) {
if (editorInterface.sys.contentType.sys.id === contentType.sys.id) {
return space.getEditorInterfaceForContentType(contentType.sys.id).then((ctEditorInterface) => {
ctEditorInterface.controls = editorInterface.controls
return ctEditorInterface.update()
})
}
}
return Promise.resolve()
})
return Promise.all(contentTypesWithEditorInterface)
})
}

// Create and publish Assets and Entries
if (!contentModelOnly) {
result = result
.then(partial(creation.createEntities,
{space: space, type: 'Asset'}, sourceContent.assets, destinationContent.assets))
.delay(prePublishDelay)
.then(partial(assets.processAssets))
.delay(prePublishDelay)
.then((entities) => {
return skipContentPublishing
? Promise.resolve([])
: publishing.publishEntities(entities)
})
// Create and publish Assets and Entries
if (!contentModelOnly) {
result = result
.then(partial(creation.createEntities,
{space: space, type: 'Asset'}, sourceContent.assets, destinationContent.assets))
.delay(prePublishDelay)
.then(partial(assets.processAssets))
.delay(prePublishDelay)
.then((entities) => {
return skipContentPublishing
? Promise.resolve([])
: publishing.publishEntities(entities)
})

.then(partial(creation.createEntries,
{space: space, skipContentModel: skipContentModel}, sourceContent.entries, destinationContent.entries))
.delay(prePublishDelay)
.then((entities) => {
return skipContentPublishing
? Promise.resolve([])
: publishing.publishEntities(entities)
})
}
.then(partial(creation.createEntries,
{space: space, skipContentModel: skipContentModel}, sourceContent.entries, destinationContent.entries))
.delay(prePublishDelay)
.then((entities) => {
return skipContentPublishing
? Promise.resolve([])
: publishing.publishEntities(entities)
})
}

return result
})
return result
})
}
13 changes: 11 additions & 2 deletions test/push/push-to-space-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const creationMock = {
}

const publishingMock = {
publishEntities: sinon.stub().returns(Promise.resolve()),
publishEntities: sinon.stub().returns(Promise.resolve([])),
unpublishEntities: sinon.stub().returns(Promise.resolve())
}

Expand All @@ -22,6 +22,13 @@ const deletionMock = {
const assetsMock = {
processAssets: sinon.stub().returns(Promise.resolve())
}
const editorInterfaceMock = {
controls: [],
update: sinon.stub().returns(Promise.resolve())
}
const spaceMock = {
getEditorInterfaceForContentType: sinon.stub().returns(Promise.resolve(editorInterfaceMock))
}

const sourceResponse = {
deletedEntries: [],
Expand All @@ -31,6 +38,7 @@ const sourceResponse = {
locales: [],
contentTypes: [],
assets: [],
editorInterfaces: [],
entries: []
}

Expand All @@ -49,15 +57,16 @@ function setup () {
pushToSpace.__Rewire__('publishing', publishingMock)
pushToSpace.__Rewire__('deletion', deletionMock)
pushToSpace.__Rewire__('assets', assetsMock)
pushToSpace.__Rewire__('space', spaceMock)
}

function teardown () {
pushToSpace.__ResetDependency__('creation')
pushToSpace.__ResetDependency__('publishing')
pushToSpace.__ResetDependency__('deletion')
pushToSpace.__ResetDependency__('assets')
pushToSpace.__ResetDependency__('space')
}

test('Push content to destination space', (t) => {
setup()
pushToSpace({
Expand Down

0 comments on commit 03fb8ba

Please sign in to comment.