Skip to content

Commit c5a6170

Browse files
Merge pull request #235 from contentstack/feat/dx-1594-update-move-items
Feat/dx 1594 update move items
2 parents ee7f925 + aa9e1d5 commit c5a6170

File tree

8 files changed

+175
-9
lines changed

8 files changed

+175
-9
lines changed

lib/stack/bulkOperation/index.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,24 @@ export function BulkOperation (http, data = {}) {
2727
}
2828
};
2929

30+
this.updateItems = async ({ data, bulk_version = "" }) => {
31+
this.urlPath = `/bulk/release/update_items`;
32+
const headers = {
33+
headers: {
34+
...cloneDeep(this.stackHeaders),
35+
},
36+
};
37+
if (bulk_version) headers.headers.bulk_version = bulk_version;
38+
try {
39+
const response = await http.put(this.urlPath, data, headers);
40+
if (response.data) {
41+
return response.data;
42+
}
43+
} catch (error) {
44+
console.error(error);
45+
}
46+
};
47+
3048
this.jobStatus = async ({ job_id, bulk_version = "" }) => {
3149
this.urlPath = `/bulk/jobs/${job_id}`;
3250
const headers = {

lib/stack/release/items/index.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,10 @@ export function ReleaseItem (http, data = {}) {
166166
...cloneDeep(param)
167167
}
168168
} || {}
169-
169+
if (param.release_version) {
170+
headers.headers['release_version'] = param.release_version;
171+
delete headers.params.release_version;
172+
}
170173
const response = await http.get(this.urlPath, headers)
171174
if (response.data) {
172175
return new ContentstackCollection(response, http, this.stackHeaders, ReleaseItemCollection)
@@ -177,6 +180,25 @@ export function ReleaseItem (http, data = {}) {
177180
error(err)
178181
}
179182
}
183+
184+
this.move = async ({ param, release_version = '' }) => {
185+
const headers = {
186+
headers: {
187+
...cloneDeep(this.stackHeaders)
188+
}
189+
} || {}
190+
if (release_version) {
191+
headers.headers['release_version'] = release_version;
192+
}
193+
try {
194+
const response = await http.put(`${this.urlPath}/move`, param, headers)
195+
if (response.data) {
196+
return response.data
197+
}
198+
} catch (err) {
199+
throw error(err)
200+
}
201+
}
180202
}
181203
return this
182204
}

test/sanity-check/api/release-test.js

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, it, setup } from 'mocha'
22
import { jsonReader } from '../utility/fileOperations/readwrite.js'
3-
import { releaseCreate } from '../mock/release.js'
3+
import { releaseCreate, releaseCreate2 } from '../mock/release.js'
44
import { expect } from 'chai'
55
import { cloneDeep } from 'lodash'
66
import { contentstackClient } from '../utility/ContentstackClient.js'
@@ -11,6 +11,7 @@ dotenv.config()
1111
let client = {}
1212
let releaseUID = ''
1313
let releaseUID2 = ''
14+
let releaseUID3 = ''
1415
let entries = {}
1516
const itemToDelete = {}
1617
const jobId = ''
@@ -35,6 +36,19 @@ describe('Relases api Test', () => {
3536
.catch(done)
3637
})
3738

