Skip to content

Commit b8c98c8

Browse files
Feat/cs 44599 ungrouped variants (#8)
* sca-scan.yml * jira.yml * sast-scan.yml * secrets-scan.yml * codeql-analysis.yml * Implemented ungrouped Variants with test cases * Removed github action file * Added fetchByUIDs method * Fixed issue * Fixed merge conflits error --------- Co-authored-by: Aravind Kumar <[email protected]>
1 parent dbe8dc5 commit b8c98c8

File tree

11 files changed

+601
-2
lines changed

11 files changed

+601
-2
lines changed

lib/stack/index.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { BranchAlias } from './branchAlias'
2020
import { AuditLog } from './auditlog'
2121
import { Taxonomy } from './taxonomy'
2222
import { ManagementToken } from './managementToken'
23+
import { Variants } from './variants'
2324
import { VariantGroup } from './variantGroup'
2425

2526
/**
@@ -369,6 +370,29 @@ export function Stack (http, data) {
369370
return new Label(http, data)
370371
}
371372

373+
/**
374+
* @description For creating ungrouped variants.
375+
* @param {String} uid The UID of the variants you want to get details.
376+
* @returns {Variants} Instance of variants.
377+
* @example
378+
* import * as contentstack from '@contentstack/management'
379+
* const client = contentstack.client()
380+
*
381+
* client.stack({ api_key: 'api_key'}).variants().create()
382+
* .then((variants) => console.log(variants))
383+
*
384+
* client.stack({ api_key: 'api_key'}).variants('variants_uid').fetch()
385+
* .then((variants) => console.log(variants))
386+
*/
387+
this.variants = (variantsUid = null) => {
388+
const data = { stackHeaders: this.stackHeaders }
389+
if (variantsUid) {
390+
data.variants = { uid: variantsUid }
391+
}
392+
return new Variants(http, data)
393+
}
394+
395+
372396
/**
373397
* @description You can pin a set of entries and assets (along with the deploy action, i.e., publish/unpublish) to a ‘release’, and then deploy this release to an environment.
374398
* @param {String} releaseUid The UID of the Releases you want to get details.

lib/stack/variants/index.js

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import cloneDeep from 'lodash/cloneDeep'
2+
import {
3+
deleteEntity,
4+
fetch,
5+
query,
6+
create
7+
} from '../../entity'
8+
/**
9+
* Variantss allow you to group a collection of content within a stack. Using variants you can group content types that need to work together. Read more about <a href='https://www.contentstack.com/docs/developers/create-content-types/manage-variants'>Variantss</a>.
10+
* @namespace Variants
11+
*/
12+
export function Variants (http, data) {
13+
this.stackHeaders = data.stackHeaders
14+
this.urlPath = `/variants`
15+
16+
if (data.variants) {
17+
Object.assign(this, cloneDeep(data.variants))
18+
this.urlPath += `/${this.uid}`
19+
20+
/**
21+
* @description The Delete variants call is used to delete a specific variants.
22+
* @memberof Variants
23+
* @func delete
24+
* @returns {Object} Response Object.
25+
* @example
26+
* import * as contentstack from '@contentstack/management'
27+
* const client = contentstack.client()
28+
*
29+
* client.stack({ api_key: 'api_key'}).variants('variants_uid').delete()
30+
* .then((response) => console.log(response.notice))
31+
*/
32+
this.delete = deleteEntity(http)
33+
34+
/**
35+
* @description The fetch Variants returns information about a particular variants of a stack.
36+
* @memberof Variants
37+
* @func fetch
38+
* @returns {Promise<Variants.Variants>} Promise for Variants instance
39+
* @example
40+
* import * as contentstack from '@contentstack/management'
41+
* const client = contentstack.client()
42+
*
43+
* client.stack({ api_key: 'api_key'}).variants('variants_uid').fetch()
44+
* .then((variants) => console.log(variants))
45+
*
46+
*/
47+
this.fetch = fetch(http, 'variants')
48+
} else {
49+
/**
50+
* @description The Create an variants call creates a new variants.
51+
* @memberof Variants
52+
* @func create
53+
* @returns {Promise<Variants.Variants>} Promise for Variants instance
54+
*
55+
* @example
56+
* import * as contentstack from '@contentstack/management'
57+
* const client = contentstack.client()
58+
* const variants = {
59+
* "uid": "iphone_color_white", // optional
60+
* "name": "White",
61+
* "personalize_metadata": {
62+
* "experience_uid": "exp1",
63+
* "experience_short_uid": "expShortUid1",
64+
* "project_uid": "project_uid1",
65+
* "variant_short_uid": "variantShort_uid1"
66+
* },
67+
* }
68+
* client.stack().variants().create({ variants })
69+
* .then((variants) => console.log(variants))
70+
*/
71+
this.create = create({ http })
72+
73+
/**
74+
* @description The Query on Variants will allow to fetch details of all or specific Variants.
75+
* @memberof Variants
76+
* @param {Object} params - URI parameters
77+
* @prop {Object} params.query - Queries that you can use to fetch filtered results.
78+
* @func query
79+
* @returns {Array<Variants>} Array of Variants.
80+
*
81+
* @example
82+
* import * as contentstack from '@contentstack/management'
83+
* const client = contentstack.client()
84+
*
85+
* client.stack().variants().query({ query: { name: 'Variants Name' } }).find()
86+
* .then((variants) => console.log(variants))
87+
*/
88+
this.query = query({ http: http, wrapperCollection: VariantsCollection })
89+
90+
/**
91+
* @description The fetchByUIDs on Variants will allow to fetch details of specific Variants UID.
92+
* @memberof Variants
93+
* @param {Object} params - URI parameters
94+
* @prop {Object} params.query - fetchByUIDs that you can use to fetch filtered results.
95+
* @func query
96+
* @returns {Array<Variants>} Array of Variants.
97+
*
98+
* @example
99+
* import * as contentstack from '@contentstack/management'
100+
* const client = contentstack.client()
101+
*
102+
* client.stack().variants().fetchByUIDs(['uid1','uid2']).find()
103+
* .then((variants) => console.log(variants))
104+
*/
105+
this.fetchByUIDs = async (variantUids) => {
106+
107+
try {
108+
const response = await http.get(this.urlPath, {
109+
params: {
110+
uids: variantUids
111+
},
112+
headers: {
113+
...cloneDeep(this.stackHeaders)
114+
}
115+
})
116+
if (response.data) {
117+
return response.data
118+
} else {
119+
throw error(response)
120+
}
121+
} catch (err) {
122+
throw error(err)
123+
}
124+
}
125+
}
126+
}
127+
128+
export function VariantsCollection (http, data) {
129+
const obj = cloneDeep(data.variants) || []
130+
const VariantsCollection = obj.map((userdata) => {
131+
return new Variants(http, { variants: userdata, stackHeaders: data.stackHeaders })
132+
})
133+
return VariantsCollection
134+
}

test/api/ungroupedVariants-test.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import { expect } from 'chai'
2+
import { describe, it, setup } from 'mocha'
3+
import { jsonReader } from '../utility/fileOperations/readwrite'
4+
import { contentstackClient } from '../utility/ContentstackClient.js'
5+
6+
var client = {}
7+
var stack = {}
8+
9+
const variants ={
10+
"uid": "iphone_color_white", // optional
11+
"name": "White",
12+
"personalize_metadata": {
13+
"experience_uid": "exp1",
14+
"experience_short_uid": "expShortUid1",
15+
"project_uid": "project_uid1",
16+
"variant_short_uid": "variantShort_uid1"
17+
},
18+
}
19+
20+
var variantsUID = ''
21+
var deleteVariantsUID = ''
22+
describe('Variants api Test', () => {
23+
setup(() => {
24+
const user = jsonReader('loggedinuser.json')
25+
stack = jsonReader('stack.json')
26+
client = contentstackClient(user.authtoken)
27+
})
28+
29+
it('Variants create', done => {
30+
makeVariants()
31+
.create({ variants })
32+
.then((variantsResponse) => {
33+
variantsUID = variantsResponse.uid
34+
expect(variantsResponse.uid).to.be.not.equal(null)
35+
expect(variantsResponse.name).to.be.equal(variants.name)
36+
done()
37+
})
38+
.catch(done)
39+
})
40+
41+
it('Fetch variants from uid', done => {
42+
makeVariants(variantsUID)
43+
.fetch()
44+
.then((variantsResponse) => {
45+
expect(variantsResponse.uid).to.be.equal(variantsUID)
46+
expect(variantsResponse.name).to.be.equal(variants.name)
47+
done()
48+
})
49+
.catch(done)
50+
})
51+
52+
it('Query to get all variantss', done => {
53+
makeVariants()
54+
.query({ query: { name: variants.name } })
55+
.find()
56+
.then((response) => {
57+
response.items.forEach((variantsResponse) => {
58+
expect(variantsResponse.uid).to.be.not.equal(null)
59+
expect(variantsResponse.name).to.be.not.equal(null)
60+
})
61+
done()
62+
})
63+
.catch(done)
64+
})
65+
66+
it('Query variants with name', done => {
67+
makeVariants()
68+
.query({ query: { name: variants.name } })
69+
.find()
70+
.then((response) => {
71+
response.items.forEach((variantsResponse) => {
72+
expect(variantsResponse.uid).to.be.equal(variantsUID)
73+
expect(variantsResponse.name).to.be.equal(variants.name)
74+
})
75+
done()
76+
})
77+
.catch(done)
78+
})
79+
80+
it('Fetch By variants UIDs ', done => {
81+
makeVariants()
82+
.fetchByUIDs(['uid1', 'uid2'])
83+
.then((response) => {
84+
response.variants.forEach((variantsResponse) => {
85+
expect(variantsResponse.uid).to.be.equal(variantsUID)
86+
expect(variantsResponse.name).to.be.equal(variants.name)
87+
})
88+
done()
89+
})
90+
.catch(done)
91+
})
92+
93+
94+
it('Delete variants from uid', done => {
95+
makeVariants(deleteVariantsUID)
96+
.delete()
97+
.then((data) => {
98+
expect(data.notice).to.be.equal('Variants deleted successfully.')
99+
done()
100+
})
101+
.catch(done)
102+
})
103+
})
104+
105+
function makeVariants (uid = null) {
106+
return client.stack({ api_key: stack.api_key }).variants(uid)
107+
}

test/typescript/index.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import { testTerm } from './terms';
2525
import { testTeams } from './teams';
2626
import { testTeamUsers } from './teamUsers';
2727
import { testTeamStackRoleMapping } from './teamsStackRoleMappings';
28+
import { createVariants, deleteVariants, variants, queryVariants } from './ungroupedVariants';
29+
2830
dotenv.config()
2931
jest.setTimeout(10000);
3032

@@ -87,6 +89,10 @@ describe('Typescript API test', () => {
8789
managementToken(stack)
8890
deleteManagementToken(stack)
8991

92+
createVariants(stack)
93+
deleteVariants(stack)
94+
variants(stack.variant)
95+
queryVariants(stack.variant)
9096
createVariantGroup(stack.VariantGroup())
9197
queryVariantGroup(stack.VariantGroup())
9298
variantGroup(stack)
@@ -96,7 +102,6 @@ describe('Typescript API test', () => {
96102
queryVariant(stack.VariantGroup().Variants())
97103
variant(stack.VariantGroup().variants())
98104

99-
100105
findAllRole(stack.role())
101106
createRole(stack.role())
102107
getRole(stack)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const variant = {
2+
"created_by": "blt6cdf4e0b02b1c446",
3+
"updated_by": "blt303b74fa96e1082a",
4+
"created_at": "2022-10-26T06:52:20.073Z",
5+
"updated_at": "2023-09-25T04:55:56.549Z",
6+
"uid": "iphone_color_white",
7+
"name": "White"
8+
}
9+
10+
const variants1 = {
11+
"uid": "iphone_color_white", // optional
12+
"name": "White",
13+
"personalize_metadata": {
14+
"experience_uid": "exp1",
15+
"experience_short_uid": "expShortUid1",
16+
"project_uid": "project_uid1",
17+
"variant_short_uid": "variantShort_uid1"
18+
},
19+
}
20+
const variants2 = {
21+
"uid": "variant_1",
22+
"created_by": "user_id",
23+
"updated_by": "user_id",
24+
"name": "Variant 1",
25+
"personalize_metadata": {
26+
"experience_uid": "exp1",
27+
"experience_short_uid": "expShortUid1",
28+
"project_uid": "project_uid1",
29+
"variant_short_uid": "variantShort_uid1"
30+
},
31+
"created_at": "2024-04-16T05:53:50.547Z",
32+
"updated_at": "2024-04-16T05:53:50.547Z",
33+
"variant_group": {
34+
"uid": "variant_group_1",
35+
"name": "Variant Group 1",
36+
"content_types": [
37+
"CTSTAET123"
38+
],
39+
"personalize_metadata": {
40+
"experience_uid": "variant_group_ex_uid",
41+
"experience_short_uid": "variant_group_short_uid",
42+
"project_uid": "variant_group_project_uid"
43+
}
44+
}
45+
}
46+
47+
48+
49+
export { variant, variants1, variants2 }

0 commit comments

Comments
 (0)