diff --git a/server.js b/server.js index 69866660feac4c78c9ff2fb62ce2072d208e8c6b..b9f6959f8a5eb3db5382c8ad5db500023328aac4 100755 --- a/server.js +++ b/server.js @@ -5,7 +5,7 @@ var express = require( 'express' ); var morgan = require( 'morgan' ); var await = require( 'asyncawait/await' ); var async = require( 'asyncawait/async' ); -var apicache = require( 'apicache' ).options( { defaultDuration: 30000 } ); +var apicache = require( 'apicache' ).options( { defaultDuration: 15000 } ); var cache = apicache.middleware; var config = require( process.env.AUGUSTCTL_CONFIG || './config.json' ); @@ -25,86 +25,113 @@ var ret = { 'msg': '' }; -// Endpoint to perform all lock actions -app.get( '/api/:lock_action/:lock_name', cache( '5 seconds' ), function( req, res ) { +// Endpoint to check lock status +app.get( '/api/status/:lock_name', cache( '15 seconds' ), function( req, res ) { + // Parse allowed request arguments + var lock = app.get( 'lock' + req.params.lock_name ); + if ( ! lock ) { + clear_caches( req.params.lock_name ); + res.sendStatus( 400 ); + return; + } + + // Suspendable functions to check lock's status + var actionFunction = async( function() { + var status = await( lock.status() ); + + ret.ret = status; + ret.status = statusStringtoInt( status ); + ret.msg = "Status checked successfully."; + + lock.disconnect(); + res.json( ret ); + } ); + + // Perform requested action + lock.connect().then( actionFunction ).catch( function( err ) { + console.error( err ); + lock.disconnect(); + clear_caches( req.params.lock_name ); + res.sendStatus( 500 ); + } ); +} ); + +// Endpoint to change lock state +app.get( '/api/:lock_action(lock|unlock)/:lock_name', cache( '5 seconds' ), function( req, res ) { // Parse allowed request arguments var action = req.params.lock_action, - allowedActions = [ 'unlock', 'lock', 'status' ]; + allowedActions = [ 'unlock', 'lock' ]; if ( -1 === allowedActions.indexOf( action ) ) { res.sendStatus( 400 ); return; } - var lock = app.get( 'lock' + req.params.lock_name ); + var lockName = req.params.lock_name, + lock = app.get( 'lock' + lockName ); if ( ! lock ) { + clear_caches( lockName ); 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; - } - + 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 { 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 ); - } ); - } + ret.status = statusStringtoInt( status ); + ret.msg = "No change made. Lock was already '" + status + "'."; + } + + lock.disconnect(); + clear_caches( lockName ); + res.json( ret ); + } ); // Perform requested action lock.connect().then( actionFunction ).catch( function( err ) { console.error( err ); lock.disconnect(); + clear_caches( lockName ); res.sendStatus( 500 ); } ); } ); +// Convert named status to integer representation +function statusStringtoInt( status ) { + var statusInt = -1; + + if ( 'locked' === status ) { + statusInt = 0; + } else if ( 'unlocked' === status ) { + statusInt = 1; + } + + return statusInt; +} + +// Clear cached routes +function clear_caches( lockName ) { + apicache.clear( '/api/status/' + lockName ); + apicache.clear( '/api/lock/' + lockName ); + apicache.clear( '/api/unlock/' + lockName ); + + return true; +} + // Parse lock configurations Object.keys( config ).forEach( function( lockName ) { var lockConfig = config[ lockName ];