diff --git a/package.json b/package.json index 1364295..666f8d0 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "classnames": "^2.2.0", "codemirror": "^5.22.0", "cookie-parser": "^1.4.3", + "egads": "^1.0.1", "express": "^4.13.3", "jwt-simple": "^0.5.1", "lodash": "^4.17.3", diff --git a/server.js b/server.js index ffe3352..1bd1f9d 100644 --- a/server.js +++ b/server.js @@ -29,110 +29,11 @@ app.use(mw.admin); //Routes - - +app.use(require('./server/brew.api.js')); app.use(require('./server/interface.routes.js')); -app.use(require('./server/homebrew.api.js')); -app.use(require('./server/admin.api.js')); -const HomebrewModel = require('./server/homebrew.model.js').model; -const welcomeText = require('fs').readFileSync('./client/homebrew/pages/homePage/welcome_msg.md', 'utf8'); -const changelogText = require('fs').readFileSync('./changelog.md', 'utf8'); - - - -//Source page -String.prototype.replaceAll = function(s,r){return this.split(s).join(r)} -app.get('/source/:id', (req, res)=>{ - HomebrewModel.get({shareId : req.params.id}) - .then((brew)=>{ - const text = brew.text.replaceAll('<', '<').replaceAll('>', '>'); - return res.send(`
${text}
`); - }) - .catch((err)=>{ - console.log(err); - return res.status(404).send('Could not find Homebrew with that id'); - }) -}); - - -app.get('/user/:username', (req, res, next) => { - const fullAccess = req.account && (req.account.username == req.params.username); - HomebrewModel.getByUser(req.params.username, fullAccess) - .then((brews) => { - req.brews = brews; - return next(); - }) - .catch((err) => { - console.log(err); - }) -}) - - -app.get('/edit/:id', (req, res, next)=>{ - HomebrewModel.get({editId : req.params.id}) - .then((brew)=>{ - req.brew = brew.sanatize(); - return next(); - }) - .catch((err)=>{ - console.log(err); - return res.status(400).send(`Can't get that`); - }); -}); - -//Share Page -app.get('/share/:id', (req, res, next)=>{ - HomebrewModel.get({shareId : req.params.id}) - .then((brew)=>{ - return brew.increaseView(); - }) - .then((brew)=>{ - req.brew = brew.sanatize(true); - return next(); - }) - .catch((err)=>{ - console.log(err); - return res.status(400).send(`Can't get that`); - }); -}); - -//Print Page -app.get('/print/:id', (req, res, next)=>{ - HomebrewModel.get({shareId : req.params.id}) - .then((brew)=>{ - req.brew = brew.sanatize(true); - return next(); - }) - .catch((err)=>{ - console.log(err); - return res.status(400).send(`Can't get that`); - }); -}); - - -//Render Page -const render = require('vitreum/steps/render'); -const templateFn = require('./client/template.js'); -app.use((req, res) => { - render('homebrew', templateFn, { - version : require('./package.json').version, - url: req.originalUrl, - welcomeText : welcomeText, - changelog : changelogText, - brew : req.brew, - brews : req.brews, - account : req.account - }) - .then((page) => { - return res.send(page) - }) - .catch((err) => { - console.log(err); - return res.sendStatus(500); - }); -}); +//app.use(require('./server/admin.api.js')); const PORT = process.env.PORT || 8000; diff --git a/server/brew.api.js b/server/brew.api.js index c3c344d..2af9a23 100644 --- a/server/brew.api.js +++ b/server/brew.api.js @@ -28,7 +28,7 @@ router.post('/api/brew', (req, res, next)=>{ }); //Update -router.put('/api/brew/:editId', mw.loadBrew, mw.Validate, (req, res, next)=>{ +router.put('/api/brew/:editId', mw.loadBrew, (req, res, next)=>{ if(req.account){ req.brew.authors = _.uniq(_.concat(req.brew.authors, req.account.username)); } @@ -40,7 +40,7 @@ router.put('/api/brew/:editId', mw.loadBrew, mw.Validate, (req, res, next)=>{ }); //Delete -router.delete('/api/brew/:editId', mw.loadBrew, mw.Validate, (req, res, next) => { +router.delete('/api/brew/:editId', mw.loadBrew, (req, res, next) => { BrewData.remove(req.brew.editId) .then(()=>{ return res.sendStatus(200); diff --git a/server/brew.data.js b/server/brew.data.js index b86292d..2027214 100644 --- a/server/brew.data.js +++ b/server/brew.data.js @@ -7,21 +7,21 @@ const utils = require('./utils.js'); const BrewSchema = mongoose.Schema({ shareId : {type : String, default: shortid.generate, index: { unique: true }}, - editId : {type : String, default: shortid.generate, index: { unique: true }}, + editId : {type : String, default: shortid.generate, index: { unique: true }}, text : {type : String, default : ""}, - title : {type : String, default : ""}, + title : {type : String, default : ""}, description : {type : String, default : ""}, - tags : {type : String, default : ""}, - systems : [String], - authors : [String], - published : {type : Boolean, default : false}, + tags : {type : String, default : ""}, + systems : [String], + authors : [String], + published : {type : Boolean, default : false}, - createdAt : { type: Date, default: Date.now }, - updatedAt : { type: Date, default: Date.now}, - lastViewed : { type: Date, default: Date.now}, - views : {type:Number, default:0} + createdAt : { type: Date, default: Date.now }, + updatedAt : { type: Date, default: Date.now}, + lastViewed : { type: Date, default: Date.now}, + views : {type:Number, default:0} }, { versionKey: false }); /* @@ -35,7 +35,7 @@ BrewSchema.methods.sanatize = function(userName, isAdmin, getText = true){ return brew; }; */ - +/* BrewSchema.methods.sanatize = function(req, getText = true){ const brew = this.toJSON(); delete brew._id; @@ -56,6 +56,12 @@ BrewSchema.methods.increaseView = function(){ }); }); }; +*/ + +BrewSchema.methods.increaseView = function(){ + this.views = this.views + 1; + return this.save(); +}; const Brew = mongoose.model('Brew', BrewSchema); @@ -64,7 +70,7 @@ const Brew = mongoose.model('Brew', BrewSchema); const BrewData = { schema : BrewSchema, - model : Brew, + model : Brew, get : (query) => { //returns a single brew with the given query @@ -95,8 +101,13 @@ const BrewData = { getByShare : (shareId) => { - //auto sanatize - //increase view count + return BrewData.get({ shareId : shareId}) + .then((brew) => { + brew.increaseView(); + const brewJSON = brew.toJSON(); + delete brewJSON.editId; + return brewJSON; + }); }, getByEdit : (editId) => { return Brew.get({ editId }); diff --git a/server/errors.js b/server/errors.js new file mode 100644 index 0000000..a380a37 --- /dev/null +++ b/server/errors.js @@ -0,0 +1,14 @@ +const egads = require('egads'); + + +const Error = egads.extend('Server Error', 500, 'Generic Server Error'); + +Error.noBrew = Error.extend('Can not find a brew with that id', 404); + + + + + + + +module.exports = Error; \ No newline at end of file diff --git a/server/interface.routes.js b/server/interface.routes.js index def4b2b..0e3ea2b 100644 --- a/server/interface.routes.js +++ b/server/interface.routes.js @@ -2,16 +2,25 @@ const _ = require('lodash'); const utils = require('./utils.js'); const BrewData = require('./brew.data.js'); const router = require('express').Router(); +const mw = require('./middleware.js'); + + +const docs = { + welcomeBrew : require('fs').readFileSync('./welcome.brew.md', 'utf8'), + changelog : require('fs').readFileSync('./changelog.md', 'utf8'), +}; const vitreumRender = require('vitreum/steps/render'); const templateFn = require('./client/template.js'); +//TODO: Catch errors here? const renderPage = (req, res, next) => { return vitreumRender('homebrew', templateFn, { url : req.originalUrl, version : require('./package.json').version, + //TODO: add in login path? - user : req.account && req.account.username, + user : req.account && req.account.username, brews : req.brews, brew : req.brew }) @@ -24,10 +33,10 @@ const renderPage = (req, res, next) => { router.get('/share/:shareId', mw.viewBrew, renderPage); //Edit Page -app.get('/edit/:editId', mw.loadBrew, mw.validate, renderPage); +router.get('/edit/:editId', mw.loadBrew, renderPage); //Print Page -app.get('/print/:shareId', mw.viewBrew, renderPage); +router.get('/print/:shareId', mw.viewBrew, renderPage); //Source page router.get('/source/:sharedId', mw.viewBrew, (req, res, next)=>{ @@ -35,20 +44,36 @@ router.get('/source/:sharedId', mw.viewBrew, (req, res, next)=>{ return res.send(`
${text}
`); }); - - -//user Page +//User Page router.get('/user/:username', (req, res, next) => { - BrewData.search({ user : req.params.username }, req) + BrewData.search({ user : req.params.username }) .then((brews) => { - return render(req, { brews : brews }); + req.brews = brews; + return next(); }) - .then(res.send) .catch(next); -}); +}, renderPage); +//Search Page +router.get('/search', (req, res, next) => { + BrewData.search() + .then((brews) => { + req.brews = brews; + return next(); + }) + .catch(next); +}, renderPage); -//Catch all page? -router.get('*', renderPage); +//Changelog Page +router.get('/changelog', (req, res, next) => { + req.brew = { text : docs.changelog }; + return next(); +}, renderPage); + +//Home Page +router.get('/', (req, res, next) => { + req.brew = { text : docs.welcomeBrew }; + return next(); +}, renderPage); module.exports = router; \ No newline at end of file diff --git a/server/middleware.js b/server/middleware.js index 19da276..0d9d235 100644 --- a/server/middleware.js +++ b/server/middleware.js @@ -32,25 +32,13 @@ const Middleware = { if(req.isAdmin) return next(); return res.sendStatus(401); }, - validate : (req, res, next) => { - //Only allow admin or brew authors pass. - - return next(); - }, //Loaders loadBrew : (req, res, next) => { //Loads a brew by edit id - if(req.params.shareId){ - BrewData.get({ shareId : req.params.shareId}) - .then((brew)) - }else if(req.params.editId){ - - }else{ - return next(); - } + //TODO: move validate into hurrr }, viewBrew : (req, res, next) => { //load by share diff --git a/client/homebrew/pages/homePage/welcome_msg.md b/welcome.brew.md similarity index 100% rename from client/homebrew/pages/homePage/welcome_msg.md rename to welcome.brew.md