Skip to content

Commit edbb95c

Browse files
author
sachin-maheshwari
authored
Merge pull request #275 from rakibansary/feat/onboard-wizard
feat: onboarding wizard
2 parents 9ba7285 + bdd41ae commit edbb95c

File tree

2 files changed

+130
-1
lines changed

2 files changed

+130
-1
lines changed

web-assets/auth0/dev-tenant/database/create.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ function create(user, callback) {
3333
var utmMedium = user.user_metadata.utmMedium;
3434
var utmCampaign = user.user_metadata.utmCampaign;
3535
var retUrl = user.user_metadata.returnUrl;
36-
var afterActivationURL = "https://platform." + configuration.DOMAIN + "/onboard";
36+
var afterActivationURL = retUrl != null ? retUrl : "https://" + configuration.DOMAIN + "/home";
3737
if (regSource === configuration.REG_BUSINESS) {
3838
afterActivationURL = "https://connect." + configuration.DOMAIN;
3939
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
function (user, context, callback) {
2+
if (context.clientID === configuration.CLIENT_ACCOUNTS_LOGIN) {
3+
console.log("rule:onboarding-checklist:enter");
4+
5+
if (context.redirect) {
6+
console.log("rule:onboarding-checklist:exiting due to context being a redirect");
7+
return callback(null, user, context);
8+
}
9+
10+
const _ = require('lodash');
11+
12+
let handle = _.get(user, "handle", null);
13+
const provider = _.get(user, "identities[0].provider", null);
14+
if (!handle && provider === "auth0") {
15+
handle = _.get(user, "nickname", null);
16+
}
17+
18+
const loginCount = _.get(context, "stats.loginsCount");
19+
console.log('rule:onboarding-checklist: loginCount', loginCount);
20+
21+
const getToken = function(callback) {
22+
if (global.M2MToken) {
23+
console.log('rule:onboarding-checklist:M2M token is available');
24+
const jwt = require('jsonwebtoken');
25+
const moment = require('moment');
26+
const decoded = jwt.decode(global.M2MToken);
27+
const exp = moment.unix(decoded.exp);
28+
29+
if (exp > new Date()) {
30+
console.log('rule:onboarding-checklist:M2M token is valid. Reusing...');
31+
return callback(null, global.M2MToken);
32+
}
33+
}
34+
35+
console.log('rule:onboarding-checklist:Fetching new M2M token');
36+
request.post({
37+
url: `https://auth0proxy.${configuration.DOMAIN}/token`,
38+
headers: 'content-type: application/json',
39+
json: {
40+
client_id: configuration.M2M_CLIENT_ID,
41+
client_secret: configuration.M2M_CLIENT_SECRET,
42+
audience: configuration.M2M_AUDIENCE,
43+
auth0_url: configuration.M2M_TOKEN_URL,
44+
grant_type: 'client_credentials'
45+
}
46+
}, function (err, response, body) {
47+
if (err) {
48+
return callback(err);
49+
}
50+
51+
global.M2MToken = body.access_token;
52+
console.log('rule:onboarding-checklist:setting the M2MToken globally');
53+
return callback(null, global.M2MToken);
54+
});
55+
}
56+
57+
getToken(function(err, token) {
58+
if (err) {
59+
console.log('rule:onboarding-checklist:failed to fetch M2M token.');
60+
return callback(null, user, context);
61+
}
62+
63+
console.log("rule:onboarding-checklist: fetch onboarding_checklist for email/handle: ", user.email, handle, provider);
64+
global.AUTH0_CLAIM_NAMESPACE = "https://" + configuration.DOMAIN + "/";
65+
try {
66+
const axios = require('axios@0.19.2');
67+
68+
const redirectUrl = `https://platform.${configuration.DOMAIN}/onboard`;
69+
const options = {
70+
method: 'GET',
71+
url: `https://api.${configuration.DOMAIN}/v5/members/${handle}/traits?traitIds=onboarding_checklist`,
72+
headers: {
73+
Authorization: `Bearer ${token}`
74+
}
75+
}
76+
77+
axios(options).then(result => {
78+
const data = result.data;
79+
80+
if (data.length === 0) {
81+
context.redirect = {
82+
url: redirectUrl
83+
}
84+
console.log('rule:onboarding-checklist:Setting redirectUrl', redirectUrl);
85+
return callback(null, user, context);
86+
}
87+
88+
const onboardingChecklistTrait = data.filter((item) => item.traitId === 'onboarding_checklist')[0].traits;
89+
90+
for (let checklistTrait of onboardingChecklistTrait.data) {
91+
if (
92+
checklistTrait.onboarding_wizard != null &&
93+
(checklistTrait.onboarding_wizard.status != null ||
94+
checklistTrait.onboarding_wizard.skip)
95+
) {
96+
return callback(null, user, context);
97+
}
98+
}
99+
100+
const profileCompletedData = onboardingChecklistTrait.data[0].profile_completed;
101+
102+
if (profileCompletedData) {
103+
if (profileCompletedData.status === "completed") {
104+
return callback(null, user, context);
105+
}
106+
107+
for (const item in profileCompletedData.metadata) {
108+
if (profileCompletedData.metadata[item]) {
109+
return callback(null, user, context);
110+
}
111+
}
112+
}
113+
114+
context.redirect = {
115+
url: redirectUrl
116+
}
117+
console.log('rule:onboarding-checklist:Setting redirectUrl', redirectUrl);
118+
return callback(null, user, context);
119+
})
120+
121+
} catch (e) {
122+
console.log("rule:onboarding-checklist:Error in fetching onboarding_checklist", + e);
123+
return callback(null, user, context);
124+
}
125+
})
126+
} else {
127+
return callback(null, user, context);
128+
}
129+
}

0 commit comments

Comments
 (0)