diff --git a/server.js b/server.js index 0f0ea195eb7d6ba7ccf0035bc7af2bdd21925efc..b8de4e823e307d104db62d8772a7e686abbb6f10 100755 --- a/server.js +++ b/server.js @@ -1,153 +1,124 @@ 'use strict'; -var augustctl = require('./index'); -var express = require('express'); -var morgan = require('morgan'); -var await = require('asyncawait/await'); -var async = require('asyncawait/async'); -var config = require(process.env.AUGUSTCTL_CONFIG || './config.json'); -var serverConfig = require(process.env.AUGUSTCTL_SERVER_CONFIG || './server-config.json'); - -var DEBUG = process.env.NODE_ENV !== 'production'; -var address = serverConfig.address || 'localhost'; -var port = serverConfig.port || 3000; - -var app = express(); -app.use(morgan(DEBUG ? 'dev' : 'combined')); - -var ret = {'status': -1, 'ret': '', 'msg': ''}; - -app.get('/api/unlock/:lock_name', function(req, res) { - var lock = app.get('lock' + req.params.lock_name); - if (!lock) { - res.sendStatus(503); - return; - } - - -var execStatus = async(function() { - - var status = await(lock.status()); - - if(status == 'locked') - { - - var cmd = await(lock.forceUnlock()); - ret['msg'] = 'Command completed. Disconnected.'; - ret['status'] = 0; - ret['ret'] = 'unlocked'; - console.log('Released unlock request'); - - } - else - { - ret['status'] = 1; - ret['msg'] = 'Lock is already unlocked'; - res.json(ret); - - } - - lock.disconnect(); - res.json(ret); -}); - - lock.connect().then(function(){ - - var exec = execStatus(); - - }).finally(function(){ - console.log('Finally'); - }); - -}); - - -app.get('/api/lock/:lock_name', function(req, res) { - var lock = app.get('lock' + req.params.lock_name); - if (!lock) { - res.sendStatus(503); - return; - } - - - var execLock = async(function() { - var status = await(lock.status()); - - if(status == 'unlocked') - { +var augustctl = require( './index' ); +var express = require( 'express' ); +var morgan = require( 'morgan' ); +var await = require( 'asyncawait/await' ); +var async = require( 'asyncawait/async' ); - var cmd = await(lock.forceLock()); - ret['msg'] = 'Command completed. Disconnected.'; - ret['status'] = 0; - ret['ret'] = 'locked'; - console.log('Released lock request'); +var config = require( process.env.AUGUSTCTL_CONFIG || './config.json' ); +var serverConfig = require( process.env.AUGUSTCTL_SERVER_CONFIG || './server-config.json' ); - } - else - { - ret['status'] = 1; - ret['msg'] = 'Lock is already locked'; - - } - - res.json(ret); - lock.disconnect(); -}); - - lock.connect().then(function(){ - - var status = execLock(); - - }).finally(function(){ - console.log('Finally'); - }); - -}); - - -app.get('/api/status/:lock_name', function(req, res){ - var lock = app.get('lock' + req.params.lock_name); - if(!lock) { - res.sendStatus(503); - return; - } - - var execStatus = async(function() { - var status = await(lock.status()); - ret['ret'] = status; - ret['status'] = 0; - ret['msg'] = 'Command completed.'; - - console.log('Disconnecting'); - lock.disconnect(); - - console.log('Returning'); - res.json(ret); - }); - - - lock.connect().then(function() { - var status = execStatus(); - - }).finally(function() { - console.log('Finally'); - }); - - -}); - -Object.keys(config).forEach( function( lockName ) { - var lockConfig = config[lockName]; +var DEBUG = process.env.NODE_ENV !== 'production'; +var address = serverConfig.address || 'localhost'; +var port = serverConfig.port || 3000; - augustctl.scan(lockConfig.lockUuid).then(function (peripheral) { +var app = express(); +app.use( morgan( DEBUG ? 'dev' : 'combined' ) ); + +// Default return arguments +var ret = { + 'status': -1, + 'ret': '', + 'msg': '' +}; + +// Endpoint to perform all lock actions +app.get( '/api/:lock_action/:lock_name', function( req, res ) { + // Parse allowed request arguments + var action = req.params.lock_action, + allowedActions = [ 'unlock', 'lock', 'status' ]; + if ( -1 === allowedActions.indexOf( action ) ) { + res.sendStatus( 400 ); + return; + } + + var lock = app.get( 'lock' + req.params.lock_name ); + if ( ! lock ) { + res.sendStatus( 400 ); + return; + } + + // Suspendable functions to interact with lock based on requested action + if ( 'status' === action ) { + // Checks lock's state and returns it + var actionFunction = async( function() { + var status = await( lock.status() ), + statusInt = -1; + + if ( 'locked' === status ) { + statusInt = 0; + } else if ( 'unlocked' === status ) { + statusInt = 1; + } + + ret.ret = status; + ret.status = statusInt; + ret.msg = "Status checked successfully."; + + lock.disconnect(); + res.json( ret ); + } ); + } else { + // Locks or unlocks a requested lock, if not already in that state + var actionFunction = async( function() { + var status = await( lock.status() ); + + if ( 'lock' === action && 'unlocked' === status ) { + var cmd = await( lock.forceLock() ); + + ret.ret = 'locked'; + ret.status = 0; + ret.msg = 'Locked as requested.'; + } else if ( 'unlock' === action && 'locked' === status ) { + var cmd = await( lock.forceUnlock() ); + + ret.ret = 'unlocked'; + ret.status = 1; + ret.msg = 'Unlocked as requested.'; + } else { + var statusInt = -1; + + if ( 'locked' === status ) { + statusInt = 0; + } else if ( 'unlocked' === status ) { + statusInt = 1; + } + + ret.ret = status; + ret.status = statusInt; + ret.msg = "No change made. Lock was already '" + status + "'."; + } + + lock.disconnect(); + res.json( ret ); + } ); + } + + // Perform requested action + lock.connect().then( actionFunction ).catch( function( err ) { + console.error( err ); + lock.disconnect(); + res.sendStatus( 500 ); + } ); +} ); + +// Parse lock configurations +Object.keys( config ).forEach( function( lockName ) { + var lockConfig = config[ lockName ]; + + augustctl.scan( lockConfig.lockUuid ).then( function( peripheral ) { var lock = new augustctl.Lock( peripheral, lockConfig.offlineKey, lockConfig.offlineKeyOffset ); + app.set('lock' + lockName, lock); - }); -}); -var server = app.listen(port, address, function() { - console.log('Listening at %j', server.address()); -}); + } ); +} ); + +// Start Express server +var server = app.listen( port, address, function() { + console.log( 'Listening at %j', server.address() ); +} );