Skip to content

Commit 1de979f

Browse files
authored
Merge pull request #82 from docusign/feature/admin-api-new-examples
Added new Admin API eg008 and eg009 code examples
2 parents 6c2317d + 74babab commit 1de979f

15 files changed

+699
-39
lines changed

config/examplesApi.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"examplesApi":{"isESignatureApi":true,"isRoomsApi":false,"isClickApi":false,"isMonitorApi":false,"isAdminApi":false}}
1+
{"examplesApi":{"isESignatureApi":false,"isRoomsApi":false,"isClickApi":false,"isMonitorApi":false,"isAdminApi":true}}

index.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ const {
4949
const {
5050
eg001admin, eg002admin, eg003admin,
5151
eg004admin, eg005admin, eg006admin,
52-
eg007admin
52+
eg007admin, eg008admin, eg009admin
5353
} = require("./lib/admin/controllers");
5454

5555
const PORT = process.env.PORT || 3000;
@@ -161,6 +161,10 @@ if (examplesApi.examplesApi.isRoomsApi) {
161161
.post('/eg006', eg006admin.createController)
162162
.get('/eg007', eg007admin.getController)
163163
.post('/eg007', eg007admin.createController)
164+
.get('/eg008', eg008admin.getController)
165+
.post('/eg008', eg008admin.createController)
166+
.get('/eg009', eg009admin.getController)
167+
.post('/eg009', eg009admin.createController)
164168
} else {
165169
app.get('/eg001', eg001.getController)
166170
.post('/eg001', eg001.createController)

lib/admin/controllers/eg002CreateCLMESignUser.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ eg002CreateCLMESignUser.createController = async (req, res) => {
6363
res.render("pages/error", { err: error, errorCode, errorMessage });
6464
}
6565
if (results) {
66+
req.session.clmEmail = validator.escape(body.email);
67+
6668
res.render("pages/example_done", {
6769
title: "Create active user for CLM and eSignature",
6870
h1: "Create active user for CLM and eSignature",
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/**
2+
* @file
3+
* Example 008: Update user product permission profiles using an email address
4+
* @author DocuSign
5+
*/
6+
7+
const path = require('path')
8+
const validator = require('validator');
9+
const { updateUserProductPermissionProfile, getProductPermissionProfiles } = require('../examples/updateUserProductPermissionProfile');
10+
const dsConfig = require('../../../config/index.js').config;
11+
const { getOrganizationId } = require("../getOrganizationId.js");
12+
const { checkUserExistsByEmail } = require("../getData.js");
13+
14+
const eg008UpdateUserProductPermissionProfile = exports;
15+
const eg = 'eg008' // This example reference.;
16+
const mustAuthenticate = '/ds/mustAuthenticate';
17+
const minimumBufferMin = 3;
18+
19+
/**
20+
* Update user product permission profiles using an email address
21+
* @param {object} req Request obj
22+
* @param {object} res Response obj
23+
*/
24+
eg008UpdateUserProductPermissionProfile.createController = async (req, res) => {
25+
// At this point we should have a good token. But we
26+
// double-check here to enable a better UX to the user.
27+
const isTokenOK = req.dsAuth.checkToken(minimumBufferMin);
28+
if (!isTokenOK) {
29+
req.flash("info", "Sorry, you need to re-authenticate.");
30+
// Save the current operation so it will be resumed after authentication
31+
req.dsAuth.setEg(req, eg);
32+
return res.redirect(mustAuthenticate);
33+
}
34+
35+
const userEmail = req.session.clmEmail;
36+
if (!userEmail || !await checkUserExistsByEmail(req, userEmail)) {
37+
return res.render("pages/admin-examples/eg008UpdateUserProductPermissionProfile", {
38+
eg: eg, csrfToken: req.csrfToken(),
39+
title: "Update user product permission profiles using an email address",
40+
emailOk: false,
41+
sourceFile: sourceFile,
42+
sourceUrl: dsConfig.githubExampleUrl + 'admin/examples/' + sourceFile,
43+
documentation: dsConfig.documentation + eg,
44+
showDoc: dsConfig.documentation
45+
});
46+
}
47+
48+
const { body } = req;
49+
50+
const productId = validator.escape(body.productId);
51+
let args = {
52+
accessToken: req.user.accessToken,
53+
basePath: dsConfig.adminAPIUrl,
54+
accountId: req.session.accountId,
55+
organizationId: req.session.organizationId,
56+
email: req.session.clmEmail,
57+
productId: productId
58+
};
59+
60+
const { clmProductId } = await getProductPermissionProfiles(args);
61+
62+
args.permissionProfileId = productId === clmProductId
63+
? validator.escape(body.clmPermissionProfileId)
64+
: validator.escape(body.eSignPermissionProfileId)
65+
66+
let results = null;
67+
try {
68+
results = await updateUserProductPermissionProfile(args);
69+
}
70+
catch (error) {
71+
const errorBody = error && error.response && error.response.body;
72+
// we can pull the DocuSign error code and message from the response body
73+
const errorCode = errorBody && errorBody.errorCode;
74+
const errorMessage = errorBody && errorBody.message;
75+
76+
// In production, may want to provide customized error messages and
77+
// remediation advice to the user.
78+
res.render("pages/error", { err: error, errorCode, errorMessage });
79+
}
80+
if (results) {
81+
res.render("pages/example_done", {
82+
title: "Update user product permission profiles using an email address",
83+
h1: "Update user product permission profiles using an email address",
84+
message: "Results from MultiProductUserManagement:addUserProductPermissionProfilesByEmail method:",
85+
json: JSON.stringify(results).replace(/'/g, '')
86+
});
87+
}
88+
}
89+
90+
/**
91+
* Form page for this application
92+
*/
93+
eg008UpdateUserProductPermissionProfile.getController = async (req, res) => {
94+
// Check that the authentication token is ok with a long buffer time.
95+
// If needed, now is the best time to ask the user to authenticate
96+
// since they have not yet entered any information into the form.
97+
const isTokenOK = req.dsAuth.checkToken();
98+
if (!isTokenOK) {
99+
// Save the current operation so it will be resumed after authentication
100+
req.dsAuth.setEg(req, eg);
101+
return res.redirect(mustAuthenticate);
102+
}
103+
104+
await getOrganizationId(req);
105+
106+
const userEmail = req.session.clmEmail;
107+
const sourceFile = (path.basename(__filename))[5].toLowerCase() + (path.basename(__filename)).substr(6);
108+
if (!userEmail || !await checkUserExistsByEmail(req, userEmail)) {
109+
return res.render("pages/admin-examples/eg008UpdateUserProductPermissionProfile", {
110+
eg: eg, csrfToken: req.csrfToken(),
111+
title: "Update user product permission profiles using an email address",
112+
emailOk: false,
113+
sourceFile: sourceFile,
114+
sourceUrl: dsConfig.githubExampleUrl + 'admin/examples/' + sourceFile,
115+
documentation: dsConfig.documentation + eg,
116+
showDoc: dsConfig.documentation
117+
});
118+
}
119+
120+
try {
121+
const args = {
122+
accessToken: req.user.accessToken,
123+
basePath: dsConfig.adminAPIUrl,
124+
accountId: req.session.accountId,
125+
organizationId: req.session.organizationId
126+
};
127+
128+
const { clmPermissionProfiles, eSignPermissionProfiles, products } = await getProductPermissionProfiles(args);
129+
130+
res.render("pages/admin-examples/eg008UpdateUserProductPermissionProfile", {
131+
eg: eg, csrfToken: req.csrfToken(),
132+
title: "Update user product permission profiles using an email address",
133+
clmPermissionProfiles: clmPermissionProfiles,
134+
eSignPermissionProfiles: eSignPermissionProfiles,
135+
emailOk: true,
136+
email: req.session.clmEmail,
137+
products: products,
138+
sourceFile: sourceFile,
139+
sourceUrl: dsConfig.githubExampleUrl + 'admin/examples/' + sourceFile,
140+
documentation: dsConfig.documentation + eg,
141+
showDoc: dsConfig.documentation
142+
});
143+
}
144+
catch (error) {
145+
const errorBody = error && error.response && error.response.body;
146+
// we can pull the DocuSign error code and message from the response body
147+
const errorCode = errorBody && errorBody.errorCode;
148+
const errorMessage = errorBody && errorBody.message;
149+
150+
// In production, may want to provide customized error messages and
151+
// remediation advice to the user.
152+
res.render("pages/error", { err: error, errorCode: errorCode, errorMessage: errorMessage });
153+
}
154+
}
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
/**
2+
* @file
3+
* Example 009: Delete user product permission profiles using an email address
4+
* @author DocuSign
5+
*/
6+
7+
const path = require('path')
8+
const validator = require('validator');
9+
const { deleteUserProductPermissionProfile, getProductPermissionProfilesByEmail } = require('../examples/deleteUserProductPermissionProfile');
10+
const dsConfig = require('../../../config/index.js').config;
11+
const { getOrganizationId } = require("../getOrganizationId.js");
12+
const { checkUserExistsByEmail } = require("../getData.js");
13+
14+
const eg009DeleteUserProductPermissionProfile = exports;
15+
const eg = 'eg009' // This example reference.;
16+
const mustAuthenticate = '/ds/mustAuthenticate';
17+
const minimumBufferMin = 3;
18+
19+
/**
20+
* Delete user product permission profiles using an email address
21+
* @param {object} req Request obj
22+
* @param {object} res Response obj
23+
*/
24+
eg009DeleteUserProductPermissionProfile.createController = async (req, res) => {
25+
// At this point we should have a good token. But we
26+
// double-check here to enable a better UX to the user.
27+
const isTokenOK = req.dsAuth.checkToken(minimumBufferMin);
28+
if (!isTokenOK) {
29+
req.flash("info", "Sorry, you need to re-authenticate.");
30+
// Save the current operation so it will be resumed after authentication
31+
req.dsAuth.setEg(req, eg);
32+
return res.redirect(mustAuthenticate);
33+
}
34+
35+
const userEmail = req.session.clmEmail;
36+
if (!userEmail || !await checkUserExistsByEmail(req, userEmail)) {
37+
return res.render("pages/admin-examples/eg009DeleteUserProductPermissionProfile", {
38+
eg: eg, csrfToken: req.csrfToken(),
39+
title: "Delete user product permission profiles using an email address",
40+
emailOk: false,
41+
sourceFile: sourceFile,
42+
sourceUrl: dsConfig.githubExampleUrl + 'admin/examples/' + sourceFile,
43+
documentation: dsConfig.documentation + eg,
44+
showDoc: dsConfig.documentation
45+
});
46+
}
47+
48+
const body = req.body;
49+
const args = {
50+
accessToken: req.user.accessToken,
51+
basePath: dsConfig.adminAPIUrl,
52+
accountId: req.session.accountId,
53+
organizationId: req.session.organizationId,
54+
email: req.session.clmEmail,
55+
productId: validator.escape(body.productId)
56+
}
57+
58+
let results = null;
59+
try {
60+
results = await deleteUserProductPermissionProfile(args);
61+
}
62+
catch (error) {
63+
const errorBody = error && error.response && error.response.body;
64+
// we can pull the DocuSign error code and message from the response body
65+
const errorCode = error && error.status || errorBody && errorBody.errorCode;
66+
const errorMessage = errorBody && errorBody.error_description || errorBody.message;
67+
68+
// In production, may want to provide customized error messages and
69+
// remediation advice to the user.
70+
res.render("pages/error", { err: error, errorCode, errorMessage });
71+
}
72+
if (results) {
73+
res.render("pages/example_done", {
74+
title: "Delete user product permission profiles using an email address",
75+
h1: "Delete user product permission profiles using an email address",
76+
message: "Results from MultiProductUserManagement:removeUserProductPermission method:",
77+
json: JSON.stringify(results).replace(/'/g, '')
78+
});
79+
}
80+
}
81+
82+
/**
83+
* Form page for this application
84+
*/
85+
eg009DeleteUserProductPermissionProfile.getController = async (req, res) => {
86+
// Check that the authentication token is ok with a long buffer time.
87+
// If needed, now is the best time to ask the user to authenticate
88+
// since they have not yet entered any information into the form.
89+
const isTokenOK = req.dsAuth.checkToken();
90+
if (!isTokenOK) {
91+
req.flash("info", "Sorry, you need to re-authenticate.");
92+
// Save the current operation so it will be resumed after authentication
93+
req.dsAuth.setEg(req, eg);
94+
return res.redirect(mustAuthenticate);
95+
}
96+
97+
await getOrganizationId(req);
98+
99+
const userEmail = req.session.clmEmail;
100+
const sourceFile = (path.basename(__filename))[5].toLowerCase() + (path.basename(__filename)).substr(6);
101+
if (!userEmail || !await checkUserExistsByEmail(req, userEmail)) {
102+
return res.render("pages/admin-examples/eg009DeleteUserProductPermissionProfile", {
103+
eg: eg, csrfToken: req.csrfToken(),
104+
title: "Delete user product permission profiles using an email address",
105+
emailOk: false,
106+
sourceFile: sourceFile,
107+
sourceUrl: dsConfig.githubExampleUrl + 'admin/examples/' + sourceFile,
108+
documentation: dsConfig.documentation + eg,
109+
showDoc: dsConfig.documentation
110+
});
111+
}
112+
113+
try {
114+
const args = {
115+
accessToken: req.user.accessToken,
116+
basePath: dsConfig.adminAPIUrl,
117+
accountId: req.session.accountId,
118+
organizationId: req.session.organizationId,
119+
email: req.session.clmEmail
120+
};
121+
122+
const productPermissionProfiles = await getProductPermissionProfilesByEmail(args);
123+
let permissionProfileList = [];
124+
let permissionName;
125+
126+
// Create the permission profile list that will be used on example page
127+
if (productPermissionProfiles && productPermissionProfiles.length > 0) {
128+
productPermissionProfiles.forEach(product => {
129+
let permissionProfiles = product["permission_profiles"];
130+
131+
permissionProfiles.forEach(profile => {
132+
permissionName = product["product_name"].includes("CLM")
133+
? `CLM - ${profile["permission_profile_name"]}`
134+
: `eSignature - ${profile["permission_profile_name"]}`;
135+
136+
// Add current permission profile data to the list if it was not added yet
137+
if (permissionProfileList.filter(prof => prof["productId"] === product["product_id"]).length === 0) {
138+
permissionProfileList.push({ productId: product["product_id"], permissionName });
139+
}
140+
});
141+
});
142+
}
143+
144+
res.render("pages/admin-examples/eg009DeleteUserProductPermissionProfile", {
145+
eg: eg, csrfToken: req.csrfToken(),
146+
title: "Delete user product permission profiles using an email address",
147+
permissionProfileList: permissionProfileList,
148+
emailOk: true,
149+
email: req.session.clmEmail,
150+
sourceFile: sourceFile,
151+
sourceUrl: dsConfig.githubExampleUrl + 'admin/examples/' + sourceFile,
152+
documentation: dsConfig.documentation + eg,
153+
showDoc: dsConfig.documentation
154+
});
155+
}
156+
catch (error) {
157+
const errorBody = error && error.response && error.response.body;
158+
// we can pull the DocuSign error code and message from the response body
159+
const errorCode = errorBody && errorBody.errorCode;
160+
const errorMessage = errorBody && errorBody.message;
161+
162+
// In production, may want to provide customized error messages and
163+
// remediation advice to the user.
164+
res.render("pages/error", { err: error, errorCode: errorCode, errorMessage: errorMessage });
165+
}
166+
}

lib/admin/controllers/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ module.exports.eg004admin = require('./eg004ImportUser');
55
module.exports.eg005admin = require('./eg005AuditUsers');
66
module.exports.eg006admin = require('./eg006GetUserProfileByEmail');
77
module.exports.eg007admin = require('./eg007GetUserProfileByUserId');
8+
module.exports.eg008admin = require('./eg008UpdateUserProductPermissionProfile')
9+
module.exports.eg009admin = require('./eg009DeleteUserProductPermissionProfile')

0 commit comments

Comments
 (0)