diff --git a/client/admin/admin.jsx b/client/admin/admin.jsx new file mode 100644 index 000000000..359c52d48 --- /dev/null +++ b/client/admin/admin.jsx @@ -0,0 +1,38 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var HomebrewAdmin = require('./homebrewAdmin/homebrewAdmin.jsx'); + +var Admin = React.createClass({ + getDefaultProps: function() { + return { + url : "", + admin_key : "", + homebrews : [], + }; + }, + + render : function(){ + var self = this; + return( +
+ +
+
+ + naturalcrit admin +
+
+ +
+ +
+ + +
+ ); + } +}); + +module.exports = Admin; diff --git a/client/admin/admin.less b/client/admin/admin.less new file mode 100644 index 000000000..3a7ff0d88 --- /dev/null +++ b/client/admin/admin.less @@ -0,0 +1,39 @@ +@import 'naturalCrit/styles/reset.less'; +@import 'naturalCrit/styles/elements.less'; +@import 'naturalCrit/styles/animations.less'; +@import 'naturalCrit/styles/colors.less'; +@import 'naturalCrit/styles/tooltip.less'; + +@import 'font-awesome/css/font-awesome.css'; + +html,body, #reactContainer, .naturalCrit{ + min-height : 100%; +} + +@sidebarWidth : 250px; + +body{ + background-color : #eee; + font-family : 'Open Sans', sans-serif; + color : #4b5055; + font-weight : 100; + text-rendering : optimizeLegibility; + margin : 0; + padding : 0; + height : 100%; +} + +.admin{ + + header{ + background-color : @red; + font-size: 2em; + padding : 20px 0px; + color : white; + margin-bottom: 30px; + i{ + margin-right: 30px; + } + } + +} \ No newline at end of file diff --git a/client/admin/homebrewAdmin/homebrewAdmin.jsx b/client/admin/homebrewAdmin/homebrewAdmin.jsx new file mode 100644 index 000000000..0bb388c88 --- /dev/null +++ b/client/admin/homebrewAdmin/homebrewAdmin.jsx @@ -0,0 +1,58 @@ +var React = require('react'); +var _ = require('lodash'); +var cx = require('classnames'); + +var Moment = require('moment') + +var HomebrewAdmin = React.createClass({ + + getDefaultProps: function() { + return { + homebrews : [], + admin_key : '' + }; + }, + + renderBrews : function(){ + return _.map(this.props.homebrews, (brew)=>{ + return + + {brew.editId} + {Moment(brew.createdAt).fromNow()} + {Moment(brew.updatedAt).fromNow()} + {Moment(brew.lastViewed).fromNow()} + {brew.views} + + view + + + + }) + }, + + render : function(){ + var self = this; + return( +
+

Homebrews - {this.props.homebrews.length}

