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