diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54b82f31..23923286 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,9 @@
- Fixes
- Fix for issue while updating entries with assets
+## [v1.14.0](https://github.com/contentstack/contentstack-management-javascript/tree/v1.14.0) (2023-12-19)
+ - Feature
+ - Management token feature added
## [v1.13.0](https://github.com/contentstack/contentstack-management-javascript/tree/v1.13.0) (2023-11-21)
- Feature
- Teams API support
diff --git a/lib/stack/index.js b/lib/stack/index.js
index d86f72cb..f63bb264 100644
--- a/lib/stack/index.js
+++ b/lib/stack/index.js
@@ -19,6 +19,7 @@ import { Branch } from './branch'
import { BranchAlias } from './branchAlias'
import { AuditLog } from './auditlog'
import { Taxonomy } from './taxonomy'
+import { ManagementToken } from './managementToken'
/**
* A stack is a space that stores the content of a project (a web or mobile property). Within a stack, you can create content structures, content entries, users, etc. related to the project. Read more about Stacks.
@@ -257,6 +258,28 @@ export function Stack (http, data) {
return new DeliveryToken(http, data)
}
+ /**
+ * @description Management Tokens are tokens that provide you with read-write access to the content of your stack.
+ * @param {String} managementTokenUid The UID of the Management Token field you want to get details.
+ * @returns {ManagementToken} Instance of ManagementToken.
+ * @example
+ * import * as contentstack from '@contentstack/management'
+ * const client = contentstack.client()
+ *
+ * client.stack({ api_key: 'api_key'}).managementToken().create()
+ * .then((managementToken) => console.log(managementToken))
+ *
+ * client.stack({ api_key: 'api_key'}).managementToken('managementToken_uid').fetch()
+ * .then((managementToken) => console.log(managementToken))
+ */
+ this.managementToken = (managementTokenUid = null) => {
+ const data = { stackHeaders: this.stackHeaders }
+ if (managementTokenUid) {
+ data.token = { uid: managementTokenUid }
+ }
+ return new ManagementToken(http, data)
+ }
+
/**
* @description Extensions let you create custom fields and custom widgets that lets you customize Contentstack's default UI and behavior.
* @param {String} extensionUid The UID of the Extension you want to get details.
diff --git a/lib/stack/managementToken/index.js b/lib/stack/managementToken/index.js
new file mode 100644
index 00000000..d8b455e6
--- /dev/null
+++ b/lib/stack/managementToken/index.js
@@ -0,0 +1,111 @@
+import cloneDeep from 'lodash/cloneDeep'
+import { create, update, deleteEntity, fetch, query } from '../../entity'
+
+/**
+ * Management tokens provide read-only access to the associated environments. Read more about ManagementToken.
+ * @namespace ManagementToken
+ */
+export function ManagementToken (http, data = {}) {
+ this.stackHeaders = data.stackHeaders
+ this.urlPath = `/stacks/management_tokens`
+ if (data.token) {
+ Object.assign(this, cloneDeep(data.token))
+ this.urlPath = `/stacks/management_tokens/${this.uid}`
+ /**
+ * @description The Update ManagementToken call lets you update the name and description of an existing ManagementToken.
+ * @memberof ManagementToken
+ * @func update
+ * @returns {Promise} Promise for ManagementToken instance
+ * @example
+ * import * as contentstack from '@contentstack/management'
+ * const client = contentstack.client()
+ *
+ * client.stack({ api_key: 'api_key'}).managementToken('management_token_uid').fetch()
+ * .then((managementToken) => {
+ * managementToken.title = 'My New management token'
+ * managementToken.description = 'management token description'
+ * return managementToken.update()
+ * })
+ * .then((managementToken) => console.log(managementToken))
+ *
+ */
+ this.update = update(http, 'token')
+
+ /**
+ * @description The Delete ManagementToken call is used to delete an existing ManagementToken permanently from your Stack.
+ * @memberof ManagementToken
+ * @func delete
+ * @returns {Object} Response Object.
+ * @example
+ * import * as contentstack from '@contentstack/management'
+ * const client = contentstack.client()
+ *
+ * client.stack({ api_key: 'api_key'}).managementToken('management_token_uid').delete()
+ * .then((response) => console.log(response.notice))
+ */
+ this.delete = deleteEntity(http)
+
+ /**
+ * @description The fetch ManagementToken call fetches ManagementToken details.
+ * @memberof ManagementToken
+ * @func fetch
+ * @returns {Promise} Promise for ManagementToken instance
+ * @example
+ * import * as contentstack from '@contentstack/management'
+ * const client = contentstack.client()
+ *
+ * client.stack({ api_key: 'api_key'}).managementToken('management_token_uid').fetch()
+ * .then((managementToken) => console.log(managementToken))
+ *
+ */
+ this.fetch = fetch(http, 'token')
+ } else {
+ /**
+ * @description The Create a ManagementToken call creates a new ManagementToken in a particular stack of your Contentstack account.
+ * @memberof ManagementToken
+ * @func create
+ * @returns {Promise} Promise for ManagementToken instance
+ *
+ * @example
+ * import * as contentstack from '@contentstack/management'
+ * const client = contentstack.client()
+ * const token = {
+ * name: 'Test',
+ * description: 'This is a demo token.',
+ * scope: [{
+ * module: 'environment',
+ * environments: ['development'],
+ * acl: {
+ * read: true
+ * }
+ * }]
+ * }
+ *
+ * client.stack().managementToken().create({ token })
+ * .then((managementToken) => console.log(managementToken))
+ */
+ this.create = create({ http: http })
+
+ /**
+ * @description The ‘Get all managementToken’ request returns comprehensive information about all managementToken created in a stack.
+ * @memberof ManagementToken
+ * @func query
+ * @returns {ContentstackCollection} Instance of ContentstackCollection.
+ * @example
+ * import * as contentstack from '@contentstack/management'
+ * const client = contentstack.client()
+ *
+ * client.stack().managementToken().query({ query: { name: 'token_name' } })).find()
+ * .then((contentstackCollection) => console.log(contentstackCollection))
+ */
+ this.query = query({ http: http, wrapperCollection: ManagementTokenCollection })
+ }
+}
+
+export function ManagementTokenCollection (http, data) {
+ const obj = cloneDeep(data.tokens) || []
+ const managementTokenCollection = obj.map((managementTokenData) => {
+ return new ManagementToken(http, { token: managementTokenData, stackHeaders: data.stackHeaders })
+ })
+ return managementTokenCollection
+}
diff --git a/package-lock.json b/package-lock.json
index 1c853cc9..f621ba2c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@contentstack/management",
- "version": "1.13.1",
- "lockfileVersion": 2,
+ "version": "1.14.0",
+ "lockfileVersion": 1,
"requires": true,
"packages": {
"": {
"name": "@contentstack/management",
- "version": "1.13.1",
+ "version": "1.11.0",
"license": "MIT",
"dependencies": {
"axios": "^1.6.0",
@@ -12870,8 +12870,7 @@
"version": "7.21.0-placeholder-for-preset-env.2",
"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
"integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
@@ -13691,21 +13690,112 @@
}
},
"@babel/traverse": {
- "version": "7.22.10",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz",
- "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==",
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz",
+ "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.22.10",
- "@babel/generator": "^7.22.10",
- "@babel/helper-environment-visitor": "^7.22.5",
- "@babel/helper-function-name": "^7.22.5",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.22.10",
- "@babel/types": "^7.22.10",
- "debug": "^4.1.0",
+ "@babel/parser": "^7.23.6",
+ "@babel/types": "^7.23.6",
+ "debug": "^4.3.1",
"globals": "^11.1.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
+ "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.23.6",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true
+ },
+ "@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "dev": true
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
+ "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
+ "dev": true
+ },
+ "@babel/template": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
+ }
+ },
+ "@babel/types": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
+ "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ }
+ }
}
},
"@babel/types": {
@@ -14592,6 +14682,12 @@
"@babel/types": "^7.20.7"
}
},
+ "@types/chai": {
+ "version": "4.3.11",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz",
+ "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==",
+ "dev": true
+ },
"@types/eslint": {
"version": "8.44.2",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz",
@@ -14689,6 +14785,12 @@
"integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==",
"dev": true
},
+ "@types/lodash": {
+ "version": "4.14.202",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
+ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==",
+ "dev": true
+ },
"@types/markdown-it": {
"version": "12.2.3",
"resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
@@ -14906,8 +15008,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
"integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"@webpack-cli/info": {
"version": "1.5.0",
@@ -14922,8 +15023,7 @@
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
"integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"@xtuc/ieee754": {
"version": "1.2.0",
@@ -14947,15 +15047,13 @@
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
"integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"aggregate-error": {
"version": "3.1.0",
@@ -14983,8 +15081,7 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"ansi-colors": {
"version": "4.1.1",
@@ -16441,8 +16538,7 @@
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-13.0.1.tgz",
"integrity": "sha512-zLKp4QOgq6JFgRm1dDCVv1Iu0P5uZ4v5Wa4DTOkg2RFMxdCX/9Qf7lz9ezRj2dBRa955cWQF/O/LWEiYWAHbTw==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"eslint-import-resolver-node": {
"version": "0.3.9",
@@ -16565,8 +16661,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz",
"integrity": "sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"eslint-scope": {
"version": "7.2.2",
@@ -18310,8 +18405,7 @@
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
"integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"jest-regex-util": {
"version": "28.0.2",
@@ -19299,8 +19393,7 @@
"version": "8.6.7",
"resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz",
"integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==",
- "dev": true,
- "requires": {}
+ "dev": true
},
"marked": {
"version": "4.3.0",
diff --git a/package.json b/package.json
index 2b2ec985..ee96e54e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@contentstack/management",
- "version": "1.13.1",
+ "version": "1.14.0",
"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",
@@ -66,7 +66,9 @@
"@babel/preset-env": "^7.18.2",
"@babel/register": "^7.17.7",
"@babel/runtime": "^7.18.3",
+ "@types/chai": "^4.3.11",
"@types/jest": "^28.1.0",
+ "@types/lodash": "^4.14.202",
"@types/mocha": "^7.0.2",
"axios-mock-adapter": "^1.21.1",
"babel-loader": "^8.2.5",
diff --git a/test/api/managementToken-test.js b/test/api/managementToken-test.js
new file mode 100644
index 00000000..70aeb0df
--- /dev/null
+++ b/test/api/managementToken-test.js
@@ -0,0 +1,136 @@
+import { expect } from 'chai'
+import { describe, it, setup } from 'mocha'
+import { jsonReader } from '../utility/fileOperations/readwrite'
+import { createManagementToken, createManagementToken2 } from './mock/managementToken.js'
+import { contentstackClient } from '../utility/ContentstackClient.js'
+
+var client = {}
+
+var stack = {}
+var tokenUID = ''
+describe('Management Token api Test', () => {
+ setup(() => {
+ const user = jsonReader('loggedinuser.json')
+ stack = jsonReader('stack.json')
+ client = contentstackClient(user.authtoken)
+ })
+
+ it('Add a Management Token', done => {
+ makeManagementToken()
+ .create(createManagementToken)
+ .then((token) => {
+ expect(token.name).to.be.equal(createManagementToken.token.name)
+ expect(token.description).to.be.equal(createManagementToken.token.description)
+ expect(token.scope[0].module).to.be.equal(createManagementToken.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+
+ it('Add a Management Token for production', done => {
+ makeManagementToken()
+ .create(createManagementToken2)
+ .then((token) => {
+ tokenUID = token.uid
+ expect(token.name).to.be.equal(createManagementToken2.token.name)
+ expect(token.description).to.be.equal(createManagementToken2.token.description)
+ expect(token.scope[0].module).to.be.equal(createManagementToken2.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+
+ it('Get a Management Token from uid', done => {
+ makeManagementToken(tokenUID)
+ .fetch()
+ .then((token) => {
+ expect(token.name).to.be.equal(createManagementToken2.token.name)
+ expect(token.description).to.be.equal(createManagementToken2.token.description)
+ expect(token.scope[0].module).to.be.equal(createManagementToken2.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+
+ it('Query to get all Management Token', done => {
+ makeManagementToken()
+ .query()
+ .find()
+ .then((tokens) => {
+ tokens.items.forEach((token) => {
+ expect(token.name).to.be.not.equal(null)
+ expect(token.description).to.be.not.equal(null)
+ expect(token.scope[0].module).to.be.not.equal(null)
+ expect(token.uid).to.be.not.equal(null)
+ })
+ done()
+ })
+ .catch(done)
+ })
+
+ it('Query to get a Management Token from name', done => {
+ makeManagementToken()
+ .query({ query: { name: createManagementToken.token.name } })
+ .find()
+ .then((tokens) => {
+ tokens.items.forEach((token) => {
+ expect(token.name).to.be.equal(createManagementToken.token.name)
+ expect(token.description).to.be.equal(createManagementToken.token.description)
+ expect(token.scope[0].module).to.be.equal(createManagementToken.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ })
+ done()
+ })
+ .catch(done)
+ })
+
+ it('Fetch and update a Management Token from uid', done => {
+ makeManagementToken(tokenUID)
+ .fetch()
+ .then((token) => {
+ token.name = 'Update Production Name'
+ token.description = 'Update Production description'
+ token.scope = createManagementToken2.token.scope
+ return token.update()
+ })
+ .then((token) => {
+ expect(token.name).to.be.equal('Update Production Name')
+ expect(token.description).to.be.equal('Update Production description')
+ expect(token.scope[0].module).to.be.equal(createManagementToken2.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+
+ it('Update a Management Token from uid', done => {
+ const token = makeManagementToken(tokenUID)
+ Object.assign(token, createManagementToken2.token)
+ token.update()
+ .then((token) => {
+ expect(token.name).to.be.equal(createManagementToken2.token.name)
+ expect(token.description).to.be.equal(createManagementToken2.token.description)
+ expect(token.scope[0].module).to.be.equal(createManagementToken2.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+
+ it('Delete a Management Token from uid', done => {
+ makeManagementToken(tokenUID)
+ .delete()
+ .then((data) => {
+ expect(data.notice).to.be.equal('Management Token deleted successfully.')
+ done()
+ })
+ .catch(done)
+ })
+})
+
+function makeManagementToken (uid = null) {
+ return client.stack({ api_key: stack.api_key }).managementToken(uid)
+}
diff --git a/test/api/mock/managementToken.js b/test/api/mock/managementToken.js
new file mode 100644
index 00000000..bd08d49e
--- /dev/null
+++ b/test/api/mock/managementToken.js
@@ -0,0 +1,73 @@
+const createManagementToken = {
+ "token":{
+ "name":"Test Token",
+ "description":"This is a sample management token.",
+ "scope":[
+ {
+ "module":"content_type",
+ "acl":{
+ "read":true,
+ "write":true
+ }
+ },
+ {
+ "module":"branch",
+ "branches":[
+ "main"
+ ],
+ "acl":{
+ "read":true
+ }
+ },
+ {
+ "module":"branch_alias",
+ "branch_aliases":[
+ "tst"
+ ],
+ "acl":{
+ "read":true
+ }
+ }
+ ],
+ "expires_on":"2024-12-10",
+ "is_email_notification_enabled":true
+ }
+}
+const createManagementToken2 = {
+ "token":{
+ "name":"Test Token",
+ "description":"This is a sample management token.",
+ "scope":[
+ {
+ "module":"content_type",
+ "acl":{
+ "read":true,
+ "write":true
+ }
+ },
+ {
+ "module":"branch",
+ "branches":[
+ "main"
+ ],
+ "acl":{
+ "read":true
+ }
+ },
+ {
+ "module":"branch_alias",
+ "branch_aliases":[
+ "tst"
+ ],
+ "acl":{
+ "read":true
+ }
+ }
+ ],
+ "expires_on":"2024-12-10",
+ "is_email_notification_enabled":true
+ }
+}
+
+ export { createManagementToken, createManagementToken2 }
+
\ No newline at end of file
diff --git a/test/test.js b/test/test.js
index 8b4ec6b2..a66cd167 100644
--- a/test/test.js
+++ b/test/test.js
@@ -30,3 +30,4 @@ require('./api/terms-test')
require('./api/team-test')
require('./api/team-users-test')
require('./api/team-stack-role-mapping-test')
+require('./api/managementToken-test')
diff --git a/test/typescript/index.test.ts b/test/typescript/index.test.ts
index e7546da4..e6ab2d97 100644
--- a/test/typescript/index.test.ts
+++ b/test/typescript/index.test.ts
@@ -12,6 +12,7 @@ import { createBranchAlias, deleteBranchAlias, queryBranchAlias } from './branch
import { createLocale, deleteLocale, getLocale } from './locale';
import { createEnvironment, deleteEnvironment, getEnvironment, updateEnvironment } from './environment';
import { createDeliveryToken, deleteDeliveryToken, deliveryToken, queryDeliveryToken } from './deliveryToken';
+import { createManagementToken, deleteManagementToken, managementToken, queryManagementToken } from './managementToken';
import { createRole, findAllRole, getRole, getRoleUid, queryRole } from './role';
import { createApp, deleteApp, fetchApp, installation, updateApp, updateAuth } from './app';
import { deployment, hosting } from './hosting';
@@ -79,6 +80,11 @@ describe('Typescript API test', () => {
deliveryToken(stack)
deleteDeliveryToken(stack)
+ createManagementToken(stack.managementToken())
+ queryManagementToken(stack.managementToken())
+ managementToken(stack)
+ deleteManagementToken(stack)
+
findAllRole(stack.role())
createRole(stack.role())
getRole(stack)
diff --git a/test/typescript/managementToken.ts b/test/typescript/managementToken.ts
new file mode 100644
index 00000000..7fb2dff2
--- /dev/null
+++ b/test/typescript/managementToken.ts
@@ -0,0 +1,131 @@
+import { expect } from "chai"
+import path from "path"
+import { Stack } from "../../types/stack";
+import { ManagementToken, ManagementTokens } from "../../types/stack/managementToken";
+import { managementToken1, managementToken2 } from "./mock/managementToken";
+var tokenUID = ''
+export function createManagementToken(managementToken: ManagementTokens) {
+ describe('Management token create', () => {
+ test('Create a management token', done => {
+ managementToken.create(managementToken1)
+ .then((token) => {
+ expect(token.name).to.be.equal(managementToken1.token.name)
+ expect(token.description).to.be.equal(managementToken1.token.description)
+ expect(token.scope[0].module).to.be.equal(managementToken1.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+
+ test('Create management token for production', done => {
+ managementToken.create(managementToken2)
+ .then((token) => {
+ tokenUID = token.uid
+ expect(token.name).to.be.equal(managementToken2.token.name)
+ expect(token.description).to.be.equal(managementToken2.token.description)
+ expect(token.scope[0].module).to.be.equal(managementToken2.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+ })
+}
+
+export function queryManagementToken(managementToken: ManagementTokens) {
+ describe('Query management token', () => {
+ test('Get all management token', done => {
+ managementToken.query().find()
+ .then((tokens) => {
+ tokens.items.forEach((token) => {
+ expect(token.name).to.be.not.equal(null)
+ expect(token.description).to.be.not.equal(null)
+ expect(token.scope[0].module).to.be.not.equal(null)
+ expect(token.uid).to.be.not.equal(null)
+ })
+ done()
+ })
+ .catch(done)
+ })
+
+ test('Get management token from name', done => {
+ managementToken.query({query: {name: managementToken1.token.name}})
+ .find()
+ .then((tokens) => {
+ tokens.items.forEach((token) => {
+ expect(token.name).to.be.equal(managementToken1.token.name)
+ expect(token.description).to.be.equal(managementToken1.token.description)
+ expect(token.scope[0].module).to.be.equal(managementToken1.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ })
+ done()
+ })
+ .catch(done)
+ })
+ })
+}
+export function managementToken(stack: Stack) {
+ describe('Management token operations', () => {
+ test('Fetch management token', done => {
+ stack.managementToken(tokenUID)
+ .fetch()
+ .then((token) => {
+ expect(token.name).to.be.equal(managementToken2.token.name)
+ expect(token.description).to.be.equal(managementToken2.token.description)
+ expect(token.scope[0].module).to.be.equal(managementToken2.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+
+ test('Fetch and update a Management Token from uid', done => {
+ stack.managementToken(tokenUID)
+ .fetch()
+ .then((token) => {
+ token.name = 'Update Production Name'
+ token.description = 'Update Production description'
+ token.scope = managementToken2.token.scope
+ return token.update()
+ })
+ .then((token) => {
+ expect(token.name).to.be.equal('Update Production Name')
+ expect(token.description).to.be.equal('Update Production description')
+ expect(token.scope[0].module).to.be.equal(managementToken2.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+
+ test('Update management token from uid', done => {
+ const token = stack.managementToken(tokenUID)
+ Object.assign(token, managementToken2.token)
+
+ token.update()
+ .then((token) => {
+ expect(token.name).to.be.equal(managementToken2.token.name)
+ expect(token.description).to.be.equal(managementToken2.token.description)
+ expect(token.scope[0].module).to.be.equal(managementToken2.token.scope[0].module)
+ expect(token.uid).to.be.not.equal(null)
+ done()
+ })
+ .catch(done)
+ })
+ })
+}
+
+export function deleteManagementToken(stack: Stack) {
+ describe('Delete management token', () => {
+ test('Delete token from uid', done => {
+ stack.managementToken(tokenUID)
+ .delete()
+ .then((data) => {
+ expect(data.notice).to.be.equal('Management Token deleted successfully.')
+ done()
+ })
+ .catch(done)
+ })
+ })
+}
\ No newline at end of file
diff --git a/test/typescript/mock/managementToken.ts b/test/typescript/mock/managementToken.ts
new file mode 100644
index 00000000..d035c9d0
--- /dev/null
+++ b/test/typescript/mock/managementToken.ts
@@ -0,0 +1,73 @@
+const managementToken1 = {
+ "token":{
+ "name":"Test Token",
+ "description":"This is a sample management token.",
+ "scope":[
+ {
+ "module":"content_type",
+ "acl":{
+ "read":true,
+ "write":true
+ }
+ },
+ {
+ "module":"branch",
+ "branches":[
+ "main"
+ ],
+ "acl":{
+ "read":true
+ }
+ },
+ {
+ "module":"branch_alias",
+ "branch_aliases":[
+ "tst"
+ ],
+ "acl":{
+ "read":true
+ }
+ }
+ ],
+ "expires_on":"2024-12-10",
+ "is_email_notification_enabled":true
+ }
+}
+const managementToken2 = {
+ "token":{
+ "name":"Test Token",
+ "description":"This is a sample management token.",
+ "scope":[
+ {
+ "module":"content_type",
+ "acl":{
+ "read":true,
+ "write":true
+ }
+ },
+ {
+ "module":"branch",
+ "branches":[
+ "main"
+ ],
+ "acl":{
+ "read":true
+ }
+ },
+ {
+ "module":"branch_alias",
+ "branch_aliases":[
+ "tst"
+ ],
+ "acl":{
+ "read":true
+ }
+ }
+ ],
+ "expires_on":"2024-12-10",
+ "is_email_notification_enabled":true
+ }
+}
+
+ export { managementToken1, managementToken2 }
+
\ No newline at end of file
diff --git a/test/unit/index.js b/test/unit/index.js
index 1eccb05e..a06cb20b 100644
--- a/test/unit/index.js
+++ b/test/unit/index.js
@@ -38,3 +38,4 @@ require('./terms-test')
require('./team-test')
require('./team-users-test')
require('./team-stack-role-mapping-test')
+require('./managementToken-test')
diff --git a/test/unit/managementToken-test.js b/test/unit/managementToken-test.js
new file mode 100644
index 00000000..27f55400
--- /dev/null
+++ b/test/unit/managementToken-test.js
@@ -0,0 +1,180 @@
+import Axios from 'axios'
+import { expect } from 'chai'
+import { describe, it } from 'mocha'
+import MockAdapter from 'axios-mock-adapter'
+import { ManagementToken, ManagementTokenCollection } from '../../lib/stack/managementToken'
+import { systemUidMock, stackHeadersMock, managementTokenMock, noticeMock, checkSystemFields } from './mock/objects'
+import { checkEnvironment } from './environment-test'
+
+describe('Contentstack ManagementToken test', () => {
+ it('ManagementToken test without uid', done => {
+ const managementToken = makeManagementToken()
+ expect(managementToken.urlPath).to.be.equal('/stacks/management_tokens')
+ expect(managementToken.stackHeaders).to.be.equal(undefined)
+ expect(managementToken.update).to.be.equal(undefined)
+ expect(managementToken.delete).to.be.equal(undefined)
+ expect(managementToken.fetch).to.be.equal(undefined)
+ expect(managementToken.create).to.not.equal(undefined)
+ expect(managementToken.query).to.not.equal(undefined)
+ done()
+ })
+
+ it('ManagementToken test with uid', done => {
+ const managementToken = makeManagementToken({
+ token: {
+ ...systemUidMock
+ }
+ })
+ expect(managementToken.urlPath).to.be.equal(`/stacks/management_tokens/${systemUidMock.uid}`)
+ expect(managementToken.stackHeaders).to.be.equal(undefined)
+ expect(managementToken.update).to.not.equal(undefined)
+ expect(managementToken.delete).to.not.equal(undefined)
+ expect(managementToken.fetch).to.not.equal(undefined)
+ expect(managementToken.create).to.be.equal(undefined)
+ expect(managementToken.query).to.be.equal(undefined)
+ done()
+ })
+
+ it('ManagementToken test with Stack Headers', done => {
+ const managementToken = makeManagementToken({
+ token: {
+ ...systemUidMock
+ },
+ stackHeaders: stackHeadersMock
+ })
+ expect(managementToken.urlPath).to.be.equal(`/stacks/management_tokens/${systemUidMock.uid}`)
+ expect(managementToken.stackHeaders).to.not.equal(undefined)
+ expect(managementToken.stackHeaders.api_key).to.be.equal(stackHeadersMock.api_key)
+ expect(managementToken.update).to.not.equal(undefined)
+ expect(managementToken.delete).to.not.equal(undefined)
+ expect(managementToken.fetch).to.not.equal(undefined)
+ expect(managementToken.create).to.be.equal(undefined)
+ expect(managementToken.query).to.be.equal(undefined)
+ done()
+ })
+
+ it('ManagementToken Collection test with blank data', done => {
+ const managementToken = new ManagementTokenCollection(Axios, {})
+ expect(managementToken.length).to.be.equal(0)
+ done()
+ })
+
+ it('ManagementToken Collection test with data', done => {
+ const managementToken = new ManagementTokenCollection(Axios, {
+ tokens: [
+ managementTokenMock
+ ]
+ })
+ expect(managementToken.length).to.be.equal(1)
+ checkManagementToken(managementToken[0])
+ done()
+ })
+
+ it('ManagementToken create test', done => {
+ var mock = new MockAdapter(Axios)
+ mock.onPost('/stacks/management_tokens').reply(200, {
+ token: {
+ ...managementTokenMock
+ }
+ })
+ makeManagementToken()
+ .create()
+ .then((managementToken) => {
+ checkManagementToken(managementToken)
+ done()
+ })
+ .catch(done)
+ })
+
+ it('ManagementToken Query test', done => {
+ var mock = new MockAdapter(Axios)
+ mock.onGet('/stacks/management_tokens').reply(200, {
+ tokens: [
+ managementTokenMock
+ ]
+ })
+ makeManagementToken()
+ .query()
+ .find()
+ .then((managementTokens) => {
+ checkManagementToken(managementTokens.items[0])
+ done()
+ })
+ .catch(done)
+ })
+
+ it('ManagementToken update test', done => {
+ var mock = new MockAdapter(Axios)
+ mock.onPut('/stacks/management_tokens/UID').reply(200, {
+ token: {
+ ...managementTokenMock
+ }
+ })
+ makeManagementToken({
+ token: {
+ ...systemUidMock
+ },
+ stackHeaders: stackHeadersMock
+ })
+ .update()
+ .then((managementToken) => {
+ checkManagementToken(managementToken)
+ done()
+ })
+ .catch(done)
+ })
+
+ it('ManagementToken fetch test', done => {
+ var mock = new MockAdapter(Axios)
+ mock.onGet('/stacks/management_tokens/UID').reply(200, {
+ token: {
+ ...managementTokenMock
+ }
+ })
+ makeManagementToken({
+ token: {
+ ...systemUidMock
+ },
+ stackHeaders: stackHeadersMock
+ })
+ .fetch()
+ .then((managementToken) => {
+ checkManagementToken(managementToken)
+ done()
+ })
+ .catch(done)
+ })
+
+ it('ManagementToken delete test', done => {
+ var mock = new MockAdapter(Axios)
+ mock.onDelete('/stacks/management_tokens/UID').reply(200, {
+ ...noticeMock
+ })
+ makeManagementToken({
+ token: {
+ ...systemUidMock
+ },
+ stackHeaders: stackHeadersMock
+ })
+ .delete()
+ .then((response) => {
+ expect(response.notice).to.be.equal(noticeMock.notice)
+ done()
+ })
+ .catch(done)
+ })
+})
+
+function makeManagementToken (data = {}) {
+ return new ManagementToken(Axios, data)
+}
+
+function checkManagementToken (managementToken) {
+ checkSystemFields(managementToken)
+ expect(managementToken.name).to.be.equal('Test')
+ expect(managementToken.description).to.be.equal('description')
+ expect(managementToken.token).to.be.equal('token')
+ expect(managementToken.type).to.be.equal('management')
+ expect(managementToken.scope.length).to.be.equal(1)
+ checkEnvironment(managementToken.scope[0].environments[0])
+}
diff --git a/test/unit/mock/objects.js b/test/unit/mock/objects.js
index a8dbf9a9..85f0cc09 100644
--- a/test/unit/mock/objects.js
+++ b/test/unit/mock/objects.js
@@ -418,6 +418,22 @@ const deliveryTokenMock = {
type: 'delivery'
}
+const managementTokenMock = {
+ ...systemFieldsMock,
+ ...systemFieldsUserMock,
+ name: 'Test',
+ scope: [{
+ environments: [environmentMock],
+ module: 'environment',
+ acl: {
+ read: true
+ }
+ }],
+ description: 'description',
+ token: 'token',
+ type: 'management'
+}
+
const userAssignments = {
...stackHeadersMock,
content_type: 'CT_UID',
@@ -873,5 +889,6 @@ export {
stackRoleMappingMock,
mockCollection,
entryMockCollection,
- checkSystemFields
+ checkSystemFields,
+ managementTokenMock
}
diff --git a/types/stack/index.d.ts b/types/stack/index.d.ts
index a1363af3..331f036d 100644
--- a/types/stack/index.d.ts
+++ b/types/stack/index.d.ts
@@ -19,6 +19,7 @@ import { Role, Roles } from "./role";
import { Webhook, Webhooks } from "./webhook";
import { Workflow, Workflows } from "./workflow";
import { Taxonomy, Taxonomies } from "./taxonomy";
+import { ManagementToken, ManagementTokens } from "./managementToken";
export interface StackConfig {
api_key:string
@@ -96,4 +97,7 @@ export interface Stack extends SystemFields {
taxonomy(): Taxonomies
taxonomy(uid: string): Taxonomy
+
+ managementToken(): ManagementTokens
+ managementToken(uid: string): ManagementToken
}
diff --git a/types/stack/managementToken/index.ts b/types/stack/managementToken/index.ts
new file mode 100644
index 00000000..e8d5e34b
--- /dev/null
+++ b/types/stack/managementToken/index.ts
@@ -0,0 +1,27 @@
+import { AnyProperty, SystemFields } from "../../utility/fields";
+import { Queryable, SystemFunction } from "../../utility/operations";
+
+export interface ManagementToken extends SystemFields, SystemFunction {
+}
+
+export interface ManagementTokens extends Queryable {
+}
+
+export interface ManagementTokenData extends AnyProperty {
+ name: string
+ description: string
+ scope: Array
+}
+
+export interface Scope {
+ module: string
+ environments?: Array
+ locales?: Array
+ acl: ACL
+}
+export interface ACL extends AnyProperty {
+ read?: boolean
+ write?: boolean
+ create?: boolean
+ update?: boolean
+}
\ No newline at end of file