seedlinux

find open source torrents and stats for people wishing to contribute bandwidth.
git clone git://git.beardyjay.co.uk/seedlinux
Log | Files | Refs | README | LICENSE

commit b4d8e9ce4929059453dc9ade88e4bdda493e9943
parent 2a17b9eebf04a0b63c12950b45474fc1227a3a09
Author: Jay Scott <jay@jayscott.co.uk>
Date:   Thu, 29 Jun 2017 20:51:15 +0100

mongoose migration, db models and torrent details

    moving from mongodb/monk to mongoose

    things were getting a bit of a mess to say the least. I have now
    created controllers and models along with moving to mongoose.

      - I have removed all old routes
      - Add an model and controller for Torrents
      - Added in async for better handling of requests
      - Removed the DB loader and just used app.js
      - Moved the content to /torrent
      - Create a torrent details page

Diffstat:
Mapp.js | 15+++++++++++----
Mapp/db.js | 10++++++----
Mconfig/development.json | 2+-
Acontrollers/torrents_controller.js | 31+++++++++++++++++++++++++++++++
Amodels/torrent_model.js | 27+++++++++++++++++++++++++++
Mpackage-lock.json | 124++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Mpackage.json | 4++--
Mroutes/index.js | 14+++-----------
Droutes/parse.js | 72------------------------------------------------------------------------
Aroutes/torrent_route.js | 10++++++++++
Aviews/details.pug | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dviews/index.pug | 27---------------------------
Mviews/layout.pug | 2+-
Aviews/torrent.pug | 24++++++++++++++++++++++++
14 files changed, 260 insertions(+), 167 deletions(-)

diff --git a/app.js b/app.js @@ -6,11 +6,18 @@ const favicon = require('serve-favicon'); const logger = require('morgan'); const cookieParser = require('cookie-parser'); const bodyParser = require('body-parser'); +const mongoose = require('mongoose'); -const dbconn = require('./app/db'); -const parse = require('./routes/parse'); +const config = require('./app/config'); +const torrent = require('./routes/torrent_route'); const index = require('./routes/index'); +const mongoDB = config.dbURI; +mongoose.connect(mongoDB); + +var db = mongoose.connection; +db.on('error', console.error.bind(console, 'MongoDB connection error:')); + const app = express(); app.set('views', path.join(__dirname, 'views')); @@ -23,12 +30,12 @@ app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(function(req,res,next){ - req.db = dbconn.db; + req.db = db; next(); }); app.use('/', index); -app.use('/parse/', parse); +app.use('/torrent/', torrent); app.use(function(req, res, next) { var err = new Error('Not Found'); diff --git a/app/db.js b/app/db.js @@ -1,10 +1,12 @@ 'use strict'; -const config = require('./config'); -const mongo = require('mongodb'); -const monk = require('monk'); +const mongoose = require('mongoose'); -const db = monk(config.dbURI); +const mongoDB = config.dbURI; +mongoose.connect(mongoDB); + +var db = mongoose.connection; +db.on('error', console.error.bind(console, 'MongoDB connection error:')); module.exports = { db diff --git a/config/development.json b/config/development.json @@ -1,6 +1,6 @@ { "host": "http://localhost:3000", - "dbURI": "localhost:27017/seedlinux", + "dbURI": "mongodb://localhost:27017/seedlinux", "collection" : "torrents", "torrent_data" : "data/torrents" } \ No newline at end of file diff --git a/controllers/torrents_controller.js b/controllers/torrents_controller.js @@ -0,0 +1,31 @@ +'use strict'; + +let Torrent = require('../models/torrent_model'); +const async = require('async'); + +exports.index = function(req, res) { + + async.parallel({ + torrent_count: function(callback) { + Torrent.count(callback); + }, + torrent_data: function(callback) { + Torrent.find({},callback); + }, + }, function(err, results) { + res.render('torrent', { title: 'Index Page', error: err, data: results }); + }); +}; + +exports.torrent_detail = function(req, res) { + async.parallel({ + torrent_count: function(callback) { + Torrent.count(callback); + }, + torrent_data: function(callback) { + Torrent.find({hash: req.params.id},callback); + }, + }, function(err, results) { + res.render('details', { title: 'Torrent Details', error: err, data: results }); + }); +}; diff --git a/models/torrent_model.js b/models/torrent_model.js @@ -0,0 +1,27 @@ +'use strict'; + +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const TorrentSchema = Schema( + { + name: {type: String, required: true, max: 100}, + hash: {type: String, required: true, max: 20}, + created: {type: String}, + comment: {type: String, max: 100}, + announce: [ + {type: String} + ], + files: [{ + path: String, + name: String, + length: Number, + offset: Number + }], + magneturi: {type: String}, + leechers: {type: Number}, + seeders: {type: Number}, + } +); + +module.exports = mongoose.model('Torrent', TorrentSchema); diff --git a/package-lock.json b/package-lock.json @@ -50,6 +50,11 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz", "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=" }, + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==" + }, "basic-auth": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", @@ -72,6 +77,11 @@ "resolved": "https://registry.npmjs.org/blob-to-buffer/-/blob-to-buffer-1.2.6.tgz", "integrity": "sha1-CJrCZMaGtz6tbFOaSEqAA7+7IDM=" }, + "bluebird": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", + "integrity": "sha1-AkpVFylTCIV/FPkfEQb8O1VfRGs=" + }, "body-parser": { "version": "1.17.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", @@ -268,6 +278,11 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=" }, + "hooks-fixed": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.0.tgz", + "integrity": "sha1-oB2JTVKsf2WZu7H2PfycQR33DLo=" + }, "http-errors": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", @@ -323,6 +338,11 @@ "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=" }, + "kareem": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.4.1.tgz", + "integrity": "sha1-7XYgAET6BB7zK02oJh4lU/EXNTE=" + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -333,10 +353,10 @@ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, - "lint": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/lint/-/lint-1.1.2.tgz", - "integrity": "sha1-Ne0GTzIlR8MxNY2JmGhmSWi6Nx8=" + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" }, "longest": { "version": "1.0.1", @@ -379,60 +399,64 @@ "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" }, "mongodb": { - "version": "2.2.29", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.29.tgz", - "integrity": "sha512-MrQvIsN6zN80I4hdFo8w46w51cIqD2FJBGsUfApX9GmjXA1aCclEAJbOHaQWjCtabeWq57S3ECzqEKg/9bdBhA==" + "version": "2.2.27", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.27.tgz", + "integrity": "sha1-NBIgNNtm2YO89qta2yaiSnD+9uY=" }, "mongodb-core": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.13.tgz", - "integrity": "sha512-mbcvqLLZwVcpTrsfBDY3hRNk2SDNJWOvKKxFJSc0pnUBhYojymBc/L0THfQsWwKJrkb2nIXSjfFll1mG/I5OqQ==" - }, - "monk": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/monk/-/monk-6.0.1.tgz", - "integrity": "sha512-R3fD134A/Y5kx2TPs3knFJxLc8b5kTs4Cqo3N3P/dsZjx5JMJpLHQtlEiy0CO2NPRHjH4lGBc+WziEqeyzjtiA==" - }, - "monk-middleware-cast-ids": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/monk-middleware-cast-ids/-/monk-middleware-cast-ids-0.2.1.tgz", - "integrity": "sha1-QMQOWmyzPM7cKJIglDJ17ohhxSk=" - }, - "monk-middleware-fields": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/monk-middleware-fields/-/monk-middleware-fields-0.2.0.tgz", - "integrity": "sha1-/2N6819ZSIecyyvhWpE2CRG+psE=" - }, - "monk-middleware-handle-callback": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/monk-middleware-handle-callback/-/monk-middleware-handle-callback-0.2.0.tgz", - "integrity": "sha1-+r+TduzfAMnjbImwWuoIEri4Ohw=" - }, - "monk-middleware-options": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/monk-middleware-options/-/monk-middleware-options-0.2.1.tgz", - "integrity": "sha1-WNrhxRjUZjbr3/UG+t/Hc7tEKIY=" - }, - "monk-middleware-query": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/monk-middleware-query/-/monk-middleware-query-0.2.0.tgz", - "integrity": "sha1-qSbGd9SlYgxiFRsKVtDAwVFnWHQ=" - }, - "monk-middleware-wait-for-connection": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/monk-middleware-wait-for-connection/-/monk-middleware-wait-for-connection-0.2.0.tgz", - "integrity": "sha1-MSlY0w5Yi1fQl1TdfJe0hDMWg1o=" + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.11.tgz", + "integrity": "sha1-HDh3bOsXSZepnCiGDu2QKNqbPho=" + }, + "mongoose": { + "version": "4.10.8", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.10.8.tgz", + "integrity": "sha1-MfRO14hHVvn9m3cI3cs/y0JQ804=", + "dependencies": { + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=" + } + } }, "morgan": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=" }, + "mpath": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", + "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.1.tgz", + "integrity": "sha1-mrNnSXFIAP8LtTpoHOS8TV8HyHs=", + "dependencies": { + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "muri": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.2.1.tgz", + "integrity": "sha1-7H6lzmympSPrGrNbrNpfqBbJqjw=" + }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", @@ -590,6 +614,11 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=" }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", @@ -679,6 +708,11 @@ "resolved": "https://registry.npmjs.org/simple-sha1/-/simple-sha1-2.1.0.tgz", "integrity": "sha1-lCe7lv8SY8wQqEFM7dUaGLkZ6LM=" }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", diff --git a/package.json b/package.json @@ -8,12 +8,12 @@ }, "dependencies": { "app-root-path": "^2.0.1", + "async": "^2.5.0", "body-parser": "~1.17.1", "cookie-parser": "~1.4.3", "debug": "~2.6.3", "express": "~4.15.2", - "mongodb": "^2.2.29", - "monk": "^6.0.1", + "mongoose": "^4.10.8", "morgan": "~1.8.1", "parse-torrent": "^5.8.3", "pug": "~2.0.0-beta11", diff --git a/routes/index.js b/routes/index.js @@ -1,19 +1,11 @@ 'use strict'; -const config = require('../app/config'); const express = require('express'); const router = express.Router(); -/* GET home page. */ -router.get('/', (req, res) => { - const collection = req.db.get(config.collection); - - collection.find({}, {}, (e, docs) => { - res.render('index', { - 'torrentlist': docs, - 'title': 'Index Page', - }); - }); +/* Redirect home page to torrents list. */ +router.get('/', function(req, res) { + res.redirect('/torrent'); }); module.exports = router; diff --git a/routes/parse.js b/routes/parse.js @@ -1,72 +0,0 @@ -'use strict'; - -const config = require('../app/config'); - -const express = require('express'); -const parseTorrent = require('parse-torrent'); -const appRoot = require('app-root-path'); -const fs = require('fs'); -const router = express.Router(); - -/** - TODO: - - Refactor. - - Move to commandline tool instead of web route. - - get seeders / leechers on first pass. -*/ -router.get('/', (req, res) => { - - const collection = req.db.get(config.collection); - const torrentFolder = config.torrent_data; - - fs.readdir(torrentFolder, (err, files) => { - files.forEach(file => { - let tFile = fs.readFileSync(torrentFolder + '/' + file); - let tData = parseTorrent(tFile); - - let tMagnet = parseTorrent.toMagnetURI({ - infoHash: tData.infoHash - }) - - collection.update({ - name: tData.name}, - { - "name" : tData.name, - "hash" : tData.infoHash, - "announce" : tData.announce, - "created" : tData.created, - "magneturi" : tMagnet, - "files" : tData.files, - "comment" : tData.comment - }, - {upsert: true, safe: false}, - function (err, doc) { - if (err) { - res.status(500).send("There was a problem adding the torrent information to the database."); - } - }); - }); - }); - - res.send('Torrent folder updated \n'); - -}); - - -function getFiles() { - -} - -function getMetadata() { - -} - -function getMagnetLink() { - -} - -function updateDB() { - -} - -module.exports = router; diff --git a/routes/torrent_route.js b/routes/torrent_route.js @@ -0,0 +1,10 @@ +'use strict'; + +const express = require('express'); +const router = express.Router(); +const torrent_controller = require('../controllers/torrents_controller'); + +router.get('/', torrent_controller.index); +router.get('/details/:id', torrent_controller.torrent_detail); + +module.exports = router; diff --git a/views/details.pug b/views/details.pug @@ -0,0 +1,64 @@ +extends layout + +block content + h2.ui.header + a(href='/') + i.backward.icon + .content= 'Back' + each i in data.torrent_data + table.ui.olive.table + thead + tr + th(colspan='2')= 'Torrent Details' + tr + td + i.tag.olive.icon + = 'Name' + td= i.name.replace(/\.[^/.]+$/, "") + tr + td + i.magnet.olive.icon + = 'Magnet URL' + td + a(href="" + i.magneturi)= i.magneturi + tr + td + i.upload.olive.icon + = 'Seeders' + td= i.seeders + tr + td + i.download.olive.icon + = 'Leechers' + td= i.leechers + tr + td + i.hashtag.olive.icon + = 'Info Hash' + td= i.hash + tr + td + i.calendar.olive.icon + = 'Created' + td= i.created + tr + td + i.comment.outline.olive.icon + = 'Comment' + td= i.comment + tr + td + i.feed.olive.icon + = 'Announce URL' + td + ul + each url in i.announce + li= url + tr + td + i.file.outline.olive.icon + = 'Files' + td + ul + each file in i.files + li= file.name+ \ No newline at end of file diff --git a/views/index.pug b/views/index.pug @@ -1,27 +0,0 @@ -extends layout - -block content - .ui.special.four.cards - each i in torrentlist - .card - .content - .header= i.name.replace(/\.[^/.]+$/, "") - .meta - span.category= "2 days ago" - .description= i.comment - .extra.content - span.left.floated - if i.seeders >= 10 - i.floated.upload.green.icon - else - i.floated.upload.red.icon - = i.seeders - span.left.floated - if i.leechers >= 50 - i.floated.download.yellow.icon - else - i.floated.download.green.icon - = i.leechers - .ui.bottom.attached.button - i.add.icon - a(href="/torrent/details/" + i.hash) Details diff --git a/views/layout.pug b/views/layout.pug @@ -24,7 +24,7 @@ html .ui.container .ui.small.three.statistics .olive.statistic - .value= "143" + .value= data.torrent_count .label= "Total Torrents" .red.statistic .value= "23" diff --git a/views/torrent.pug b/views/torrent.pug @@ -0,0 +1,24 @@ +extends layout + +block content + .ui.special.four.cards + each i in data.torrent_data + a.ui.card(href="/torrent/details/" + i.hash) + .content + .header= i.name.replace(/\.[^/.]+$/, "") + .meta + span.category= "2 days ago" + .description= i.comment + .extra.content + span.left.floated + if i.seeders >= 10 + i.floated.upload.green.icon + else + i.floated.upload.red.icon + = i.seeders + span.left.floated + if i.leechers >= 50 + i.floated.download.yellow.icon + else + i.floated.download.green.icon + = i.leechers