Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*---------- Require ----------*/
- var express = require('express');
- var bodyParser = require('body-parser');
- var colors = require('colors/safe');
- var mysql = require("mysql");
- var five = require('johnny-five');
- /*-------------------------------*/
- /*---------- Config ----------*/
- var config = {
- port: 5000,
- host: 'local.dev'
- };
- var status = {
- error: false,
- sending: false,
- door: {
- isOpening: false
- },
- database: {
- isConnected: false
- },
- socket: {
- isReady: false
- }
- }
- /*------------------------------*/
- /*---------- Variables ----------*/
- var User = require('./models/User');
- var Opening = require('./models/Opening');
- var USER = new User();
- var OPENING = new Opening();
- /*---------------------------------*/
- /*---------- Web server ----------*/
- // Setup the web server
- var app = express();
- app.set('port', 5000);
- app.use(bodyParser.json());
- app.use(bodyParser.urlencoded({
- extended: true
- }));
- app.use(function (req, res, next) {
- res.setHeader('Access-Control-Allow-Origin', '*');
- res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
- res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
- res.setHeader('Access-Control-Allow-Credentials', false);
- next();
- });
- // Start the server
- var server = app.listen(app.get('port'), function() {
- console.log('');
- console.log(currentDate() + colors.gray('>> ') + 'Listenning on ' + colors.magenta(app.get('port')));
- });
- var io = require('socket.io').listen(server);
- /*----------------------------------*/
- /*---------- Socket ----------*/
- var socket;
- io.on('connection', function(sock) {
- socket = sock;
- status.socket.isReady = true;
- });
- /*------------------------------*/
- /*---------- Database ----------*/
- // Setup the database
- var dbConfig = {
- host: "local.dev",
- user: "root",
- password: "broadway",
- database: "door_opener"
- };
- var con;
- // When there is an error
- // We try to connect an another time
- function handleDisconnect() {
- con = mysql.createConnection(dbConfig);
- // Try to connect to the mysql database
- con.connect(function(error) {
- if (error) {
- // Error
- console.log(currentDate() + colors.gray('>> ') + colors.red('Error connecting DB'));
- status.database.isConnected = false;
- setTimeout(handleDisconnect, 2000);
- } else {
- // Success
- status.database.isConnected = true;
- console.log(currentDate() + colors.gray('>> ') + 'Connected to ' + colors.magenta(con.config.database));
- }
- });
- // When the connection handle an error
- con.on('error', function(err) {
- console.log(currentDate() + colors.gray('>> ') + colors.red('Error connecting DB'));
- if (err.code === 'PROTOCOL_CONNECTION_LOST') {
- status.database.isConnected = false;
- handleDisconnect();
- } else {
- status.database.isConnected = false;
- }
- });
- }
- handleDisconnect();
- /*--------------------------------*/
- /*---------- Routes ----------*/
- function checkStatus(req, res, next) {
- // We check if all is correctly initialized
- if (!status.database.isConnected || status.door.isOpening || !status.socket.isReady) {
- var error, log;
- if (!status.database.isConnected) {
- error = 'The database is not connected yet. Please try in few seconds';
- log = currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error);
- status.door.isOpening = false;
- } else if (status.door.isOpening) {
- error = 'The door is opening. Please try in few seconds';
- log = currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error);
- } else if (!status.socket.isReady) {
- error = 'The sockets are not reayd yet. Please try in few seconds';
- log = currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error);
- }
- status.door.isOpening = false;
- req.error = {
- 'status': 'error',
- 'error': error
- };
- req.log = log;
- next();
- }
- next();
- }
- app.get('/', function(req, res) {
- res.json({ foo: 'bar' });
- })
- app.post('/open', checkStatus, function(req, res) {
- if (req.error) {
- console.log(req.log);
- return res.json(req.error);
- }
- console.log(currentDate() + colors.gray('>> ') + colors.bold(colors.cyan(req.method)) + ' ' + colors.green('200') + ' ' + req.url);
- var data = req.body;
- status.door.isOpening = true;
- setUser(data, function() {
- setOpening(data, function() {
- openTheDoorPlease(data, function(response, log) {
- if (status.door.isOpening) {
- status.door.isOpening = false;
- console.log(log);
- return res.json(response);
- }
- });
- });
- });
- });
- app.get('/users', function(req, res) {
- if (!status.database.isConnected) {
- var error = 'The database is not connected yet';
- console.log(currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error));
- status.error = true;
- return res.json({
- 'status': 'error',
- 'error': error
- });
- }
- console.log(currentDate() + colors.gray('>> ') + colors.bold(colors.cyan(req.method)) + ' ' + colors.green('200') + ' ' + req.url);
- con.query('SELECT * FROM users', function(error, users) {
- if (!status.error) {
- return res.json({ users: users });
- } else {
- status.error = false;
- return res.json({
- 'status': 'error',
- 'error': error
- });
- }
- });
- });
- app.get('/openings', function(req, res) {
- if (!status.database.isConnected) {
- var error = 'The database is not connected yet';
- console.log(currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error));
- status.error = true;
- return res.json({
- 'status': 'error',
- 'error': error
- });
- }
- console.log(currentDate() + colors.gray('>> ') + colors.bold(colors.cyan(req.method)) + ' ' + colors.green('200') + ' ' + req.url);
- con.query('SELECT * FROM openings', function(error, openings) {
- if (!status.error) {
- return res.json({ openings: openings });
- } else {
- status.error = false;
- return res.json({
- 'status': 'error',
- 'error': error
- });
- }
- });
- });
- /*------------------------------*/
- /*---------- Actions on Arduino ----------*/
- function openTheDoorPlease(data, callback) {
- //
- // Do stuff to open the door here
- //
- //
- socket.emit('event', {
- type: 'open-door'
- });
- socket.on('event', function(data) {
- switch (data.type) {
- case 'door-opened':
- if (status.door.isOpening) {
- doorOpened(function(response, log) {
- if (callback !== undefined) callback.call(this, response, log);
- });
- }
- break;
- default:
- break;
- }
- });
- }
- function doorOpened(callback) {
- var log;
- saveOpening(function(response) {
- if (response.error) {
- log = currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(response.error);
- } else {
- log = currentDate() + colors.gray('>> ') + 'Success: ' + colors.cyan(response.success);
- }
- if (callback !== undefined) callback.call(this, response, log);
- });
- }
- /*------------------------------------------*/
- /*---------- Manage data ----------*/
- function setUser(data, callback) {
- USER.init(data.user);
- if (callback !== undefined) callback.call(this);
- }
- function setOpening(data, callback) {
- OPENING.init(data);
- if (callback !== undefined) callback.call(this);
- }
- function saveOpening(callback) {
- con.query('SELECT * FROM users',function(error, rows) {
- if (error) throw error;
- var user = userExists(rows, USER.username);
- if (user.exists) {
- // user exists
- var opening = {
- 'user_id' : user.id,
- 'how' : OPENING.from,
- 'created_at' : OPENING.created_at,
- 'updated_at' : OPENING.updated_at
- };
- con.query('INSERT INTO openings SET ?', opening, function(error, res) {
- var response = {};
- if (error) {
- response.status = 'error';
- response.error = error;
- } else {
- response.status = 'success';
- response.success = 'Door is open';
- }
- if (callback !== undefined) callback.call(this, response);
- });
- } else {
- // user doesn't exist
- var user = {
- 'username' : USER.username,
- 'created_at' : USER.created_at,
- 'updated_at' : USER.updated_at
- };
- con.query('INSERT INTO users SET ?', user, function(error, res) {
- var response = {};
- if (error) {
- response.status = 'error';
- response.error = error;
- if (callback !== undefined) callback.call(this, response);
- } else {
- var opening = {
- 'user_id' : res.insertId,
- 'how' : OPENING.from,
- 'created_at' : OPENING.created_at,
- 'updated_at' : OPENING.updated_at
- };
- con.query('INSERT INTO openings SET ?', opening, function(error, res) {
- if (error) {
- response.status = 'error';
- response.error = error;
- } else {
- response.status = 'success';
- response.success = 'Door is open';
- }
- if (callback !== undefined) callback.call(this, response);
- });
- }
- });
- }
- });
- }
- /*-----------------------------------*/
- /*---------- Helpers ----------*/
- function userExists(rows, username) {
- var r = {
- exists: false
- };
- rows.forEach(function(row) {
- if (row.username === username) {
- r.exists = true;
- r.id = row.id;
- }
- });
- return r;
- }
- function currentDate() {
- var date = new Date();
- var year = date.getFullYear();
- var month = date.getMonth();
- var day = date.getDate();
- var hour = date.getHours();
- var minute = date.getMinutes();
- var second = date.getSeconds();
- if (month < 10) month = '0' + month;
- if (day < 10) day = '0' + day;
- if (hour < 10) hour = '0' + hour;
- if (minute < 10) minute = '0' + minute;
- if (second < 10) second = '0' + second;
- return year + '-' + month + '-' + day + ' [' + hour + ':' + minute + ':' + second + '] ';
- }
- /*-------------------------------*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement