Files
miniproject_osl_nodejs/routes_api.js
T
2016-04-05 11:42:41 +00:00

451 lines
11 KiB
JavaScript
Executable File

// fmon version 2 - (Mains Frequency Monitoring API)
var express = require('express');
var crypto = require('crypto');
var router = express.Router();
var jwt = require('jwt-simple');
var sqlite3 = require('sqlite3').verbose();
var path = require('path');
var gpio = require('gpio');
var sleep = require('sleep');
var gpio0 = gpio.export(17, {
direction: "in",
ready: function() {
}
});
var dbfile = "miniproject.db";
var db = new sqlite3.Database(dbfile);
var sys= require('sys');
var exec= require('child_process').exec;
function puts(error, stdout, stderr) { console.log("Executing a command"); /* nope */ };
router.all( new RegExp("[^(\/login|\/register)]"), function (req, res, next) {
console.log("Authenticating...");
var token = (req.header('X-Access-Token')) || '';
if (token) {
try {
var decoded = jwt.decode(token, req.app.get('secretkey'));
var query = "SELECT COUNT(username) AS num FROM user WHERE access='" + token + "' AND username='" + decoded.iss + "';";
db.get(query, function (err, row) {
if(err) throw err;
console.log("Found " + row.num + " valid users");
if (row.num == 1) {
req.app.set("userid", decoded.iss);
console.log("Userid: " + req.app.get('userid'));
return next();
}
else {
res.status(401);
res.json({
"status": 401, "message": "unknown userid, bye"
});
return;
}
});
}
catch (err) {
console.log("Authorization failed: " + err);
res.status(401);
res.json({
"status": 401, "message": "unknown userid, bye"
});
}
}
else
{
console.log("Authorization failed: Token not set");
res.status(401);
res.json({
"status": 401, "message": "token not set"
});
}
});
// Restfull register
router.post('/register', function (req, res) {
var username = req.body.username || '';
var password = req.body.password || '';
// Check for empy body
if (username == '' || password == '') {
res.status(401);
res.json({
"status": 401,
"message": "Body is empty"
});
return;
}
var query = "SELECT COUNT(*) AS num FROM user WHERE username='" + username + "';";
db.get(query, function(err, row){
if(err) throw err;
if(row.num >= 1)
{
var results = [];
res.status(400);
results.push({
success:false,
msg: "Username already exists"
});
res.json(results);
return;
}
else
{
// db lookup
var query = "INSERT INTO user VALUES('" + username + "', '" + password + "', 'null');";
db.run(query);
var results = [];
res.status(200);
results.push({
success:true,
username: username,
password: password
});
res.json(results);
}
});
});
// Restfull login
router.post('/login', function (req, res) {
var username = req.body.username || '';
var password = req.body.password || '';
// Check for empy body
if (username == '' || password == '') {
res.status(401);
res.json({
"status": 401,
"message": "Body is empty"
});
return;
}
var query = "SELECT COUNT(*) AS num FROM user WHERE username='" + username + "' AND password='" + password + "';";
db.get(query, function (err, row) {
if(err) throw err;
// Check for valid user/passwd combo
if (row.num == 1) {
var now = new Date();
var expires = now.setHours(now.getDay() + 10);
var token = jwt.encode({
iss: username,
exp: expires
}, req.app.get('secretkey'));
var query = "UPDATE user SET access='" + token + "' WHERE username='" + username + "';";
db.run(query);
res.status(200);
res.json({
status: true,
token: token,
expires: expires,
user: username
});
}
else {
res.status(401);
res.json({
"status": 401,
"status": false,
"message": "Invalid username or password"
});
}
});
});
// Restfull logout
router.post('/logout', function (req, res) {
var token = (req.header('X-Access-Token')) || '';
var query = "UPDATE user SET access='' WHERE access='" + token + "';";
db.run(query);
var results = [];
res.status(200);
results.push({
success:true,
msg: "Logged out"
});
res.json(results);
});
//Turn on or of a light
router.get('/light/:group/:num/:state', function (req, res) {
var group = req.params.group;
var num = req.params.num;
var state = req.params.state;
var results = [];
res.status(200);
results.push({
success:true,
group: group,
number:num,
state:state
});
exec('sudo ./kaku ' + group + ' ' + num + ' ' + state, puts);
res.json(results);
});
//Turn on or off a light in the database
router.get('/light/:name/:state', function (req, res) {
var name = req.params.name;
var state = req.params.state;
var group;
var num;
var query = "SELECT class, channel FROM light WHERE name='" + name + "';";
db.get(query, function (err, row) {
if(err) throw err;
group = row.class;
num = row.channel;
var results = [];
res.status(200);
results.push({
success:true,
name: name,
group: group,
num: num,
state: state
});
exec('sudo ./kaku ' + group + ' ' + num + ' ' + state, puts);
res.json(results);
});
});
//Turn on or off a light in the database
router.delete('/light/:name', function (req, res) {
var name = req.params.name;
var query = "DELETE FROM light WHERE name='" + name + "';";
db.run(query);
var results = [];
res.status(200);
results.push({
success:true,
name: name
});
res.json(results);
});
//Add a new light to the database
router.post('/light', function (req, res) {
var name = req.body.name || '';
var group = req.body.group || '';
var channel = req.body.channel || '';
// Check for empy body
if (name == '' || group == '' || channel == '') {
res.status(401);
res.json({
"status": 401,
"message": "Body is empty"
});
return;
}
var query = "SELECT COUNT(*) AS num FROM light WHERE name='" + name + "';";
db.get(query, function(err, row){
if(err) throw err;
if(row.num >= 1)
{
var results = [];
res.status(400);
results.push({
success:false,
msg: "Name already in use"
});
res.json(results);
return;
}
else
{
// db lookup
var query = "INSERT INTO light VALUES('" + name + "', '" + group + "', '" + channel + "');";
db.run(query);
var results = [];
res.status(200);
results.push({
success:true,
group: group,
channel: channel
});
res.json(results);
}
});
});
//Update a light in the database
router.put('/light', function (req, res) {
var name = req.body.name || '';
var group = req.body.group || '';
var channel = req.body.channel || '';
// Check for empy body
if (name == '' || group == '' || channel == '') {
res.status(401);
res.json({
"status": 401,
"message": "Body is empty"
});
return;
}
// db lookup
var query = "UPDATE light SET class='" + group + "', channel='" + channel + "' WHERE name='" + name + "';";
db.run(query);
var results = [];
res.status(200);
results.push({
success:true,
name: name,
group: group,
channel: channel
});
res.json(results);
});
//Get all the users in the database (Testing purposes only)
router.get('/user', function (req, res) {
var token = (req.header('X-Access-Token')) || '';
// db lookup
var query = "SELECT username FROM user WHERE access='" + token + "';";
db.get(query, function (err, rows) {
if(err) throw err;
var results = [];
results.push({
username: item.username
});
res.json(results);
});
res.status(200);
});
//Get all the users in the database (Testing purposes only)
router.get('/users', function (req, res) {
// db lookup
var query = "SELECT username, password, access FROM user WHERE 1;";
db.all(query, function (err, rows) {
if(err) throw err;
var results = [];
var users = [];
rows.forEach(function(item){
users.push({
username: item.username,
password: item.password,
access: item.access
});
});
results.push({users: users});
res.json(results);
});
res.status(200);
});
//Get all the lights in te database
router.get('/lights', function (req, res) {
// db lookup
var query = "SELECT name, class, channel FROM light WHERE 1;";
db.all(query, function (err, rows) {
if(err) throw err;
var results = [];
var lights = [];
rows.forEach(function(item){
lights.push({
name: item.name,
group: item.class,
channel: item.channel
});
});
results.push({lights: lights});
res.json(results);
});
res.status(200);
});
//Fall back, display an error
router.get('/light*', function (req, res) {
var results = [];
res.status(400);
results.push({
success:false,
message:'Params required'
});
res.json(results);
});
// Fall back, display some info
router.get('/', function (req, res) {
res.status(200);
res.json({
"description": "Project X API version 2. Welcome"
});
});
// bind to the "change" event
gpio0.on("change", function(val) {
// value will report either 1 or 0 (number) when the value changes
console.log("GPIO CHANGED: " + val);
if(val == 0)
return;
var query = "SELECT class, channel FROM light WHERE 1;";
db.all(query, function (err, rows) {
if(err) throw err;
var count = 0;
rows.forEach(function(item){
sleep.sleep(count);
console.log("Turning off " + item.class + " - " + item.channel + " (sleep:" + count + ")");
exec('sudo ./kaku ' + item.class + ' ' + item.channel + ' off', puts);
count += 3;
});
});
});
module.exports = router;