aladdin-connect
Version:
Client module for opening + closing garage doors via the Genie Aladdin Connect
100 lines (91 loc) • 2.96 kB
JavaScript
const envcheck = require('./envcheck')
const series = require('run-series')
const tiny = require('tiny-json-http')
/**
* Session
* - Once validated, Aladdin passes back a session token
* - To keep this module stateless, we'll fetch the token upon each request
*/
module.exports = function AladdinConnectSessionRequest(params, callback) {
envcheck(function go(err) {
if (err) callback(err)
else {
if (!callback && typeof params === 'function') {
callback = params
params = undefined
}
params = params || {}
let {deviceNumber=0} = params
const geniePortalAPI = 'https://genie.exosite.com/api/portals/v1'
const env = process.env
const user = env.ALADDIN_USER
const password = env.ALADDIN_PASSWORD
// Set up standard headers
let auth = Buffer.from(`${user}:${password}`).toString('base64')
let headers = {
Authorization: `Basic ${auth}`,
AppVersion: '3.0.0',
BundleName: 'com.geniecompany.AladdinConnect',
BuildVersion: '131',
'Content-Type': 'application/json',
'User-Agent': 'Aladdin Connect iOS v3.0.0'
}
// Assigned below
let userID
let portalID
let body
series([
// Although not J*T, per exosite docs login tokens do have a TTL
function getToken(callback) {
let url = `${geniePortalAPI}/users/_this/token`
tiny.get({url, headers}, function _done(err, response) {
if (err) callback(err)
else {
headers.Authorization = `Token: ${response.body}`
callback()
}
})
},
function getUserID(callback) {
let url = `${geniePortalAPI}/users/_this`
tiny.get({url, headers}, function _done(err, response) {
if (err) callback(err)
else {
userID = response.body.id
callback()
}
})
},
function getPortalID(callback) {
let url = `${geniePortalAPI}/users/${userID}/portals`
tiny.get({url, headers}, function _done(err, response) {
if (err) callback(err)
else {
portalID = response.body[0].PortalID
callback()
}
})
},
function getPortalInfo(callback) {
let url = `${geniePortalAPI}/portals/${portalID}`
tiny.get({url, headers}, function _done(err, response) {
if (err) callback(err)
else {
let portal = response.body
body = {
auth: {
cik: portal.info.key,
client_id: portal.devices[deviceNumber]
}
}
callback()
}
})
},
], function _done(err) {
if (err) callback(err)
else callback(null, {headers, body})
})
}
})
}