Om access te gebruiken op de users van een domain en de rechten op bepaalde stukken is er een SDK gemaakt, zijnde admin SDK.
De reference is:
https://developers.google.com/admin-sdk/directory/reference/rest en https://developers.google.com/admin-sdk/directory/v1/guides/manage-users
De nextPageToken, heb je nodig om de volgende 100 gebruikers af te vragen.
Deze wordt “undefined” als je de laatste blok hebt geladen of krijgt een lengte =0.
Je kan dit gebruiken om iteratief door de vragen te lopen tot je alles binnen hebt. (Maxusers is beperkt tot 500)
Indien je de call uitbreidt met een property .users, bekom je rechtstreeks de array met users, maar deze is beperkt tot de maxusers van 500).
Het aanpassen van deze pagina grootte doe je door het meegeven van de property: maxResults: 500
Welke gegevens je van een user kan verwachten, zijn terug te vinden in de API reference en in de APIs script guide (zie boven)
Wil je enkel een gedeelte van de info van de user dan kan je voor de concat deze op een simpele wijze selecteren door in de lus enkel deze gegevens toe te voegen aan de staff list obj die je nodig acht. (gebruik van de .map method)
Door gebruik te maken van de JS ternary operators kan je vrij krachtige code schrijven om iets op te zoeken, zoals in de job gebeuren.
Hier wordt gezocht of de user tot een organisatie behoort (meerdere in een domain mogelijk) en of in deze organisatie een property bestaat met de naam ‘titel’, als die gevonden wordt geven we de titel, zoniet wordt er een lege string terug gegeven. (eerste :””) en als de organisatie niet bestaat doen we dit eveneens (tweede :””)
function getUserOrgItem(user, item){
if(user.hasOwnProperty('organizations')){
const primaryOrg = user.organizations.flatMap( org => (org.primary == true)? org : "")[0]
return primaryOrg.hasOwnProperty(item)? primaryOrg.title : "";
}else{
return "";
}
}
Bovenstaande code gebruikt de method flatmap(), om in het object zoals een map alle elementen te evalueren en dan het resultaat één niveau dieper weer te geven.
Het kan dus gebruikt worden als een soort map().filter() combinatie.
Je mapt door alle org om te zien of er een primary organisatie is.
Indien dit het geval is geeft je de lijst van organisaties en hiervan het 0 de element terug.
Hierna kan je kijken of dit een titel heeft aps property.
function getAllUsersInOrg() {
let page = '';
let pageToken = '';
let staffList = [];
do{
page = AdminDirectory.Users.list({
domain:'myuba.be',
maxResults: 100,
pageToken: pageToken
})
// Store only selected info for each user.
let staffMember = page.users.map(user => {
return {
'firstName': user.name.givenName,
'lastName' : user.name.familyName,
'email' : user.primaryEmail
'job' : (user.hasOwnProperty('organizations'))?
(user.organizations[0].hasOwnProperty("title"))?
user.organizations[0].title : "" : ""
}
}
})
//put chunks of user lists together
staffList = staffList.concat(staffMember)
pageToken = page.nextPageToken;
}while(pageToken)
return staffList;
}
Als je in een webapp wil gebruik maken van bepaalde gegevens zodat gebruikers met minder rechten ook de lijst kunnen zien, kan je de
viewType:'domain_public'
aangeven in de call.
Deze gegeven zou je kunnen gebruiken om een selectielijst te maken van users in je webapp.
Je kan veel extra info kwijt in de users schema.
Dmv de property projection:
'full',
kan je het volledige schema opvragen van een domain.
Met
projection:'custom',
customFieldMask: 'staffTraining'
Kan je bepaalde custom fields bezien echter dit is beperkt als je het
viewType:domain_public
gebruikt
Standaard worden de gebruikers alfabetisch gesorteerd, maar je kan door het aanpassen van de properties deze aanpassen:
Je hebt keuze uit ‘email’, ‘familyName’ en ‘givenName’
orderBy:'email',
sortOrder:'descending'
Je kan als property een query meegeven om users te filteren die een bepaalde setting missen.
Zie Directory API user accounts en de Searchstring for users
Vb:
query:'changePasswordAtNextLogin=true'
Met de bovenstaande query weet je dat de gebruiker nog nooit heeft ingelogd
Wanneer deze info in een custom field zit, kan je dit als volgt refereren:
query:'myCustomSchema.myCustomField=queryvalue'
met de volgende code kan je een lijst bekomen van alle Groups adressen binnen een domain.
Wil je de gebruikers binnen een group kennen dan kan je per gebruiker vragen tot welke groep deze behoort met de propety Members.hasMember()
/**
* List membership groups for specific user
* @param {string} useradx email
* @param {string} domainname
* @return {array} groups array of arrays(GroupID & GroupName)
*/
function ListGroupsMembership_(useradx, domainname) {
let list = []
let groupslist = ListAllGroups_(domainname);
for (i = 0; i < groupslist.Group_email.length; i++) {
let result=AdminDirectory.Members.hasMember(groupslist.Group_email[i], useradx)
if (!result.isMember) {
//Logger.log(`No member`);
} else {
list.push([groupslist.Group_email[i], groupslist.Group_name[i]])
}
}
return list
}
/**
* Lists all the groups in the domain.
* @param {string} domainname
* @retun {object} groups as object of 2 arrays, name and email
*/
function ListAllGroups_(domainname) {
var pageToken;
var page;
var groupslist = {}
if(!groupslist.Group_name){groupslist.Group_name=[]}
if(!groupslist.Group_email){groupslist.Group_email=[]}
let idx=0
do {
page = AdminDirectory.Groups.list({
domain: domainname,
maxResults: 20,
pageToken: pageToken
});
var groups = page.groups;
if (groups) {
for (var i =0; i < groups.length; i++) {
var group = groups[i];
//Logger.log('%s (%s)', group.name, group.email);
groupslist.Group_name[idx]=group.name
groupslist.Group_email[idx]=group.email
idx=idx+1;
}
} else {
Logger.log('No groups found.');
}
pageToken = page.nextPageToken;
} while (pageToken);
return groupslist
}
Om dit te bekomen heb je meerdere bronnen nodig, zoals de users en tot welke group deze users behoren.
let Groupslist = ListAllGroups_(domainname)
let Users = GetAllUsersInOrg()
Door de lijst met gebruikers te doorlopen, komen we achter hun lidmaatschap.
let members_g = ListMembersOfGroup_(Groupslist.Group_email[i])
/**
* Groups/user map with role as matrix value
* @param{string} domain
* @return {object} object of arrays (one per group)
*/
function MapGroupsUsersrole_(domainname) {
let obj = {}
if (!obj.user) { obj.user = [] }
if (!obj.useradx) { obj.useradx = [] }
let Groupslist = ListAllGroups_(domainname)
let Users = GetAllUsersInOrg()
// create properties in object
for (let i = 0; i < Groupslist.Group_email.length; i++) {
if (!obj[Groupslist.Group_name[i]]) { obj[Groupslist.Group_name[i]] = [] }
}
// Create users per row"(first column and second column)
for (let i = 0; i < Users.length; i++) {
obj.user[i] = Users[i]["Employee ID"]
obj.useradx[i] = Users[i]["Email Address [Required]"]
}
for (let i = 0; i < Groupslist.Group_email.length; i++) {
let members_g = ListMembersOfGroup_(Groupslist.Group_email[i])
let groupID = Groupslist.Group_name[i]
let t = 0
let UIDX = obj.useradx.indexOf(members_g.email[t])
for (let r = 0; r < Users.length; r++) {
if (r == UIDX) {
obj[groupID][r] = members_g.role[t]
t++
if (t < members_g.email.length) {
UIDX = obj.useradx.indexOf(members_g.email[t])
} else {
UIDX = -1
}
} else {
obj[groupID][r] = ""
}
//Logger.log(`Group=${obj[groupID][r]} r=${r} i=${i}`)
}
}
return obj
}