From 296b066ed34c39e54122b74d5c098dec4a04ce19 Mon Sep 17 00:00:00 2001 From: Scott Tolksdorf Date: Thu, 19 Jan 2017 12:28:00 -0500 Subject: [PATCH] Added a brew lookup for admin page --- changelog.md | 1 + client/admin/admin.jsx | 2 - .../homebrewAdmin/brewLookup/brewLookup.jsx | 67 +++++++++++++++++++ .../homebrewAdmin/brewLookup/brewLookup.less | 8 +++ client/admin/homebrewAdmin/homebrewAdmin.jsx | 13 ++++ scripts/dev.js | 6 +- server.js | 4 +- server/admin.api.js | 35 +++++++--- 8 files changed, 120 insertions(+), 16 deletions(-) create mode 100644 client/admin/homebrewAdmin/brewLookup/brewLookup.jsx create mode 100644 client/admin/homebrewAdmin/brewLookup/brewLookup.less diff --git a/changelog.md b/changelog.md index 4426e17f0..b7a40ab7c 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,7 @@ ### Thursday, 19/01/2017 - v2.7.0 - Fixed saving multiple authors and multiple systems on brew metadata (thanks u/PalaNolho re:282) - Adding in line highlight for new pages +- Added in a simple brew lookup for admin ### Saturday, 14/01/2017 - v2.7.0 diff --git a/client/admin/admin.jsx b/client/admin/admin.jsx index 1ee3181ac..4fd8d5505 100644 --- a/client/admin/admin.jsx +++ b/client/admin/admin.jsx @@ -27,8 +27,6 @@ var Admin = React.createClass({
- Link to Google Analytics -
diff --git a/client/admin/homebrewAdmin/brewLookup/brewLookup.jsx b/client/admin/homebrewAdmin/brewLookup/brewLookup.jsx new file mode 100644 index 000000000..ad43b13b6 --- /dev/null +++ b/client/admin/homebrewAdmin/brewLookup/brewLookup.jsx @@ -0,0 +1,67 @@ +const React = require('react'); +const _ = require('lodash'); +const cx = require('classnames'); + +const request = require('superagent'); +const Moment = require('moment'); + + +const BrewLookup = React.createClass({ + getDefaultProps: function() { + return { + adminKey : '', + }; + }, + getInitialState: function() { + return { + query:'', + resultBrew : null, + searching : false + }; + }, + + handleChange : function(e){ + this.setState({ + query : e.target.value + }) + }, + lookup : function(){ + this.setState({ searching : true }); + + request.get(`/admin/lookup/${this.state.query}`) + .query({ admin_key : this.props.adminKey }) + .end((err, res) => { + this.setState({ + searching : false, + resultBrew : (err ? null : res.body) + }); + }) + }, + + renderFoundBrew : function(){ + if(this.state.searching) return
; + if(!this.state.resultBrew) return
No brew found.
; + + const brew = this.state.resultBrew; + return
+
{brew.title}
+
{brew.authors.join(', ')}
+
/edit/{brew.editId}
+
/share/{brew.shareId}
+
{Moment(brew.updatedAt).fromNow()}
+
{brew.views}
+
+ }, + + render: function(){ + return
+

Brew Lookup

+ + + + {this.renderFoundBrew()} +
+ } +}); + +module.exports = BrewLookup; diff --git a/client/admin/homebrewAdmin/brewLookup/brewLookup.less b/client/admin/homebrewAdmin/brewLookup/brewLookup.less new file mode 100644 index 000000000..071028c20 --- /dev/null +++ b/client/admin/homebrewAdmin/brewLookup/brewLookup.less @@ -0,0 +1,8 @@ +.brewLookup{ + height : 200px; + input{ + height : 33px; + padding : 0px 10px; + margin-bottom: 20px; + } +} \ No newline at end of file diff --git a/client/admin/homebrewAdmin/homebrewAdmin.jsx b/client/admin/homebrewAdmin/homebrewAdmin.jsx index 704c5da90..70b593c62 100644 --- a/client/admin/homebrewAdmin/homebrewAdmin.jsx +++ b/client/admin/homebrewAdmin/homebrewAdmin.jsx @@ -7,6 +7,8 @@ var Moment = require('moment'); var BrewSearch = require('./brewSearch.jsx'); +var BrewLookup = require('./brewLookup/brewLookup.jsx'); + var HomebrewAdmin = React.createClass({ getDefaultProps: function() { @@ -35,6 +37,7 @@ var HomebrewAdmin = React.createClass({ page : page }) .end((err, res)=>{ + if(err || !res.body || !res.body.brews) return; this.state.brewCache[page] = res.body.brews; this.setState({ brewCache : this.state.brewCache, @@ -141,9 +144,18 @@ var HomebrewAdmin = React.createClass({ render : function(){ var self = this; return
+ + + + {/*

Homebrews - {this.state.total}

+ + + + + {this.renderPagnination()} {this.renderBrewTable()} @@ -152,6 +164,7 @@ var HomebrewAdmin = React.createClass({ + */}
} }); diff --git a/scripts/dev.js b/scripts/dev.js index 88f02b847..6fda537e6 100644 --- a/scripts/dev.js +++ b/scripts/dev.js @@ -10,8 +10,12 @@ const livereload = require('vitreum/steps/livereload.js').partial; const Proj = require('./project.json'); Promise.resolve() - .then(jsx('homebrew', './client/homebrew/homebrew.jsx', Proj.libs, 'shared')) + .then(jsx('homebrew', './client/homebrew/homebrew.jsx', Proj.libs, './shared')) .then(less('homebrew', './shared')) + + .then(jsx('admin', './client/admin/admin.jsx', Proj.libs, './shared')) + .then(less('admin', './shared')) + .then(assets(Proj.assets, ['./shared', './client'])) .then(livereload()) .then(server('./server.js', ['server'])) diff --git a/server.js b/server.js index 791ffc30d..bddf5cc0e 100644 --- a/server.js +++ b/server.js @@ -3,7 +3,7 @@ const jwt = require('jwt-simple'); const express = require("express"); const app = express(); -app.use(express.static(__dirname + '/build')); +app.use(express.static(__dirname + '/build'));'' app.use(require('body-parser').json({limit: '25mb'})); app.use(require('cookie-parser')()); @@ -34,7 +34,7 @@ app.use((req, res, next) => { app.use(require('./server/homebrew.api.js')); -//app.use(require('./server/admin.api.js')); +app.use(require('./server/admin.api.js')); const HomebrewModel = require('./server/homebrew.model.js').model; diff --git a/server/admin.api.js b/server/admin.api.js index 8739ce6d0..8e4376c36 100644 --- a/server/admin.api.js +++ b/server/admin.api.js @@ -2,7 +2,6 @@ const _ = require('lodash'); const auth = require('basic-auth'); const HomebrewModel = require('./homebrew.model.js').model; const router = require('express').Router(); -const vitreumRender = require('vitreum/render'); const mw = { @@ -42,28 +41,42 @@ router.get('/api/invalid', mw.adminOnly, (req, res)=>{ } }); +router.get('/admin/lookup/:id', mw.adminOnly, (req, res, next) => { + //search for mathcing edit id + //search for matching share id + // search for partial match + + HomebrewModel.findOne({ $or:[ + {editId : { "$regex": req.params.id, "$options": "i" }}, + {shareId : { "$regex": req.params.id, "$options": "i" }}, + ]}).exec((err, brew) => { + return res.json(brew); + }); +}); + //Admin route - +const render = require('vitreum/steps/render'); +const templateFn = require('../client/template.js'); router.get('/admin', function(req, res){ const 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') } - vitreumRender({ - page: './build/admin/bundle.dot', - prerenderWith : './client/admin/admin.jsx', - clearRequireCache : !process.env.PRODUCTION, - initialProps: { + render('admin', templateFn, { url: req.originalUrl, admin_key : process.env.ADMIN_KEY, - }, - }, function (err, page) { - return res.send(page) - }); + }) + .then((page) => { + return res.send(page) + }) + .catch((err) => { + console.log(err); + return res.sendStatus(500); + }); });