Advertisement
Guest User

Untitled

a guest
Jul 28th, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.96 KB | None | 0 0
  1. /*---------- Require ----------*/
  2. var express = require('express');
  3. var bodyParser = require('body-parser');
  4. var colors = require('colors/safe');
  5. var mysql = require("mysql");
  6. var five = require('johnny-five');
  7. /*-------------------------------*/
  8.  
  9.  
  10. /*---------- Config ----------*/
  11. var config = {
  12. port: 5000,
  13. host: 'local.dev'
  14. };
  15. var status = {
  16. error: false,
  17. sending: false,
  18. door: {
  19. isOpening: false
  20. },
  21. database: {
  22. isConnected: false
  23. },
  24. socket: {
  25. isReady: false
  26. }
  27. }
  28. /*------------------------------*/
  29.  
  30.  
  31. /*---------- Variables ----------*/
  32. var User = require('./models/User');
  33. var Opening = require('./models/Opening');
  34.  
  35. var USER = new User();
  36. var OPENING = new Opening();
  37. /*---------------------------------*/
  38.  
  39.  
  40.  
  41. /*---------- Web server ----------*/
  42. // Setup the web server
  43. var app = express();
  44.  
  45. app.set('port', 5000);
  46. app.use(bodyParser.json());
  47. app.use(bodyParser.urlencoded({
  48. extended: true
  49. }));
  50. app.use(function (req, res, next) {
  51. res.setHeader('Access-Control-Allow-Origin', '*');
  52. res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  53. res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');
  54. res.setHeader('Access-Control-Allow-Credentials', false);
  55.  
  56. next();
  57. });
  58.  
  59. // Start the server
  60. var server = app.listen(app.get('port'), function() {
  61. console.log('');
  62. console.log(currentDate() + colors.gray('>> ') + 'Listenning on ' + colors.magenta(app.get('port')));
  63. });
  64. var io = require('socket.io').listen(server);
  65. /*----------------------------------*/
  66.  
  67.  
  68.  
  69. /*---------- Socket ----------*/
  70. var socket;
  71. io.on('connection', function(sock) {
  72. socket = sock;
  73.  
  74. status.socket.isReady = true;
  75. });
  76. /*------------------------------*/
  77.  
  78.  
  79.  
  80. /*---------- Database ----------*/
  81. // Setup the database
  82. var dbConfig = {
  83. host: "local.dev",
  84. user: "root",
  85. password: "broadway",
  86. database: "door_opener"
  87. };
  88. var con;
  89.  
  90. // When there is an error
  91. // We try to connect an another time
  92. function handleDisconnect() {
  93. con = mysql.createConnection(dbConfig);
  94.  
  95. // Try to connect to the mysql database
  96. con.connect(function(error) {
  97. if (error) {
  98. // Error
  99. console.log(currentDate() + colors.gray('>> ') + colors.red('Error connecting DB'));
  100.  
  101. status.database.isConnected = false;
  102.  
  103. setTimeout(handleDisconnect, 2000);
  104. } else {
  105. // Success
  106. status.database.isConnected = true;
  107.  
  108. console.log(currentDate() + colors.gray('>> ') + 'Connected to ' + colors.magenta(con.config.database));
  109. }
  110. });
  111.  
  112. // When the connection handle an error
  113. con.on('error', function(err) {
  114. console.log(currentDate() + colors.gray('>> ') + colors.red('Error connecting DB'));
  115. if (err.code === 'PROTOCOL_CONNECTION_LOST') {
  116. status.database.isConnected = false;
  117.  
  118. handleDisconnect();
  119. } else {
  120. status.database.isConnected = false;
  121. }
  122. });
  123. }
  124.  
  125. handleDisconnect();
  126. /*--------------------------------*/
  127.  
  128.  
  129. /*---------- Routes ----------*/
  130. function checkStatus(req, res, next) {
  131. // We check if all is correctly initialized
  132. if (!status.database.isConnected || status.door.isOpening || !status.socket.isReady) {
  133. var error, log;
  134. if (!status.database.isConnected) {
  135. error = 'The database is not connected yet. Please try in few seconds';
  136. log = currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error);
  137. status.door.isOpening = false;
  138. } else if (status.door.isOpening) {
  139. error = 'The door is opening. Please try in few seconds';
  140. log = currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error);
  141. } else if (!status.socket.isReady) {
  142. error = 'The sockets are not reayd yet. Please try in few seconds';
  143. log = currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error);
  144. }
  145.  
  146. status.door.isOpening = false;
  147. req.error = {
  148. 'status': 'error',
  149. 'error': error
  150. };
  151. req.log = log;
  152. next();
  153. }
  154.  
  155. next();
  156. }
  157. app.get('/', function(req, res) {
  158. res.json({ foo: 'bar' });
  159. })
  160.  
  161. app.post('/open', checkStatus, function(req, res) {
  162. if (req.error) {
  163. console.log(req.log);
  164. return res.json(req.error);
  165. }
  166.  
  167. console.log(currentDate() + colors.gray('>> ') + colors.bold(colors.cyan(req.method)) + ' ' + colors.green('200') + ' ' + req.url);
  168.  
  169. var data = req.body;
  170.  
  171. status.door.isOpening = true;
  172.  
  173. setUser(data, function() {
  174. setOpening(data, function() {
  175. openTheDoorPlease(data, function(response, log) {
  176. if (status.door.isOpening) {
  177. status.door.isOpening = false;
  178. console.log(log);
  179. return res.json(response);
  180. }
  181. });
  182. });
  183. });
  184. });
  185.  
  186. app.get('/users', function(req, res) {
  187. if (!status.database.isConnected) {
  188. var error = 'The database is not connected yet';
  189. console.log(currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error));
  190. status.error = true;
  191. return res.json({
  192. 'status': 'error',
  193. 'error': error
  194. });
  195. }
  196.  
  197. console.log(currentDate() + colors.gray('>> ') + colors.bold(colors.cyan(req.method)) + ' ' + colors.green('200') + ' ' + req.url);
  198.  
  199. con.query('SELECT * FROM users', function(error, users) {
  200. if (!status.error) {
  201. return res.json({ users: users });
  202. } else {
  203. status.error = false;
  204. return res.json({
  205. 'status': 'error',
  206. 'error': error
  207. });
  208. }
  209. });
  210. });
  211.  
  212. app.get('/openings', function(req, res) {
  213. if (!status.database.isConnected) {
  214. var error = 'The database is not connected yet';
  215. console.log(currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(error));
  216. status.error = true;
  217. return res.json({
  218. 'status': 'error',
  219. 'error': error
  220. });
  221. }
  222.  
  223. console.log(currentDate() + colors.gray('>> ') + colors.bold(colors.cyan(req.method)) + ' ' + colors.green('200') + ' ' + req.url);
  224.  
  225. con.query('SELECT * FROM openings', function(error, openings) {
  226. if (!status.error) {
  227. return res.json({ openings: openings });
  228. } else {
  229. status.error = false;
  230. return res.json({
  231. 'status': 'error',
  232. 'error': error
  233. });
  234. }
  235. });
  236. });
  237. /*------------------------------*/
  238.  
  239.  
  240. /*---------- Actions on Arduino ----------*/
  241. function openTheDoorPlease(data, callback) {
  242. //
  243. // Do stuff to open the door here
  244. //
  245. //
  246. socket.emit('event', {
  247. type: 'open-door'
  248. });
  249.  
  250. socket.on('event', function(data) {
  251. switch (data.type) {
  252. case 'door-opened':
  253. if (status.door.isOpening) {
  254. doorOpened(function(response, log) {
  255. if (callback !== undefined) callback.call(this, response, log);
  256. });
  257. }
  258. break;
  259. default:
  260. break;
  261. }
  262. });
  263.  
  264. }
  265.  
  266. function doorOpened(callback) {
  267. var log;
  268.  
  269. saveOpening(function(response) {
  270. if (response.error) {
  271. log = currentDate() + colors.gray('>> ') + 'Error: ' + colors.red(response.error);
  272. } else {
  273. log = currentDate() + colors.gray('>> ') + 'Success: ' + colors.cyan(response.success);
  274. }
  275.  
  276. if (callback !== undefined) callback.call(this, response, log);
  277. });
  278. }
  279. /*------------------------------------------*/
  280.  
  281.  
  282.  
  283. /*---------- Manage data ----------*/
  284. function setUser(data, callback) {
  285. USER.init(data.user);
  286.  
  287. if (callback !== undefined) callback.call(this);
  288. }
  289.  
  290. function setOpening(data, callback) {
  291. OPENING.init(data);
  292.  
  293. if (callback !== undefined) callback.call(this);
  294. }
  295.  
  296. function saveOpening(callback) {
  297. con.query('SELECT * FROM users',function(error, rows) {
  298. if (error) throw error;
  299.  
  300. var user = userExists(rows, USER.username);
  301. if (user.exists) {
  302. // user exists
  303. var opening = {
  304. 'user_id' : user.id,
  305. 'how' : OPENING.from,
  306. 'created_at' : OPENING.created_at,
  307. 'updated_at' : OPENING.updated_at
  308. };
  309.  
  310. con.query('INSERT INTO openings SET ?', opening, function(error, res) {
  311. var response = {};
  312.  
  313. if (error) {
  314. response.status = 'error';
  315. response.error = error;
  316. } else {
  317. response.status = 'success';
  318. response.success = 'Door is open';
  319. }
  320.  
  321. if (callback !== undefined) callback.call(this, response);
  322. });
  323. } else {
  324. // user doesn't exist
  325. var user = {
  326. 'username' : USER.username,
  327. 'created_at' : USER.created_at,
  328. 'updated_at' : USER.updated_at
  329. };
  330.  
  331. con.query('INSERT INTO users SET ?', user, function(error, res) {
  332. var response = {};
  333.  
  334. if (error) {
  335. response.status = 'error';
  336. response.error = error;
  337.  
  338. if (callback !== undefined) callback.call(this, response);
  339. } else {
  340. var opening = {
  341. 'user_id' : res.insertId,
  342. 'how' : OPENING.from,
  343. 'created_at' : OPENING.created_at,
  344. 'updated_at' : OPENING.updated_at
  345. };
  346.  
  347. con.query('INSERT INTO openings SET ?', opening, function(error, res) {
  348. if (error) {
  349. response.status = 'error';
  350. response.error = error;
  351. } else {
  352. response.status = 'success';
  353. response.success = 'Door is open';
  354. }
  355.  
  356. if (callback !== undefined) callback.call(this, response);
  357. });
  358. }
  359. });
  360. }
  361. });
  362. }
  363. /*-----------------------------------*/
  364.  
  365.  
  366. /*---------- Helpers ----------*/
  367. function userExists(rows, username) {
  368. var r = {
  369. exists: false
  370. };
  371.  
  372. rows.forEach(function(row) {
  373. if (row.username === username) {
  374. r.exists = true;
  375. r.id = row.id;
  376. }
  377. });
  378.  
  379. return r;
  380. }
  381.  
  382. function currentDate() {
  383. var date = new Date();
  384.  
  385. var year = date.getFullYear();
  386. var month = date.getMonth();
  387. var day = date.getDate();
  388. var hour = date.getHours();
  389. var minute = date.getMinutes();
  390. var second = date.getSeconds();
  391.  
  392. if (month < 10) month = '0' + month;
  393. if (day < 10) day = '0' + day;
  394. if (hour < 10) hour = '0' + hour;
  395. if (minute < 10) minute = '0' + minute;
  396. if (second < 10) second = '0' + second;
  397.  
  398. return year + '-' + month + '-' + day + ' [' + hour + ':' + minute + ':' + second + '] ';
  399. }
  400. /*-------------------------------*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement