Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var express = require('express');
  2. var bodyParser = require('body-parser');
  3. var assert = require('assert');
  4. var MongoClient = require('mongodb').MongoClient;
  5. var ObjectID = require('mongodb').ObjectID;
  6. var createHash = require('./hash.js').createHash;
  7. var createRandomBytes = require('./hash.js').createRandomBytes;
  8.  
  9. var http = require('http');
  10. var fs = require('fs');
  11. var mkdirp = require('mkdirp');
  12. var zlib = require('zlib');
  13. var download = require('download');
  14. var readline = require('readline');
  15.  
  16. // Global vars
  17. var app = express();
  18. var mongoUrl = 'mongodb://miyava.de:27017/Miyava';
  19.  
  20. // Session object
  21. var sessions = {};
  22.  
  23. // Middleware
  24. app.use(bodyParser.json());
  25.  
  26. // Authorize middleware
  27. app.use(function(req, res, next) {
  28.     req.is_authorized = false;
  29.     if(req.body.session_id == null) {
  30.         req.authorized_error = { error: 'Not logged in' };
  31.     }
  32.     else {
  33.         var user = sessions[req.body.session_id];
  34.         if(user == null) {
  35.             req.authorized_error = { error: 'Session invalid' };
  36.         }
  37.         else {
  38.             req.is_authorized = true;
  39.         }
  40.     }
  41.     next();
  42. });
  43.  
  44. // Used to register a user
  45. app.post('/register', function(req, res) {
  46.     assert.notEqual(req.body.username, undefined);
  47.     assert.notEqual(req.body.password, undefined);
  48.  
  49.     MongoClient.connect(mongoUrl, function(err, db) {
  50.         assert.equal(err, null);
  51.  
  52.         db.collection('users', function(err, collection) {
  53.             assert.equal(err, null);
  54.  
  55.             var hash = createHash(req.body.password);
  56.             collection.insertOne({username: req.body.username, password: hash, firstname: req.body.firstname, lastname: req.body.lastname, roles: ['user'] }, function(err, result) {
  57.                 assert.equal(err, null);
  58.                 res.send(result);
  59.                 db.close();
  60.             });
  61.         });
  62.     });
  63. });
  64.  
  65. // Used to login as a specified user
  66. app.post('/login', function(req, res) {
  67.     assert.notEqual(req.body.username, undefined);
  68.     assert.notEqual(req.body.password, undefined);
  69.    
  70.     MongoClient.connect(mongoUrl, function(err, db) {
  71.         assert.equal(err, null);
  72.  
  73.         db.collection('users', function(err, collection) {
  74.             assert.equal(err, null);
  75.  
  76.             var sessionBase = req.body.username + '_' + Date.now() + '_' + createRandomBytes();
  77.             var sessionId = createHash(sessionBase);
  78.  
  79.             collection.findOneAndUpdate({username: req.body.username}, { '$set': { 'session_id': sessionId } }, { upsert: false }, function(err, document) {
  80.                 assert.equal(err, null);
  81.  
  82.                 if(document.value == null) {
  83.                     res.send('{"error":"Username does not exist"}');
  84.                 }
  85.                 else {
  86.                     var hash = createHash(req.body.password);
  87.                     if(document.value.password == hash) {
  88.                         var user = {
  89.                             id: document.value._id,
  90.                             username: document.value.username,
  91.                             session_id: document.value.session_id,
  92.                             firstname: document.value.firstname,
  93.                             lastname: document.value.lastname,
  94.                             roles: document.value.roles
  95.                         };
  96.  
  97.                         sessions[user.session_id] = user;
  98.                         res.send(user);
  99.                     }
  100.                     else {
  101.                         res.send({success: false, error: 'Password is wrong'});
  102.                     }
  103.                 }
  104.                 db.close();
  105.             });
  106.         });
  107.     });
  108. });
  109.  
  110. app.post('/logout', function(req, res) {
  111.     if(!req.is_authorized) {
  112.         res.send(req.authorized_error);
  113.     }
  114.     else {
  115.         MongoClient.connect(mongoUrl, function(err, db) {
  116.             assert.equal(err, null);
  117.    
  118.             db.collection('users', function(err, collection) {
  119.                 assert.equal(err, null);
  120.  
  121.                 var user = sessions[req.body.session_id];
  122.                 collection.findOneAndUpdate({_id: user.id}, { '$unset': { 'session_id': '' } }, { upsert: false }, function(err, document) {
  123.                     assert.equal(err, null);
  124.  
  125.                     if(document.value == null) {
  126.                         res.send({success: false, error: 'Unknown error'});
  127.                     }
  128.                     else {
  129.                         res.send({success: true});
  130.                     }
  131.                     db.close();
  132.                 });
  133.             });
  134.         });
  135.     }
  136. });
  137.  
  138. // List all users (if logged in atleast :D)
  139. app.post('/users', function(req, res) {
  140.     if(!req.is_authorized) {
  141.         res.send(req.authorized_error);
  142.     }
  143.     else {
  144.         var user = sessions[req.body.session_id];
  145.         if(user.roles === undefined || !user.roles.includes('user')) {
  146.             res.send('{"error":"User does not have enough roles"}');
  147.         }
  148.         else {
  149.             MongoClient.connect(mongoUrl, function(err, db) {
  150.                 assert.equal(err, null);
  151.  
  152.                 db.collection('users', function(err, collection) {
  153.                     assert.equal(err, null);
  154.  
  155.                     collection.find({}).toArray(function(err, documents) {
  156.                         assert.equal(err, null);
  157.  
  158.                         res.send(documents);
  159.                         db.close();
  160.                     });
  161.                 });
  162.             });
  163.         }
  164.     }
  165. });
  166.  
  167. // DEV ONLY :D
  168. app.get('/users', function(req, res) {
  169.     MongoClient.connect(mongoUrl, function(err, db) {
  170.         assert.equal(err, null);
  171.  
  172.         db.collection('users', function(err, collection) {
  173.             assert.equal(err, null);
  174.  
  175.             collection.find({}).toArray(function(err, documents) {
  176.                 assert.equal(err, null);
  177.  
  178.                 res.send(documents);
  179.                 db.close();
  180.             });
  181.         });
  182.     });
  183. });
  184.  
  185. app.get('/movies', function(req, res){
  186.     MongoClient.connect(mongoUrl, function(err, db) {
  187.         assert.equal(err, null);
  188.  
  189.         db.collection('movies', function(err, collection) {
  190.             assert.equal(err, null);
  191.  
  192.             collection.find({}).toArray(function(err, documents) {
  193.                 assert.equal(err, null);
  194.  
  195.                 res.send(documents);
  196.                 db.close();
  197.             });
  198.         });
  199.     });
  200. });
  201.  
  202. app.get('/movies_ids', function(req, res){
  203.     MongoClient.connect(mongoUrl, function(err, db) {
  204.         assert.equal(err, null);
  205.  
  206.         db.collection('movies_ids', function(err, collection) {
  207.             assert.equal(err, null);
  208.  
  209.             collection.find({}).toArray(function(err, documents) {
  210.                 assert.equal(err, null);
  211.  
  212.                 res.send(documents);
  213.                 db.close();
  214.             });
  215.         });
  216.     });
  217. });
  218.  
  219. app.get('/movies/:id/delete', function(req, res) {
  220.     MongoClient.connect(mongoUrl, function(err, db) {
  221.         assert.equal(err, null);
  222.  
  223.         db.collection('movies', function(err, collection) {
  224.             assert.equal(err, null);
  225.  
  226.             collection.remove({_id: ObjectID(req.params.id)}, function(err, result) {
  227.                 if (err) {
  228.                     console.log(err);
  229.                 }
  230.                 console.log(result);
  231.                 db.close();
  232.             });
  233.         });
  234.     });
  235. });
  236.  
  237.  
  238. app.get('/movies/startDownload',function(req,res){
  239.     var downloadDir ='./download';
  240.     mkdirSync(downloadDir);
  241.     var movieDir = './download/movie';
  242.     mkdirSync(movieDir);
  243.  
  244.     if (!fs.existsSync('download/movie/movie_ids_04_28_2017.json.gz')) {
  245.         downloadFile("http://files.tmdb.org/p/exports/movie_ids_04_28_2017.json.gz","download/movie/");    
  246.     }
  247.    
  248.     if (!fs.existsSync('movie_ids_04_28_2017.json')) {
  249.         unzipFile(dest + "/movie_ids_04_28_2017.json.gz", "movie_ids_04_28_2017.json");
  250.  
  251.     }
  252.    
  253.     var myInterface = readline.createInterface({
  254.         input: fs.createReadStream("movie_ids_04_28_2017.json")
  255.     });
  256.    
  257.     myInterface.on('line', function (line) {
  258.         var fileLine = JSON.parse(line);
  259.         var notFind = false;
  260.         MongoClient.connect(mongoUrl, function(err, db) {
  261.             if (err) throw err;
  262.             var query = { id: fileLine.id };
  263.  
  264.             db.collection("movies_ids").find(query).toArray(function(err, result) {
  265.                 if (err) throw err;
  266.                 if(result == null || result.length == 0){
  267.                     notFind = true;
  268.                 } else {
  269.                     notFind = false;
  270.                 }
  271.             });
  272.         });
  273.  
  274.         setTimeout(function() {
  275.             if(notFind){
  276.                 MongoClient.connect(mongoUrl, function(err, db) {
  277.                     if (err) throw err;
  278.                     var query = { id: fileLine.id };
  279.                     console.log(query);
  280.                     db.collection('movies_ids', function(err, collection) {
  281.                         assert.equal(err, null);
  282.                         collection.insertOne({
  283.                             adult:fileLine.adult,
  284.                             id:fileLine.id,
  285.                             original_title:fileLine.original_title,
  286.                             popularity:fileLine.popularity,
  287.                             video:fileLine.video
  288.                         }, function(err, result) {
  289.                             assert.equal(err, null);
  290.                             res.send(result);
  291.                         });
  292.                     });
  293.                     db.close();
  294.                 });
  295.             }
  296.         }, 3000);
  297.         //process.exit();
  298.     });
  299. });
  300.  
  301.   function mkdirSync (dirPath) {
  302.       if (!fs.existsSync(dirPath)){
  303.           fs.mkdirSync(dirPath);
  304.       }
  305.   }
  306.  
  307.   function downloadFile(url, dest) {
  308.       console.log("start Download");
  309.       // for download more then one file
  310.       Promise.all([
  311.           url
  312.       ].map(x => download(x, dest))).then(() => {
  313.           console.log('files downloaded!');
  314.           unzipFile(dest + "/movie_ids_04_28_2017.json.gz", "movie_ids_04_28_2017.json");
  315.           readFileLineByLine(dest + "/movie_ids_04_28_2017.json");
  316.       });
  317.  
  318.   }
  319.  
  320.   function unzipFile(dir, name) {
  321.       const gzip = zlib.Unzip();
  322.  
  323.       const inp = fs.createReadStream(dir);
  324.       const out = fs.createWriteStream(name);
  325.  
  326.       inp.pipe(gzip).pipe(out);
  327.   }
  328.  
  329. app.listen(3500, '0.0.0.0');
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement