UNPKG

fbam

Version:

Facebook workplace account management API

239 lines (222 loc) 7.74 kB
var fbInterface = require('./facebookInterface') var iface const schemas = [ 'urn:scim:schemas:core:1.0', 'urn:scim:schemas:extension:enterprise:1.0', 'urn:scim:schemas:extension:facebook:starttermdates:1.0', 'urn:scim:schemas:extension:facebook:accountstatusdetails:1.0' ] const metadata = [ // Basic Data (urn:scim:schemas:core:1.0) { 'fbid': 'userName', 'id': 'userName', 'required' : true}, { 'fbid': 'displayName', 'id': 'displayName'}, { 'fbid': 'title', 'id': 'title'}, { 'fbid': 'nickName', 'id': 'nickName'}, { 'fbid': 'profileUrl', 'id': 'profileUrl'}, { 'fbid': 'preferredLanguage', 'id': 'preferredLanguage'}, { 'fbid': 'locale', 'id': 'locale'}, { 'fbid': 'timezone', 'id': 'timezone'}, { 'fbid': 'active', 'id': 'active', 'required' : true}, { 'fbid': 'userType', 'id': 'userType'}, { 'fbid': 'photos', 'id': 'phtos'}, { 'fbid': 'emails', 'id': 'emails'}, { 'fbid': 'phoneNumbers', 'id': 'phoneNumbers'}, { 'fbid': 'ims', 'id': 'ims'}, { 'fbid': 'roles', 'id': 'roles'}, { 'fbid': 'entitlements', 'id': 'entitlements'}, { 'fbid': 'addresses', 'id': 'addresses'}, { 'fbid': 'x509Certificates', 'id': 'certificates'}, { 'fbid': 'schemas', 'id': 'schemas'}, { 'fbid': 'id', 'id': 'id'}, { 'fbid': 'externalId', 'id': 'externalId'}, // Name Structure { 'fbid': 'name', 'required' : true, 'structure': [ {'fbid': 'formatted' , 'id': 'name', 'required' : true}, {'fbid': 'familyName', 'id': 'lastName'}, {'fbid': 'givenName' , 'id': 'firstName'}, {'fbid': 'middleName', 'id': 'middleName'}, // MiddleName & Honorary is not managed ] }, { 'fbid': 'urn:scim:schemas:extension:facebook:starttermdates:1.0', 'structure': [ {'fbid': 'startDate', 'id': 'startDate'}, {'fbid': 'termDate', 'id': 'termDate'} ]}, { 'fbid': 'urn:scim:schemas:extension:enterprise:1.0', 'structure': [ {'fbid': 'employeeNumber', 'id': 'employeeNumber'}, {'fbid': 'costCenter', 'id': 'costCenter'}, {'fbid': 'organization', 'id': 'organization'}, {'fbid': 'division', 'id': 'division'}, {'fbid': 'department', 'id': 'department'}, {'fbid': 'manager', 'id': 'manager'} ]}, { 'fbid': 'urn:scim:schemas:extension:facebook:accountstatusdetails:1.0', 'structure': [ {'fbid': 'invited', 'id': 'invited'}, {'fbid': 'claimed', 'id': 'claimed'}, {'fbid': 'invitedDate', 'id': 'invitedDate'}, {'fbid': 'claimedDate', 'id': 'claimedDate'}, {'fbid': 'claimLink', 'id': 'claimLink'} ]} ] class FbUser { // Construct an Item assuming data is coming from Facebook constructor(user) { var self = this if (typeof user === 'undefined') { return this } metadata.forEach(function(entry) { if (typeof user[entry.fbid] !== 'undefined') { if (entry.structure) { entry.structure.forEach(function(subentry) { if (typeof user[entry.fbid][subentry.fbid] !== 'undefined') { self[subentry.id] = user[entry.fbid][subentry.fbid] } }) } else { self[entry.id] = user[entry.fbid] } } }) } static enableIface(endpoint, token) { if (endpoint && token) { iface = new fbInterface(endpoint, token) return true } else { return false } } // Lookup in FB and return a fbUser static getUserByUsername(username) { return iface.searchUsers({'filter': 'userName eq "' + username + '"'}).then(data => { if (data.totalResults === 1) { return new FbUser(data.Resources[0]) } return null }).catch(function () { return null }) } /* Lookup by External ID is not supported by Facebook API Yet */ // TODO: Might have to test that by including schema /********************************************************************* static getUserByExternalId(externalId) { return iface.searchUsers({'filter': 'externalId eq "' + externalId + '"'}).then(data => { if (data.totalResults === 1) { return new FbUser(data.Resources[0]) } return null }).catch(function (err) { console.log(err) return null }) } *********************************************************************/ // Lookup in FB and return a fbUser static getUserById(id) { return iface.getUser(id).then(data => { return new FbUser(data) }).catch(function () { return null }) } // Get All Users static getUsers() { return iface.searchUsers().then(data => { var users = [] data.Resources.map(function(user) { users.push(new FbUser(user)) }) return users }).catch(function () { return [] }) } // Update User in Facebook save() { if (this.id) { return this._update() } else { return this.constructor.getUserByUsername(this.userName) .then(user => { if (user) { this.id = user.id return this._update() } return this._create() }) } } _inactivateUser() { this.active = false return this._update() } // Delete the User in facebook. Since Claimed user cannot be deleted, Inactivate the user Instead. delete() { if (this.claimed === false) { return iface.deleteUser(this.ToFacebook()) .then(data => { return data }) .catch(function() { return false }) } else { return this._inactivateUser() } } // Update the User in Facebook _update() { return iface.updateUser(this.ToFacebook()) .then(data => { return data }) .catch(function() { return false }) } // Create the User in Facebook _create() { //TODO : Check Required Fields return iface.createUser(this.ToFacebook()) .then(data => { return data }) .catch(function() { return null }) } ToFacebook() { var self = this var user = {} metadata.forEach(function(entry) { if (entry.structure) { entry.structure.forEach(function(subentry) { if (typeof self[subentry.id] !== 'undefined') { if (typeof user[entry.fbid] === 'undefined') { user[entry.fbid] = {} } user[entry.fbid][subentry.fbid] = self[subentry.id] } }) } else { if (typeof self[entry.id] !== 'undefined') { user[entry.fbid] = self[entry.id] } } }) if (!user.schemas) { user.schemas = schemas } return user } } module.exports = FbUser;