Advertisement
Guest User

Untitled

a guest
May 19th, 2018
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var express = require('express');
  2. var router = express.Router();
  3. var bcrypt = require('bcrypt');
  4. var passport = require('passport');
  5. var cheerio = require('cheerio');
  6. var request = require('request');
  7. var util = require('util');
  8. var scraper = require('../neaterscraper');
  9. var img_scraper = require('../imagescraper');
  10. var scraperupdater = require('../scraperdatabaseupdater');
  11.  
  12. var fail = false;
  13. var URLcode = 1;
  14.  
  15. const saltRounds = 10;
  16.  
  17. const sqlite3 = require('sqlite3').verbose();
  18. let db = new sqlite3.Database('./db/users.db');
  19.  
  20. //initialise table
  21. //db.run('CREATE TABLE userData(user_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT,username TEXT, email TEXT, password TEXT)');// --- INITIAL TABLE HAS BEEN MADE
  22. //db.run('CREATE TABLE productData(product_id INTEGER PRIMARY KEY AUTOINCREMENT, prod_name TEXT, prod_price PRICE, prod_url TEXT, user_id INTEGER');// --- INITIAL PRODUCT TABLE HAS BEEN MADE
  23.  
  24. db.allAsync = function (sql, params) {
  25.   console.log(params);
  26.   var that = this;
  27.   return new Promise(function(resolve, reject) {
  28.     that.all(sql, params, function(err, rows){
  29.       if(err){
  30.         reject(err);
  31.       }else{
  32.         resolve(rows);
  33.       }
  34.     });
  35.   });
  36. };
  37.  
  38. var get_user_data = function(userid, query, cb) {
  39.   db.get(query, [userid], function(err, row) {
  40.     if(err){
  41.       console.error(err);
  42.       cb("error", null);
  43.     } else{
  44.       var user_data = {userid:userid, username:row.username, email:row.email, watched_ids:row.watched_product_ids};
  45.       cb(null, user_data);
  46.     }
  47.   });
  48. };
  49.  
  50. var get_pd_row = function(id, query, cb){
  51.   var query = `SELECT * FROM productData where prod_id =?`;
  52.   db.get(query, [id], function(err, row) {
  53.     // console.log(row);
  54.     if(err){
  55.       console.error(err);
  56.       cb("error", null);
  57.     }else{
  58.       cb(null, row);
  59.     }
  60.   });
  61. };
  62.  
  63. var get_product_data_async = async function(prod_ids, query, cb){
  64.   var product_data_array = [];
  65.   var watched_id_string = prod_ids;
  66.   var watched_ids = watched_id_string.split(",");
  67.   for (id of watched_ids){
  68.     var pd_row = await get_pd_row_async(id, query);
  69.     product_data_array.push(pd_row);
  70.   };
  71.   // console.log(product_data_array);
  72.   return product_data_array;
  73. };
  74.  
  75. const get_user_data_async = util.promisify(get_user_data);
  76. const get_pd_row_async = util.promisify(get_pd_row);
  77.  
  78. //output names to server
  79. db.serialize(function() {
  80.   db.each(`SELECT Name as name,
  81.                   Username as username,
  82.                   Email as email
  83.               FROM userData`, (err, row) => {
  84.       if (err) {
  85.           console.error(err.message);
  86.       }
  87.       // console.log( row.name + "\t" + row.username + "\t" + row.email);
  88.   });
  89. });
  90.  
  91.  
  92. /* GET home page. */
  93. router.get('/', function(req, res, next) {
  94.   // console.log(req.user);
  95.   // console.log(req.isAuthenticated());
  96.   if(req.isAuthenticated()){
  97.     res.redirect('/login');
  98.   }else{
  99.     // console.log("you are in the get /request");
  100.     // console.log("fail value is", fail);
  101.     res.render('index', {title: 'HOMEPAGE', URLcode: URLcode, flop:fail});
  102.     fail=false;
  103.   }
  104. });
  105.  
  106.  
  107. function authenticationMiddleware(){
  108.   return (req,res,next) => {
  109.     console.log(`
  110.       req.session.passport.user: ${JSON.stringify(req.session.passport)}`);
  111.     // console.log("authenticationmiddleware");
  112.     if (req.isAuthenticated()){
  113.        return next();
  114.     }else {
  115.       return res.redirect('/');
  116.     }
  117.  
  118.     // // console.log("you are not allowed here");
  119.   }
  120.  
  121. }
  122.  
  123. /* GET home page. */
  124. // router.get('/#fail', function(req, res, next) {
  125. //   // console.log(req.user);
  126. //   // console.log(req.isAuthenticated());
  127. //   if(req.isAuthenticated()){
  128. //     res.redirect('/login');
  129. //   }else{
  130. //     // console.log("you are in the fail get /request");
  131. //     res.render('index', { title: 'Home Screen', fail:true});
  132. //   }
  133. // });
  134.  
  135.  
  136.  
  137. /* GET Logged In page ? */
  138. router.get('/login', authenticationMiddleware(),
  139.   async function(req, res, next) {
  140.   var userid = req.session.passport.user;
  141.   if(isNaN(userid)){ userid = req.session.passport.user.user_id;}
  142.  
  143.   // var url = "https://www.amazon.co.uk/AKORD-Metal-Binder-Clip-Clamp/dp/B0082JFX1M/ref=sr_1_5?s=officeproduct&ie=UTF8&qid=1526309936&sr=1-5&keywords=binder+clips";
  144.   // id_rows = await db.allAsync(`SELECT watched_product_ids FROM userData WHERE user_id =?`, [userid]);
  145.   // console.log(id_rows);
  146.   // console.log("HI: " + id_rows[0].watched_product_ids);
  147.   //
  148.   // var watched_ids = id_rows[0].watched_product_ids.split(",");
  149.  
  150.   (async() => {
  151.     let id_rows, url_rows, watched_ids;
  152.     let watched_imgs = [];
  153.     try {
  154.       var user_query = `SELECT watched_product_ids FROM userData WHERE user_id =?`;
  155.       var pd_query = `SELECT prod_link FROM productData where prod_id =?`;
  156.       id_row = await get_user_data_async(userid, user_query);
  157.       url_rows = await get_product_data_async(id_row.watched_ids, pd_query);
  158.       for(row of url_rows){
  159.         var imgCode = await img_scraper.callImgScraper(row.prod_link);
  160.         watched_imgs.push(imgCode);
  161.       }
  162.     }
  163.     catch (err) {
  164.       return console.error(err);
  165.     }
  166.     console.log(watched_imgs);
  167.     // return res.send(product_data_array);
  168.     // res.cookie('data', JSON.stringify(product_data_array));
  169.     // console.log(product_data_array);
  170.     // console.log("^ pd aray");
  171.     // var pd_array_json = JSON.stringify(product_data_array);
  172.     // return res.render('profile', {title: 'YOUR PROFILE', userid:user_data.userid, username:user_data.username, email:user_data.email, prod_data:pd_array_json});
  173.   })();
  174.  
  175.   // var url_rows =[];
  176.   // for(watched_id of watched_ids){
  177.   //   result = await db.allAsync(`SELECT prod_link FROM productData WHERE prod_id =? `, [watched_id]);
  178.   //   var ele = result[0].prod_link;
  179.   //   url_rows.push(ele);
  180.   // }
  181.   // console.log(url_rows);
  182.   // console.log(url_rows[0]);
  183.   //
  184.   // var watched_imgs=[]
  185.   // for(row of url_rows){
  186.   //   var imgCode = await img_scraper.callImgScraper(row);
  187.   //   watched_imgs.push(imgCode);
  188.   // }
  189.   // console.log(watched_imgs);
  190.  
  191.  
  192.   rows = await db.allAsync(`SELECT username, email FROM userData WHERE user_id =?`, [userid]);
  193.   var username = rows[0].username;
  194.   var email = rows[0].email;
  195.   // console.log(URLcode);
  196.   // console.log(fail);
  197.   res.render('loggedin',  { title: 'LOGGED IN',userid: userid, username: username, email:email,URLcode:URLcode});
  198.   // db.all(`SELECT username, email FROM userData WHERE user_id =?`, [userid], function(err,results,fields){
  199.   //   var username = results[0].username;
  200.   //   var email = results[0].email;
  201.  
  202.   //   // console.log(URLcode);
  203.   //   res.render('loggedin', { title: 'LOGGED IN',userid: userid, username: username, email:email,URLcode:URLcode});
  204.   // });
  205.   URLcode =1;
  206. });
  207.  
  208.  
  209. router.get('/logout', function(req,res) {
  210.   req.logout();
  211.   req.session.destroy();
  212.   res.redirect('/');
  213. });
  214.  
  215.  
  216. router.post('/logout', function(req,res) {
  217.   req.logout();
  218.   req.session.destroy();
  219.   res.redirect('/');
  220. });
  221.  
  222. // router.post('/login', passport.authenticate('local', {
  223. //   successRedirect: '/login',
  224. //   failureRedirect: '/#fail'
  225. // }));
  226.  
  227. router.post('/login', function(req, res, next) {
  228.   passport.authenticate('local', function(err, user, info) {
  229.     if(err) {
  230.       console.error(err);
  231.       return next(err);
  232.     }
  233.     if(!user){
  234.       fail = true;
  235.       return res.redirect('/');
  236.     }
  237.     req.logIn(user, function(err) {
  238.       // console.log("logging in");
  239.       fail = false;
  240.       if(err){
  241.         console.error(err);
  242.         return next(err);
  243.       }
  244.       return res.redirect('/login');
  245.     });
  246.   })(req, res, next);
  247. });
  248.  
  249.  
  250. router.get('/profile', authenticationMiddleware(), function(req, res, next) {
  251.   var userid = req.user.user_id;
  252.  
  253.   (async() => {
  254.     let user_data, product_data_array;
  255.     try {
  256.       var user_query = `SELECT username, email, watched_product_ids FROM userData WHERE user_id =?`;
  257.       var pd_query = `SELECT * FROM productData where prod_id =?`;
  258.       user_data = await get_user_data_async(userid, user_query);
  259.       product_data_array = await get_product_data_async(user_data.watched_ids, pd_query);
  260.     }
  261.     catch (err) {
  262.       return console.error(err);
  263.     }
  264.     // return res.send(product_data_array);
  265.     // res.cookie('data', JSON.stringify(product_data_array));
  266.     // console.log(product_data_array);
  267.     // console.log("^ pd aray");
  268.     var pd_array_json = JSON.stringify(product_data_array);
  269.     return res.render('profile', {title: 'YOUR PROFILE', userid:user_data.userid, username:user_data.username, email:user_data.email, prod_data:pd_array_json});
  270.   })();
  271. });
  272.  
  273.  
  274.  
  275. router.post('/sumbit', function(req,res,next){
  276.  
  277.   var name = req.body.name;
  278.   var username = req.body.usernameR;
  279.   var email = req.body.email;
  280.   var password = req.body.passwordR;
  281.  
  282.   // db.serialize(()=> {
  283.     let userExists = "SELECT * FROM userData WHERE username = ?";
  284.     db.all(userExists,[username], function(err,rows){
  285.       if (err){throw(err);}
  286.       if(!Array.isArray(rows)||!rows.length||rows==undefined){
  287.         var errors = req.validationErrors();
  288.         if(errors){
  289.           // req.session.errors = errors;
  290.           req.session.success = false;
  291.           // console.log('FAIL');
  292.           res.render('index', { title: 'Form Validation', success: req.session.success});// errors:req.session.errors});
  293.         } else{
  294.           //req.session.success =true;
  295.           // console.log('SUCCESS');
  296.           bcrypt.hash(password, saltRounds, function(err,hash){ //hash password
  297.             db.run(`INSERT INTO userData (name,username,email,password) VALUES(?,?,?,?)`, [name,username,email,hash], function(err) {
  298.               if (err) {
  299.                 return // console.log(err.message);
  300.               } else {
  301.                 const user_id = `${this.lastID}`;
  302.                 req.login(user_id, function(err){
  303.                    res.redirect('/login');
  304.                  });
  305.               }
  306.             });
  307.           });
  308.         }
  309.       } else{
  310.         // console.log('username already exists');
  311.       }
  312.     // });
  313.   });
  314. });
  315.  
  316. router.post('/add', async function(req,res,next){
  317.  
  318.     var url = req.body.prod_link;//'https://www.amazon.co.uk/AKORD-Metal-Binder-Clip-Clamp/dp/B0082JFX1M';
  319.     // console.log(url);
  320.     URLcode = await scraper.callScraper(url);
  321.     // console.log(URLcode);
  322.     if(!URLcode){
  323.       res.redirect('/login');
  324.     }else{
  325.       const sqlite3 = require('sqlite3').verbose();
  326.       let db = new sqlite3.Database('./db/prices.db');
  327.  
  328.       //db.run('CREATE TABLE productData(prod_id TEXT, prod_name TEXT,prod_currency TEXT, prod_price REAL, prod_url TEXT, user_id INTEGER)');// --- INITIAL PRODUCT TABLE HAS BEEN MADE
  329.  
  330.       var userid = req.user.user_id;
  331.       var title_text = req.body.prod_name;
  332.       var price = req.body.prod_price;
  333.       var price_num;
  334.       var currency = '£';
  335.       var title_text;
  336.  
  337.       db.run(`INSERT INTO productData(prod_name,prod_currency, prod_price, prod_url, user_id) VALUES(?,?,?,?,?)`, [title_text,currency,price_num,url,userid], function(err) {
  338.         if (err) {
  339.           return // console.log(err.message);
  340.         }
  341.         // console.log('SUCCESS');
  342.         res.redirect('/login');
  343.       });
  344.     }
  345. });
  346.  
  347.  
  348. passport.serializeUser(function(user_id, done){
  349.   done(null, user_id);
  350. });
  351.  
  352. passport.deserializeUser(function(user_id, done){
  353.   done(null, user_id);
  354. });
  355.  
  356.  
  357. module.exports = router;
  358.  
  359. //get ids from user
  360. //get product urls from ids
  361. //get image links from them
  362. //display in carousel
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement