-
Notifications
You must be signed in to change notification settings - Fork 14
/
create_user.gs
121 lines (106 loc) · 3.57 KB
/
create_user.gs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// this file is separate from the other script(s) and does not use script-
// properties, just the API creds below. The script can be easily expanded
// to include e.g. a mail merge to send the generated URL to the new user
var BASE_URL = 'XXX';
var CLIENT_ID = 'XXX';
var CLIENT_SECRET = 'XXX';
/**
* Creates a new user in Looker
*
* @param {string} email The user email address
* @param {string} roles Comma-separated roles (e.g. "1,2,3")
* @return The user setup link
* @customfunction
*/
function CREATE_LOOKER_USER(email, roles) {
if(email.match(/^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/g) == null) {
return "Not a valid email address.";
} else {
var existing_user = checkExistingUser(email);
if (existing_user.length == 0) {
Logger.log("User does not yet exist. Creating new user...");
var user_id = createNewUser();
addEmail(email, user_id);
if(roles != null || roles != "") {addRoles(user_id, roles)};
var reset_token = getPasswordResetToken(user_id);
var setup_url = BASE_URL.split(/(:19999)/)[0] + '/account/setup/' + reset_token;
return setup_url;
}
else {
Logger.log("No new user created, user " + email +
" already exists.");
return "User " + email + " already exists!";
}
}
}
function checkExistingUser(email_address) {
var options = {
'method': 'get',
'headers': {
'Authorization': 'token ' + login()
}
};
var existing_user = UrlFetchApp.fetch(BASE_URL + "/users/search?email=" +
encodeURIComponent(email_address), options);
existing_user = JSON.parse(existing_user.getContentText());
return existing_user;
}
function createNewUser() {
var options = {
'method': 'post',
'headers': {
'Authorization': 'token ' + login()
},
'payload': JSON.stringify({})
};
var new_user = UrlFetchApp.fetch(BASE_URL + "/users", options);
var user_id = parseInt(JSON.parse(new_user.getContentText()).id);
return user_id;
}
function addEmail(email, user_id) {
var options = {
'method': 'post',
'headers': {
'Authorization': 'token ' + login()
},
'payload': JSON.stringify({
'email': email
})
};
var response = UrlFetchApp.fetch(BASE_URL + "/users/" + user_id +
"/credentials_email", options);
}
function addRoles(user_id, roles) {
var roles_array = roles.toString().split(",").map(function(role) {return role.trim()});
Logger.log(roles_array);
var options = {
'method': 'put',
'headers': {
'Authorization': 'token ' + login()
}
};
options.payload = JSON.stringify(roles_array)
var response = UrlFetchApp.fetch(BASE_URL + "/users/" + user_id +
"/roles", options);
}
function getPasswordResetToken(user_id) {
var options = {
'method': 'post',
'headers': {
'Authorization': 'token ' + login()
}
};
var response = UrlFetchApp.fetch(BASE_URL + "/users/" + user_id +
"/credentials_email/password_reset", options);
var reset_url = JSON.parse(response.getContentText()).password_reset_url;
var reset_token = reset_url.split('/').pop(); // get the reset token only
return reset_token;
}
function login() {
var post = {
'method': 'post'
};
var response = UrlFetchApp.fetch(BASE_URL + "/login?client_id=" +
CLIENT_ID + "&client_secret=" + CLIENT_SECRET, post);
return JSON.parse(response.getContentText()).access_token;
}