diff --git a/lib/entity.js b/lib/entity.js index 7a9246b3..268d930d 100644 --- a/lib/entity.js +++ b/lib/entity.js @@ -137,7 +137,8 @@ export const update = (http, type, params = {}) => { delete json.updated_by delete json.updated_at if (type) { - updateData[type] = json + updateData[type] = json; + if (type === "entry") updateData[type] = cleanAssets(updateData[type]); } else { updateData = json } @@ -309,3 +310,24 @@ export const move = (http, type, force = false, params = {}) => { } } } + +function isAsset (data) { + const element = (Array.isArray(data) && data.length > 0) ? data[0] : data; + return (!!element.file_size || !!element.content_type) && !!element.uid; +} + +export function cleanAssets (data) { + if (typeof data === "object" && Object.keys(data).length > 0) { + const keys = Object.keys(data); + for (const key of keys) { + if (typeof data[key] === "object" && Object.keys(data[key]).length > 0) { + if (isAsset(data[key])) { + data[key] = (Array.isArray(data[key])) ? data[key].map(element => element.uid) : data[key].uid; + } else { + cleanAssets(data[key]); + } + } + } + } + return data; +} diff --git a/package.json b/package.json index af403433..2b2ec985 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@contentstack/management", - "version": "1.13.0", + "version": "1.13.1", "description": "The Content Management API is used to manage the content of your Contentstack account", "main": "./dist/node/contentstack-management.js", "browser": "./dist/web/contentstack-management.js", diff --git a/test/api/entry-test.js b/test/api/entry-test.js index d2a14cc2..73ed20ae 100644 --- a/test/api/entry-test.js +++ b/test/api/entry-test.js @@ -190,8 +190,45 @@ describe('Entry api Test', () => { }) .catch(done) }) + + it('Create and update an entry with asset', done => { + // get asset + let asset; + makeAsset() + .query() + .find() + .then((collection) => { + asset = collection.items[0]; + // create entry + let entry = { + ...entryFirst, + title: "uniqueTitle45", + modular_blocks: [ + { + block1: { + file: asset.uid + } + } + ] + }; + makeEntry(multiPageCT.content_type.uid) + .create({entry: entry}) + .then(entry => { + const newTitle = "updated title"; + entry.title = newTitle; + entry.update().then(updatedEntry => { + expect(updatedEntry.title).to.be.equal(newTitle); + done(); + }) + }) + }) + }); }) function makeEntry (contentType, uid = null) { return client.stack({ api_key: stack.api_key }).contentType(contentType).entry(uid) } + +function makeAsset (uid = null) { + return client.stack({ api_key: stack.api_key }).asset(uid) +} diff --git a/test/unit/entry-test.js b/test/unit/entry-test.js index db87571d..5515c2e0 100644 --- a/test/unit/entry-test.js +++ b/test/unit/entry-test.js @@ -4,6 +4,7 @@ import { expect } from 'chai' import { describe, it } from 'mocha' import MockAdapter from 'axios-mock-adapter' import { Entry, EntryCollection, createFormData } from '../../lib/stack/contentType/entry' +import { cleanAssets } from '../../lib/entity' import { systemUidMock, stackHeadersMock, entryMock, noticeMock, checkSystemFields } from './mock/objects' describe('Contentstack Entry test', () => { @@ -375,6 +376,196 @@ describe('Contentstack Entry test', () => { }) .catch(done) }) + + it('Entry with asset object', done => { + const entry = { + empty_array: [], + empty_object: {}, + single_file: { + file_size: 69420, + uid: 'single_file' + }, + title: 'test entry', + property: 'test property 3', + array_file: [ + { file_size: 69420, uid: 'array_file_1' }, + { file_size: 69420, uid: 'array_file_2' }, + { file_size: 69420, uid: 'array_file_3' }, + ], + wrapper1: { + something: 'something', + something_else: 'something_else', + file_inside_wrapper : { + file_size: 69420, + uid: 'single_file' + }, + file_array_wrapper : [ + { file_size: 69420, uid: 'array_file_wrap_1' }, + { file_size: 69420, uid: 'array_file_wrap_2' }, + { file_size: 69420, uid: 'array_file_wrap_3' }, + ], + array_wrapper: [ + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_1' + }, + something_else: 'something_else' + }, + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_2' + }, + something_else: 'something_else' + }, + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_3' + }, + something_else: 'something_else' + } + ], + wrapper2: { + array_of_array_wrapper: [ + { + something: 'something', + oneMoreWrapper : { + file_array_wrapper : [ + { file_size: 69420, uid: 'array_file_wrap_1' }, + { file_size: 69420, uid: 'array_file_wrap_2' }, + { file_size: 69420, uid: 'array_file_wrap_3' }, + ], + array_wrapper: [ + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_1' + }, + something_else: 'something_else' + }, + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_2' + }, + something_else: 'something_else' + }, + { + something: 'something', + single_file: { + file_size: 69420, + uid: 'single_file_3' + }, + something_else: 'something_else' + } + ], + }, + something_else: 'something_else' + }, + { + something: 'something', + file_array_wrapper : [ + { file_size: 69420, uid: 'array_file_wrap_1' }, + { file_size: 69420, uid: 'array_file_wrap_2' }, + { file_size: 69420, uid: 'array_file_wrap_3' }, + ], + something_else: 'something_else' + }, + { + something: 'something', + file_array_wrapper : [ + { file_size: 69420, uid: 'array_file_wrap_1' }, + { file_size: 69420, uid: 'array_file_wrap_2' }, + { file_size: 69420, uid: 'array_file_wrap_3' }, + ], + something_else: 'something_else' + } + ] + } + }, + ...systemUidMock + }; + const expectedResult = { + empty_array: [], + empty_object: {}, + single_file: 'single_file', + title: 'test entry', + property: 'test property 3', + array_file: ['array_file_1', 'array_file_2', 'array_file_3'], + wrapper1: { + something: 'something', + something_else: 'something_else', + file_inside_wrapper : 'single_file', + file_array_wrapper : ['array_file_wrap_1', 'array_file_wrap_2', 'array_file_wrap_3'], + array_wrapper: [ + { + something: 'something', + single_file: 'single_file_1', + something_else: 'something_else' + }, + { + something: 'something', + single_file: 'single_file_2', + something_else: 'something_else' + }, + { + something: 'something', + single_file: 'single_file_3', + something_else: 'something_else' + } + ], + wrapper2: { + array_of_array_wrapper: [ + { + something: 'something', + oneMoreWrapper : { + file_array_wrapper : ['array_file_wrap_1', 'array_file_wrap_2', 'array_file_wrap_3'], + array_wrapper: [ + { + something: 'something', + single_file: 'single_file_1', + something_else: 'something_else' + }, + { + something: 'something', + single_file: 'single_file_2', + something_else: 'something_else' + }, + { + something: 'something', + single_file: 'single_file_3', + something_else: 'something_else' + } + ], + }, + something_else: 'something_else' + }, + { + something: 'something', + file_array_wrapper : ['array_file_wrap_1', 'array_file_wrap_2', 'array_file_wrap_3'], + something_else: 'something_else' + }, + { + something: 'something', + file_array_wrapper : ['array_file_wrap_1', 'array_file_wrap_2', 'array_file_wrap_3'], + something_else: 'something_else' + } + ] + } + }, + ...systemUidMock + }; + const result = cleanAssets(entry); + expect(result).to.deep.equal(expectedResult); + done(); + }) }) function makeEntry (data) {