1
0
mirror of https://github.com/stolksdorf/homebrewery.git synced 2025-12-22 20:21:29 +00:00

Added a brew lookup for admin page

This commit is contained in:
Scott Tolksdorf
2017-01-19 12:28:00 -05:00
parent 9fe6fd979b
commit 296b066ed3
8 changed files with 120 additions and 16 deletions

View File

@@ -3,6 +3,7 @@
### Thursday, 19/01/2017 - v2.7.0 ### Thursday, 19/01/2017 - v2.7.0
- Fixed saving multiple authors and multiple systems on brew metadata (thanks u/PalaNolho re:282) - Fixed saving multiple authors and multiple systems on brew metadata (thanks u/PalaNolho re:282)
- Adding in line highlight for new pages - Adding in line highlight for new pages
- Added in a simple brew lookup for admin
### Saturday, 14/01/2017 - v2.7.0 ### Saturday, 14/01/2017 - v2.7.0

View File

@@ -27,8 +27,6 @@ var Admin = React.createClass({
<div className='container'> <div className='container'>
<a target="_blank" href='https://www.google.com/analytics/web/?hl=en#report/defaultid/a72212009w109843310p114529111/'>Link to Google Analytics</a>
<HomebrewAdmin homebrews={this.props.homebrews} admin_key={this.props.admin_key} /> <HomebrewAdmin homebrews={this.props.homebrews} admin_key={this.props.admin_key} />
</div> </div>

View File

@@ -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 <div className='searching'><i className='fa fa-spin fa-spinner' /></div>;
if(!this.state.resultBrew) return <div className='noBrew'>No brew found.</div>;
const brew = this.state.resultBrew;
return <div className='brewRow'>
<div>{brew.title}</div>
<div>{brew.authors.join(', ')}</div>
<div><a href={'/edit/' + brew.editId} target='_blank'>/edit/{brew.editId}</a></div>
<div><a href={'/share/' + brew.shareId} target='_blank'>/share/{brew.shareId}</a></div>
<div>{Moment(brew.updatedAt).fromNow()}</div>
<div>{brew.views}</div>
</div>
},
render: function(){
return <div className='brewLookup'>
<h1>Brew Lookup</h1>
<input type='text' value={this.state.query} onChange={this.handleChange} placeholder='edit or share id...' />
<button onClick={this.lookup}><i className='fa fa-search'/></button>
{this.renderFoundBrew()}
</div>
}
});
module.exports = BrewLookup;

View File

@@ -0,0 +1,8 @@
.brewLookup{
height : 200px;
input{
height : 33px;
padding : 0px 10px;
margin-bottom: 20px;
}
}

View File

@@ -7,6 +7,8 @@ var Moment = require('moment');
var BrewSearch = require('./brewSearch.jsx'); var BrewSearch = require('./brewSearch.jsx');
var BrewLookup = require('./brewLookup/brewLookup.jsx');
var HomebrewAdmin = React.createClass({ var HomebrewAdmin = React.createClass({
getDefaultProps: function() { getDefaultProps: function() {
@@ -35,6 +37,7 @@ var HomebrewAdmin = React.createClass({
page : page page : page
}) })
.end((err, res)=>{ .end((err, res)=>{
if(err || !res.body || !res.body.brews) return;
this.state.brewCache[page] = res.body.brews; this.state.brewCache[page] = res.body.brews;
this.setState({ this.setState({
brewCache : this.state.brewCache, brewCache : this.state.brewCache,
@@ -141,9 +144,18 @@ var HomebrewAdmin = React.createClass({
render : function(){ render : function(){
var self = this; var self = this;
return <div className='homebrewAdmin'> return <div className='homebrewAdmin'>
<BrewLookup adminKey={this.props.admin_key} />
{/*
<h2> <h2>
Homebrews - {this.state.total} Homebrews - {this.state.total}
</h2> </h2>
{this.renderPagnination()} {this.renderPagnination()}
{this.renderBrewTable()} {this.renderBrewTable()}
@@ -152,6 +164,7 @@ var HomebrewAdmin = React.createClass({
</button> </button>
<BrewSearch admin_key={this.props.admin_key} /> <BrewSearch admin_key={this.props.admin_key} />
*/}
</div> </div>
} }
}); });

View File

@@ -10,8 +10,12 @@ const livereload = require('vitreum/steps/livereload.js').partial;
const Proj = require('./project.json'); const Proj = require('./project.json');
Promise.resolve() 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(less('homebrew', './shared'))
.then(jsx('admin', './client/admin/admin.jsx', Proj.libs, './shared'))
.then(less('admin', './shared'))
.then(assets(Proj.assets, ['./shared', './client'])) .then(assets(Proj.assets, ['./shared', './client']))
.then(livereload()) .then(livereload())
.then(server('./server.js', ['server'])) .then(server('./server.js', ['server']))

View File

@@ -3,7 +3,7 @@ const jwt = require('jwt-simple');
const express = require("express"); const express = require("express");
const app = 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('body-parser').json({limit: '25mb'}));
app.use(require('cookie-parser')()); 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/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; const HomebrewModel = require('./server/homebrew.model.js').model;

View File

@@ -2,7 +2,6 @@ const _ = require('lodash');
const auth = require('basic-auth'); const auth = require('basic-auth');
const HomebrewModel = require('./homebrew.model.js').model; const HomebrewModel = require('./homebrew.model.js').model;
const router = require('express').Router(); const router = require('express').Router();
const vitreumRender = require('vitreum/render');
const mw = { const mw = {
@@ -42,27 +41,41 @@ 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 //Admin route
const render = require('vitreum/steps/render');
const templateFn = require('../client/template.js');
router.get('/admin', function(req, res){ router.get('/admin', function(req, res){
const credentials = auth(req) const credentials = auth(req)
if (!credentials || credentials.name !== process.env.ADMIN_USER || credentials.pass !== process.env.ADMIN_PASS) { if (!credentials || credentials.name !== process.env.ADMIN_USER || credentials.pass !== process.env.ADMIN_PASS) {
res.setHeader('WWW-Authenticate', 'Basic realm="example"') res.setHeader('WWW-Authenticate', 'Basic realm="example"')
return res.status(401).send('Access denied') return res.status(401).send('Access denied')
} }
vitreumRender({ render('admin', templateFn, {
page: './build/admin/bundle.dot',
prerenderWith : './client/admin/admin.jsx',
clearRequireCache : !process.env.PRODUCTION,
initialProps: {
url: req.originalUrl, url: req.originalUrl,
admin_key : process.env.ADMIN_KEY, admin_key : process.env.ADMIN_KEY,
}, })
}, function (err, page) { .then((page) => {
return res.send(page) return res.send(page)
})
.catch((err) => {
console.log(err);
return res.sendStatus(500);
}); });
}); });