/** * Try to unlock the door with auth mode */ const redis = require('redis'); function doorStatusKey(id) { return concatKeys("doors", id, 'open'); } function concatKeys(...keys) { return keys.join(':'); } exports.handler = function(context, event, callback) { const response = new Twilio.Response(); let door = event.door; let pin = event.key; if (!door || !pin) { response.setStatusCode(400); return callback(null, response); } door = door.toUpperCase(); if (!context['FIXED_PIN_' + door]) { response.setStatusCode(404); return callback(null, response); } let correctPin = context['FIXED_PIN' + door]; if (correctPin !== pin) { response.setStatusCode(401); return callback(null, response); } let client = new redis.RedisDbClient((err) => console.error(err), { url: context.REDIS_CONNECT_URL }); client.connect() .then(async () => { const statusKey = doorStatusKey(door); const fingerprint = { method: "PIN" }; const timeout = context['OPEN_TIMEOUT_' + door] || 60; await client.put(statusKey, JSON.stringify(fingerprint)); await client.getClient().expire(statusKey, timeout); response .setStatusCode(200) .appendHeader('Content-Type', 'application/json') .setBody({ msg: `Opened the door "${door}" for ${timeout}s` }); return callback(null, response); }); };