39+
it('should create a Release 2', done => {
40+
makeRelease()
41+
.create(releaseCreate2)
42+
.then((release) => {
43+
releaseUID2 = release.uid
44+
expect(release.name).to.be.equal(releaseCreate2.release.name)
45+
expect(release.description).to.be.equal(releaseCreate2.release.description)
46+
expect(release.uid).to.be.not.equal(null)
47+
done()
48+
})
49+
.catch(done)
50+
})
51+
3852
it('should fetch a Release from Uid', done => {
3953
makeRelease(releaseUID)
4054
.fetch()
@@ -101,7 +115,7 @@ describe('Relases api Test', () => {
101115
it('should fetch a Release items from Uid', done => {
102116
makeRelease(releaseUID)
103117
.item()
104-
.findAll()
118+
.findAll({release_version: '2.0'})
105119
.then((collection) => {
106120
const itemdelete = collection.items[0]
107121
itemToDelete['version'] = itemdelete.version
@@ -115,6 +129,26 @@ describe('Relases api Test', () => {
115129
.catch(done)
116130
})
117131

132+
it('should move release items from release1 to release2', done => {
133+
const data = {
134+
release_uid: releaseUID2,
135+
items: [
136+
{
137+
uid: entries[1].uid,
138+
locale: 'en-us'
139+
}
140+
]
141+
}
142+
makeRelease(releaseUID)
143+
.item()
144+
.move({ param: data, release_version: '2.0' })
145+
.then((release) => {
146+
expect(release.notice).to.be.equal('Release items moved successfully!')
147+
done()
148+
})
149+
.catch(done)
150+
})
151+
118152
it('should delete specific item', done => {
119153
makeRelease(releaseUID)
120154
.item()
@@ -205,7 +239,7 @@ describe('Relases api Test', () => {
205239
makeRelease(releaseUID)
206240
.clone({ name: 'New Clone Name', description: 'New Desc' })
207241
.then((release) => {
208-
releaseUID2 = release.uid
242+
releaseUID3 = release.uid
209243
expect(release.name).to.be.equal('New Clone Name')
210244
expect(release.description).to.be.equal('New Desc')
211245
expect(release.uid).to.be.not.equal(null)
@@ -257,6 +291,25 @@ describe('Relases api Test', () => {
257291
.catch(done)
258292
})
259293

294+
it('Bulk Operation: should update items to a release', done => {
295+
const items = {
296+
release: releaseUID,
297+
action: 'publish',
298+
locale: ['en-us'],
299+
reference: true,
300+
items: [
301+
'$all'
302+
],
303+
}
304+
doBulkOperation().updateItems({ data: items, bulk_version: '2.0' })
305+
.then((response) => {
306+
expect(response.notice).to.equal('Your update release items to latest version request is in progress.')
307+
expect(response.job_id).to.not.equal(undefined)
308+
done()
309+
})
310+
.catch(done)
311+
})
312+
260313
it('should delete specific Releases with Uid ', done => {
261314
makeRelease(releaseUID)
262315
.delete()
@@ -267,7 +320,7 @@ describe('Relases api Test', () => {
267320
.catch(done)
268321
})
269322

270-
it('should delete cloned Release with Uid', done => {
323+
it('should delete specific Releases with Uid 2', done => {
271324
makeRelease(releaseUID2)
272325
.delete()
273326
.then((data) => {
@@ -276,6 +329,16 @@ describe('Relases api Test', () => {
276329
})
277330
.catch(done)
278331
})
332+
333+
it('should delete cloned Release with Uid', done => {
334+
makeRelease(releaseUID3)
335+
.delete()
336+
.then((data) => {
337+
expect(data.notice).to.be.equal('Release deleted successfully.')
338+
done()
339+
})
340+
.catch(done)
341+
})
279342
})
280343

281344
function makeRelease (uid = null) {

test/sanity-check/mock/release.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,13 @@ const releaseCreate = {
77
}
88
}
99

10-
export { releaseCreate }
10+
const releaseCreate2 = {
11+
release: {
12+
name: 'Second release',
13+
description: 'Adding release date 2020-21-07',
14+
locked: false,
15+
archived: false
16+
}
17+
}
18+
19+
export { releaseCreate, releaseCreate2 }

test/unit/bulkOperation-test.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ describe('Contentstack BulkOperation test', () => {
3131

3232
it('should add items to a release', async () => {
3333
const items = {
34-
release: 'blt05e951e5f3a1d342',
34+
release: 'release_uid',
3535
action: 'publish',
3636
locale: ['en-us'],
3737
reference: true,
3838
items: [
3939
{
4040
content_type_uid: 'ct_1',
41-
uid: 'bltf6e197a18a11ec5f',
41+
uid: 'entry_uid',
4242
version: 2,
4343
locale: 'en-us',
4444
title: 'validation test',
@@ -57,6 +57,28 @@ describe('Contentstack BulkOperation test', () => {
5757
expect(response.job_id).to.not.equal(undefined);
5858
});
5959

60+
it('should update items to a release', async () => {
61+
const items = {
62+
release: 'release_uid',
63+
action: 'publish',
64+
locale: ['en-us'],
65+
reference: true,
66+
items: [
67+
'$all'
68+
],
69+
};
70+
71+
var mock = new MockAdapter(Axios);
72+
mock.onPut('/bulk/release/update_items').reply(200, {
73+
notice: 'Your update release items to latest version request is in progress.',
74+
job_id: 'job_id',
75+
});
76+
77+
const response = await makeBulkOperation().updateItems({ data: items, bulk_version: '2.0' });
78+
expect(response.notice).to.equal('Your update release items to latest version request is in progress.');
79+
expect(response.job_id).to.not.equal(undefined);
80+
});
81+
6082
it('should publish items in bulk', async () => {
6183
const publishDetails = {
6284
entries: [

test/unit/release-test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,26 @@ describe('Contentstack Release test', () => {
221221
})
222222
.catch(done)
223223
})
224+
225+
it('Release move test', done => {
226+
var mock = new MockAdapter(Axios)
227+
mock.onPut('/releases/UID/items/move').reply(200, {
228+
...noticeMock
229+
})
230+
makeRelease({
231+
release: {
232+
...systemUidMock
233+
},
234+
stackHeaders: stackHeadersMock
235+
})
236+
.item()
237+
.move({ data: { release_uid: 'UID2', items: ['$all'] }, release_version: '2.0' })
238+
.then((response) => {
239+
expect(response.notice).to.be.equal(noticeMock.notice)
240+
done()
241+
})
242+
.catch(done)
243+
})
224244
})
225245

226246
function makeRelease (data) {

types/stack/bulkOperation/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export interface BulkOperation extends SystemFields {
77
unpublish(config: BulkOperationConfig): Promise<Response>
88
delete(config: BulkDeleteConfig): Promise<Response>
99
addItems(config: AddItemsConfig): Promise<Response>
10-
10+
updateItems(config: AddItemsConfig): Promise<Response>
1111
jobStatus(config: BulkJobStatus): Promise<Response>
1212
}
1313
export interface BulkOperationConfig {

types/stack/release/index.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export interface ReleaseDeploy extends AnyProperty {
3232
export interface ReleaseItem extends SystemFields, Creatable<Release, { item?: ReleaseItemData; items?: Array<ReleaseItemData> }> {
3333
delete(param?: { items: Array<ReleaseItemData> }): Promise<void>; // Changed return type to Promise<void>
3434
findAll(param?: AnyProperty): Promise<ContentstackCollection<ReleaseItemData>>;
35+
move(param: { param: MoveReleaseItems, release_version?: string }): Promise<any>;
3536
}
3637

3738
// Data structure for Release item properties
@@ -42,3 +43,14 @@ export interface ReleaseItemData extends AnyProperty {
4243
content_type_uid: string;
4344
action: 'publish' | 'unpublish';
4445
}
46+
47+
export interface MoveReleaseItems extends AnyProperty {
48+
release_uid: string;
49+
items: Array<ReleaseItemData>;
50+
}
51+
52+
export interface MoveItemData extends AnyProperty {
53+
uid: string;
54+
locale: string;
55+
variant_id?: string;
56+
}

0 commit comments

Comments
 (0)