+ + + + + + + + + + + + + {this.renderBrews()} + +
Edit IdCreated AtLast UpdatedLast ViewedNumber of ViewsPreview
+
+ ); + } +}); + +module.exports = HomebrewAdmin; diff --git a/client/admin/homebrewAdmin/homebrewAdmin.less b/client/admin/homebrewAdmin/homebrewAdmin.less new file mode 100644 index 000000000..19239d846 --- /dev/null +++ b/client/admin/homebrewAdmin/homebrewAdmin.less @@ -0,0 +1,24 @@ +.homebrewAdmin{ + + table{ + max-height: 800px; + overflow-y: scroll; + th{ + font-weight: 800; + padding: 10px; + } + + tr:nth-child(even){ + background-color: fade(@green, 10%); + } + tr.isEmpty{ + background-color: fade(@red, 30%); + } + td{ + min-width: 100px; + text-align: center; + padding: 10px; + } + } + +} \ No newline at end of file diff --git a/client/homebrew/editPage/editPage.jsx b/client/homebrew/editPage/editPage.jsx index ec6e96e00..42a61b447 100644 --- a/client/homebrew/editPage/editPage.jsx +++ b/client/homebrew/editPage/editPage.jsx @@ -41,7 +41,7 @@ var EditPage = React.createClass({ if(this.state.text === ""){ this.setState({ - text : FullClassGen() + text : 'Put stuff huuurr' }) } }, diff --git a/client/homebrew/editor/snippets/monsterblock.gen.js b/client/homebrew/editor/snippets/monsterblock.gen.js index faed0ac8d..ada0af3c2 100644 --- a/client/homebrew/editor/snippets/monsterblock.gen.js +++ b/client/homebrew/editor/snippets/monsterblock.gen.js @@ -141,7 +141,7 @@ module.exports = function(){ "> - **Speed** " + _.random(0,50) + "ft.", ">___", ">|STR|DEX|CON|INT|WIS|CHA|", - ">|:---:|:---:|:---:|:---:|:---:|:---:|:---:|", + ">|:---:|:---:|:---:|:---:|:---:|:---:|", stats, ">___", "> - **Condition Immunities** " + genList(["groggy", "swagged", "weak-kneed", "buzzed", "groovy", "melancholy", "drunk"], 3), diff --git a/gulpfile.js b/gulpfile.js index bedeb9603..538414343 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -5,7 +5,7 @@ var gulp = require("gulp"); var gulp = vitreumTasks(gulp, { - entryPoints: ["./client/naturalCrit", "./client/homebrew"], + entryPoints: ["./client/naturalCrit", "./client/homebrew", "./client/admin"], DEV: true, diff --git a/package.json b/package.json index 74e25925e..29b6291a4 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "license": "BSD-2-Clause", "dependencies": { "app-module-path": "^1.0.4", + "basic-auth": "^1.0.3", "body-parser": "^1.14.2", "classnames": "^2.2.0", "express": "^4.13.3", diff --git a/server.js b/server.js index c6c53c455..d3850331a 100644 --- a/server.js +++ b/server.js @@ -19,9 +19,46 @@ mongoose.connection.on('error', function(){ }); + + + + +//Admin route +process.env.ADMIN_USER = process.env.ADMIN_USER || 'admin'; +process.env.ADMIN_PASS = process.env.ADMIN_PASS || 'password'; +process.env.ADMIN_KEY = process.env.ADMIN_KEY || 'admin_key'; +var auth = require('basic-auth'); + +var HomebrewModel = require('./server/homebrew.model.js').model; + +app.get('/admin', function(req, res){ + var credentials = auth(req) + if (!credentials || credentials.name !== process.env.ADMIN_USER || credentials.pass !== process.env.ADMIN_PASS) { + res.setHeader('WWW-Authenticate', 'Basic realm="example"') + return res.status(401).send('Access denied') + } + HomebrewModel.find({}, function(err, homebrews){ + vitreumRender({ + page: './build/admin/bundle.dot', + prerenderWith : './client/admin/admin.jsx', + clearRequireCache : true, + initialProps: { + url: req.originalUrl, + admin_key : process.env.ADMIN_KEY, + + homebrews : homebrews, + }, + }, function (err, page) { + return res.send(page) + }); + }); +}); + + app = require('./server/homebrew.api.js')(app); + app.get('*', function (req, res) { vitreumRender({ page: './build/naturalCrit/bundle.dot', diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 648436dac..185b1b992 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -1,12 +1,6 @@ var vitreumRender = require('vitreum/render'); - - - var HomebrewModel = require('./homebrew.model.js').model; - - - module.exports = function(app){ @@ -49,6 +43,7 @@ module.exports = function(app){ if(!objs.length || err) return res.status(404).send("Can not find homebrew with that id"); var resEntry = objs[0]; resEntry.text = req.body.text; + resEntry.updatedAt = new Date(); resEntry.save(function(err, obj){ if(err) return res.status(500).send("Error while saving"); return res.status(200).send(obj); @@ -56,6 +51,21 @@ module.exports = function(app){ }); }); + app.get('/homebrew/remove/:id', function(req, res){ + if(req.query && req.query.admin_key == process.env.ADMIN_KEY){ + HomebrewModel.find({editId : req.params.id}, function(err, objs){ + if(!objs.length || err) return res.status(404).send("Can not find homebrew with that id"); + var resEntry = objs[0]; + resEntry.remove(function(err){ + if(err) return res.status(500).send("Error while removing"); + return res.status(200).send(); + }) + }); + }else{ + return res.status(401).send('Access denied'); + } + }); + //Share Page @@ -67,7 +77,9 @@ module.exports = function(app){ resObj = objs[0]; } - resObj.editId = null; + resObj.lastViewed = new Date(); + resObj.views = resObj.views + 1; + resObj.save(); vitreumRender({ page: './build/homebrew/bundle.dot', diff --git a/server/homebrew.model.js b/server/homebrew.model.js index 460c5facb..9e96f085b 100644 --- a/server/homebrew.model.js +++ b/server/homebrew.model.js @@ -1,5 +1,6 @@ var mongoose = require('mongoose'); var shortid = require('shortid'); +var _ = require('lodash'); var HomebrewSchema = mongoose.Schema({ shareId : {type : String, default: shortid.generate}, @@ -7,15 +8,13 @@ var HomebrewSchema = mongoose.Schema({ text : {type : String, default : ""}, createdAt : { type: Date, default: Date.now }, - updatedAt : { type: Date} + updatedAt : { type: Date}, + lastViewed : { type: Date}, + views : {type:Number, default:0} }); -//Schema Options -HomebrewSchema.pre('save', function(done) { - this.updatedAt = new Date(); - done(); -}); + /* HomebrewSchema.options.toJSON.transform = function (doc, ret, options) {