diff --git a/lib/stack/bulkOperation/index.js b/lib/stack/bulkOperation/index.js index 8534d99a..53f8f5e9 100644 --- a/lib/stack/bulkOperation/index.js +++ b/lib/stack/bulkOperation/index.js @@ -27,6 +27,24 @@ export function BulkOperation (http, data = {}) { } }; + this.updateItems = async ({ data, bulk_version = "" }) => { + this.urlPath = `/bulk/release/update_items`; + const headers = { + headers: { + ...cloneDeep(this.stackHeaders), + }, + }; + if (bulk_version) headers.headers.bulk_version = bulk_version; + try { + const response = await http.put(this.urlPath, data, headers); + if (response.data) { + return response.data; + } + } catch (error) { + console.error(error); + } + }; + this.jobStatus = async ({ job_id, bulk_version = "" }) => { this.urlPath = `/bulk/jobs/${job_id}`; const headers = { diff --git a/lib/stack/release/items/index.js b/lib/stack/release/items/index.js index b8cd65db..8556c1f2 100644 --- a/lib/stack/release/items/index.js +++ b/lib/stack/release/items/index.js @@ -166,7 +166,10 @@ export function ReleaseItem (http, data = {}) { ...cloneDeep(param) } } || {} - + if (param.release_version) { + headers.headers['release_version'] = param.release_version; + delete headers.params.release_version; + } const response = await http.get(this.urlPath, headers) if (response.data) { return new ContentstackCollection(response, http, this.stackHeaders, ReleaseItemCollection) @@ -177,6 +180,25 @@ export function ReleaseItem (http, data = {}) { error(err) } } + + this.move = async ({ param, release_version = '' }) => { + const headers = { + headers: { + ...cloneDeep(this.stackHeaders) + } + } || {} + if (release_version) { + headers.headers['release_version'] = release_version; + } + try { + const response = await http.put(`${this.urlPath}/move`, param, headers) + if (response.data) { + return response.data + } + } catch (err) { + throw error(err) + } + } } return this } diff --git a/test/sanity-check/api/release-test.js b/test/sanity-check/api/release-test.js index 5d5e7684..a77f6615 100644 --- a/test/sanity-check/api/release-test.js +++ b/test/sanity-check/api/release-test.js @@ -1,6 +1,6 @@ import { describe, it, setup } from 'mocha' import { jsonReader } from '../utility/fileOperations/readwrite.js' -import { releaseCreate } from '../mock/release.js' +import { releaseCreate, releaseCreate2 } from '../mock/release.js' import { expect } from 'chai' import { cloneDeep } from 'lodash' import { contentstackClient } from '../utility/ContentstackClient.js' @@ -11,6 +11,7 @@ dotenv.config() let client = {} let releaseUID = '' let releaseUID2 = '' +let releaseUID3 = '' let entries = {} const itemToDelete = {} const jobId = '' @@ -35,6 +36,19 @@ describe('Relases api Test', () => { .catch(done) }) + it('should create a Release 2', done => { + makeRelease() + .create(releaseCreate2) + .then((release) => { + releaseUID2 = release.uid + expect(release.name).to.be.equal(releaseCreate2.release.name) + expect(release.description).to.be.equal(releaseCreate2.release.description) + expect(release.uid).to.be.not.equal(null) + done() + }) + .catch(done) + }) + it('should fetch a Release from Uid', done => { makeRelease(releaseUID) .fetch() @@ -101,7 +115,7 @@ describe('Relases api Test', () => { it('should fetch a Release items from Uid', done => { makeRelease(releaseUID) .item() - .findAll() + .findAll({release_version: '2.0'}) .then((collection) => { const itemdelete = collection.items[0] itemToDelete['version'] = itemdelete.version @@ -115,6 +129,26 @@ describe('Relases api Test', () => { .catch(done) }) + it('should move release items from release1 to release2', done => { + const data = { + release_uid: releaseUID2, + items: [ + { + uid: entries[1].uid, + locale: 'en-us' + } + ] + } + makeRelease(releaseUID) + .item() + .move({ param: data, release_version: '2.0' }) + .then((release) => { + expect(release.notice).to.be.equal('Release items moved successfully!') + done() + }) + .catch(done) + }) + it('should delete specific item', done => { makeRelease(releaseUID) .item() @@ -205,7 +239,7 @@ describe('Relases api Test', () => { makeRelease(releaseUID) .clone({ name: 'New Clone Name', description: 'New Desc' }) .then((release) => { - releaseUID2 = release.uid + releaseUID3 = release.uid expect(release.name).to.be.equal('New Clone Name') expect(release.description).to.be.equal('New Desc') expect(release.uid).to.be.not.equal(null) @@ -257,6 +291,25 @@ describe('Relases api Test', () => { .catch(done) }) + it('Bulk Operation: should update items to a release', done => { + const items = { + release: releaseUID, + action: 'publish', + locale: ['en-us'], + reference: true, + items: [ + '$all' + ], + } + doBulkOperation().updateItems({ data: items, bulk_version: '2.0' }) + .then((response) => { + expect(response.notice).to.equal('Your update release items to latest version request is in progress.') + expect(response.job_id).to.not.equal(undefined) + done() + }) + .catch(done) + }) + it('should delete specific Releases with Uid ', done => { makeRelease(releaseUID) .delete() @@ -267,7 +320,7 @@ describe('Relases api Test', () => { .catch(done) }) - it('should delete cloned Release with Uid', done => { + it('should delete specific Releases with Uid 2', done => { makeRelease(releaseUID2) .delete() .then((data) => { @@ -276,6 +329,16 @@ describe('Relases api Test', () => { }) .catch(done) }) + + it('should delete cloned Release with Uid', done => { + makeRelease(releaseUID3) + .delete() + .then((data) => { + expect(data.notice).to.be.equal('Release deleted successfully.') + done() + }) + .catch(done) + }) }) function makeRelease (uid = null) { diff --git a/test/sanity-check/mock/release.js b/test/sanity-check/mock/release.js index 9bb45e77..58ed92b8 100644 --- a/test/sanity-check/mock/release.js +++ b/test/sanity-check/mock/release.js @@ -7,4 +7,13 @@ const releaseCreate = { } } -export { releaseCreate } +const releaseCreate2 = { + release: { + name: 'Second release', + description: 'Adding release date 2020-21-07', + locked: false, + archived: false + } +} + +export { releaseCreate, releaseCreate2 } diff --git a/test/unit/bulkOperation-test.js b/test/unit/bulkOperation-test.js index 89fa9a01..e0324146 100644 --- a/test/unit/bulkOperation-test.js +++ b/test/unit/bulkOperation-test.js @@ -31,14 +31,14 @@ describe('Contentstack BulkOperation test', () => { it('should add items to a release', async () => { const items = { - release: 'blt05e951e5f3a1d342', + release: 'release_uid', action: 'publish', locale: ['en-us'], reference: true, items: [ { content_type_uid: 'ct_1', - uid: 'bltf6e197a18a11ec5f', + uid: 'entry_uid', version: 2, locale: 'en-us', title: 'validation test', @@ -57,6 +57,28 @@ describe('Contentstack BulkOperation test', () => { expect(response.job_id).to.not.equal(undefined); }); + it('should update items to a release', async () => { + const items = { + release: 'release_uid', + action: 'publish', + locale: ['en-us'], + reference: true, + items: [ + '$all' + ], + }; + + var mock = new MockAdapter(Axios); + mock.onPut('/bulk/release/update_items').reply(200, { + notice: 'Your update release items to latest version request is in progress.', + job_id: 'job_id', + }); + + const response = await makeBulkOperation().updateItems({ data: items, bulk_version: '2.0' }); + expect(response.notice).to.equal('Your update release items to latest version request is in progress.'); + expect(response.job_id).to.not.equal(undefined); + }); + it('should publish items in bulk', async () => { const publishDetails = { entries: [ diff --git a/test/unit/release-test.js b/test/unit/release-test.js index 4cc3d6b8..06f17f67 100644 --- a/test/unit/release-test.js +++ b/test/unit/release-test.js @@ -221,6 +221,26 @@ describe('Contentstack Release test', () => { }) .catch(done) }) + + it('Release move test', done => { + var mock = new MockAdapter(Axios) + mock.onPut('/releases/UID/items/move').reply(200, { + ...noticeMock + }) + makeRelease({ + release: { + ...systemUidMock + }, + stackHeaders: stackHeadersMock + }) + .item() + .move({ data: { release_uid: 'UID2', items: ['$all'] }, release_version: '2.0' }) + .then((response) => { + expect(response.notice).to.be.equal(noticeMock.notice) + done() + }) + .catch(done) + }) }) function makeRelease (data) { diff --git a/types/stack/bulkOperation/index.d.ts b/types/stack/bulkOperation/index.d.ts index 6f1dd731..4a997e15 100644 --- a/types/stack/bulkOperation/index.d.ts +++ b/types/stack/bulkOperation/index.d.ts @@ -7,7 +7,7 @@ export interface BulkOperation extends SystemFields { unpublish(config: BulkOperationConfig): Promise delete(config: BulkDeleteConfig): Promise addItems(config: AddItemsConfig): Promise - + updateItems(config: AddItemsConfig): Promise jobStatus(config: BulkJobStatus): Promise } export interface BulkOperationConfig { diff --git a/types/stack/release/index.d.ts b/types/stack/release/index.d.ts index 0982c189..00516a58 100644 --- a/types/stack/release/index.d.ts +++ b/types/stack/release/index.d.ts @@ -32,6 +32,7 @@ export interface ReleaseDeploy extends AnyProperty { export interface ReleaseItem extends SystemFields, Creatable }> { delete(param?: { items: Array }): Promise; // Changed return type to Promise findAll(param?: AnyProperty): Promise>; + move(param: { param: MoveReleaseItems, release_version?: string }): Promise; } // Data structure for Release item properties @@ -42,3 +43,14 @@ export interface ReleaseItemData extends AnyProperty { content_type_uid: string; action: 'publish' | 'unpublish'; } + +export interface MoveReleaseItems extends AnyProperty { + release_uid: string; + items: Array; +} + +export interface MoveItemData extends AnyProperty { + uid: string; + locale: string; + variant_id?: string; +}