mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-01-13 15:12:43 +00:00
Removing invalid brews is working
This commit is contained in:
@@ -2,9 +2,8 @@ const React = require('react');
|
|||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
const cx = require('classnames');
|
const cx = require('classnames');
|
||||||
|
|
||||||
const Moment = require('moment');
|
|
||||||
|
|
||||||
const request = require('superagent');
|
const request = require('superagent');
|
||||||
|
const BrewTable = require('../brewTable/brewTable.jsx');
|
||||||
|
|
||||||
const BrewLookup = React.createClass({
|
const BrewLookup = React.createClass({
|
||||||
getDefaultProps: function() {
|
getDefaultProps: function() {
|
||||||
@@ -42,7 +41,7 @@ const BrewLookup = React.createClass({
|
|||||||
if(this.state.searching) return <div className='searching'><i className='fa fa-spin fa-spinner' /></div>;
|
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>;
|
if(!this.state.resultBrew) return <div className='noBrew'>No brew found.</div>;
|
||||||
|
|
||||||
console.log(this.state.resultBrew);
|
return <BrewTable brews={[this.state.resultBrew ]} />
|
||||||
|
|
||||||
const brew = this.state.resultBrew;
|
const brew = this.state.resultBrew;
|
||||||
return <div className='brewRow'>
|
return <div className='brewRow'>
|
||||||
|
|||||||
@@ -4,5 +4,6 @@
|
|||||||
input{
|
input{
|
||||||
height : 33px;
|
height : 33px;
|
||||||
padding : 0px 10px;
|
padding : 0px 10px;
|
||||||
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
54
client/admin/brewTable/brewTable.jsx
Normal file
54
client/admin/brewTable/brewTable.jsx
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
const React = require('react');
|
||||||
|
const _ = require('lodash');
|
||||||
|
const cx = require('classnames');
|
||||||
|
|
||||||
|
const Moment = require('moment');
|
||||||
|
|
||||||
|
//TODO: Add in delete
|
||||||
|
|
||||||
|
const BrewTable = React.createClass({
|
||||||
|
getDefaultProps: function() {
|
||||||
|
return {
|
||||||
|
brews : []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
renderRows : function(){
|
||||||
|
return _.map(this.props.brews, (brew) => {
|
||||||
|
let authors = 'None.';
|
||||||
|
if(brew.authors && brew.authors.length) authors = brew.authors.join(', ');
|
||||||
|
|
||||||
|
return <tr className={cx('brewRow', {'isEmpty' : brew.text == "false"})} key={brew.shareId || brew}>
|
||||||
|
<td>{brew.title}</td>
|
||||||
|
<td>{authors}</td>
|
||||||
|
<td><a href={'/edit/' + brew.editId} target='_blank'>{brew.editId}</a></td>
|
||||||
|
<td><a href={'/share/' + brew.shareId} target='_blank'>{brew.shareId}</a></td>
|
||||||
|
<td>{Moment(brew.updatedAt).fromNow()}</td>
|
||||||
|
<td>{brew.views}</td>
|
||||||
|
<td className='deleteButton'>
|
||||||
|
<i className='fa fa-trash' />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
});
|
||||||
|
},
|
||||||
|
render: function(){
|
||||||
|
return <table className='brewTable'>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Title</th>
|
||||||
|
<th>Authors</th>
|
||||||
|
<th>Edit Link</th>
|
||||||
|
<th>Share Link</th>
|
||||||
|
<th>Last Updated</th>
|
||||||
|
<th>Views</th>
|
||||||
|
<th>Remove</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{this.renderRows()}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = BrewTable;
|
||||||
44
client/admin/brewTable/brewTable.less
Normal file
44
client/admin/brewTable/brewTable.less
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
table.brewTable{
|
||||||
|
th{
|
||||||
|
padding : 10px;
|
||||||
|
background-color : fade(@blue, 20%);
|
||||||
|
font-weight : 800;
|
||||||
|
}
|
||||||
|
tr:nth-child(even){
|
||||||
|
background-color : fade(@green, 10%);
|
||||||
|
}
|
||||||
|
tr.isEmpty{
|
||||||
|
background-color : fade(@red, 30%);
|
||||||
|
}
|
||||||
|
td{
|
||||||
|
min-width : 100px;
|
||||||
|
padding : 10px;
|
||||||
|
text-align : center;
|
||||||
|
|
||||||
|
/*
|
||||||
|
&.preview{
|
||||||
|
position : relative;
|
||||||
|
&:hover{
|
||||||
|
.content{
|
||||||
|
display : block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.content{
|
||||||
|
position : absolute;
|
||||||
|
display : none;
|
||||||
|
top : 100%;
|
||||||
|
left : 0px;
|
||||||
|
z-index : 1000;
|
||||||
|
max-height : 500px;
|
||||||
|
width : 300px;
|
||||||
|
padding : 30px;
|
||||||
|
background-color : white;
|
||||||
|
font-family : monospace;
|
||||||
|
text-align : left;
|
||||||
|
pointer-events : none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,17 +1,52 @@
|
|||||||
|
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
const cx = require('classnames');
|
const cx = require('classnames');
|
||||||
|
|
||||||
|
const request = require('superagent');
|
||||||
|
const BrewTable = require('../brewTable/brewTable.jsx');
|
||||||
|
|
||||||
|
|
||||||
const InvalidBrew = React.createClass({
|
const InvalidBrew = React.createClass({
|
||||||
getDefaultProps: function() {
|
getDefaultProps: function() {
|
||||||
return {
|
return {
|
||||||
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
getInitialState: function() {
|
||||||
|
return {
|
||||||
|
brews: []
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getInvalid : function(){
|
||||||
|
request.get(`/admin/invalid`)
|
||||||
|
.query({ admin_key : this.props.adminKey })
|
||||||
|
.end((err, res) => {
|
||||||
|
this.setState({
|
||||||
|
brews : res.body
|
||||||
|
});
|
||||||
|
})
|
||||||
|
},
|
||||||
|
removeInvalid : function(){
|
||||||
|
if(!this.state.brews.length) return;
|
||||||
|
if(!confirm(`Are you sure you want to remove ${this.state.brews.length} brews`)) return;
|
||||||
|
if(!confirm('Sure you are sure?')) return;
|
||||||
|
|
||||||
|
request.delete(`/admin/invalid`)
|
||||||
|
.query({ admin_key : this.props.adminKey })
|
||||||
|
.end((err, res) => {
|
||||||
|
console.log(err, res.body);
|
||||||
|
alert('Invalid brews removed!');
|
||||||
|
this.getInvalid();
|
||||||
|
})
|
||||||
|
},
|
||||||
render: function(){
|
render: function(){
|
||||||
return <div className='invalidBrew'>
|
return <div className='invalidBrew'>
|
||||||
InvalidBrew Component Ready.
|
<h1>Remove Invalid Brews</h1>
|
||||||
|
This will removes all brews older than 3 days and shorter than a tweet.
|
||||||
|
<button className='get' onClick={this.getInvalid}> Get Invalid Brews</button>
|
||||||
|
<button className='remove' onClick={this.removeInvalid}> Remove invalid Brews</button>
|
||||||
|
|
||||||
|
<BrewTable brews={this.state.brews} />
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,10 +3,21 @@ const router = require('express').Router();
|
|||||||
const vitreumRender = require('vitreum/steps/render');
|
const vitreumRender = require('vitreum/steps/render');
|
||||||
const templateFn = require('../client/template.js');
|
const templateFn = require('../client/template.js');
|
||||||
const config = require('nconf');
|
const config = require('nconf');
|
||||||
|
const Moment = require('moment');
|
||||||
|
|
||||||
const mw = require('./middleware.js');
|
const mw = require('./middleware.js');
|
||||||
const BrewData = require('./brew.data.js');
|
const BrewData = require('./brew.data.js');
|
||||||
|
|
||||||
|
|
||||||
|
const getInvalidBrewQuery = ()=>{
|
||||||
|
return BrewData.model.find({
|
||||||
|
'$where' : "this.text.length < 140",
|
||||||
|
createdAt: {
|
||||||
|
$lt: Moment().subtract(3, 'days').toDate()
|
||||||
|
}
|
||||||
|
}).select({ text : false });
|
||||||
|
}
|
||||||
|
|
||||||
router.get('/admin', mw.adminLogin, (req, res, next) => {
|
router.get('/admin', mw.adminLogin, (req, res, next) => {
|
||||||
return vitreumRender('admin', templateFn, {
|
return vitreumRender('admin', templateFn, {
|
||||||
url : req.originalUrl,
|
url : req.originalUrl,
|
||||||
@@ -19,12 +30,17 @@ router.get('/admin', mw.adminLogin, (req, res, next) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//Removes all empty brews that are older than 3 days and that are shorter than a tweet
|
//Removes all empty brews that are older than 3 days and that are shorter than a tweet
|
||||||
|
router.get('/admin/invalid', mw.adminOnly, (req, res, next)=>{
|
||||||
|
getInvalidBrewQuery().exec()
|
||||||
|
.then((brews) => {
|
||||||
|
return res.json(brews);
|
||||||
|
})
|
||||||
|
.catch(next);
|
||||||
|
});
|
||||||
router.delete('/admin/invalid', mw.adminOnly, (req, res, next)=>{
|
router.delete('/admin/invalid', mw.adminOnly, (req, res, next)=>{
|
||||||
BrewData.removeInvalid(!!req.query.do_it)
|
getInvalidBrewQuery().remove()
|
||||||
.then((removedCount) => {
|
.then(()=>{
|
||||||
return res.join({
|
return res.status(200).send();
|
||||||
count : removedCount
|
|
||||||
});
|
|
||||||
})
|
})
|
||||||
.catch(next);
|
.catch(next);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -30,15 +30,12 @@ router.post('/api/brew', (req, res, next)=>{
|
|||||||
|
|
||||||
//Update
|
//Update
|
||||||
router.put('/api/brew/:editId', mw.loadBrew, (req, res, next)=>{
|
router.put('/api/brew/:editId', mw.loadBrew, (req, res, next)=>{
|
||||||
console.log(req.account);
|
|
||||||
const brew = req.body || {};
|
const brew = req.body || {};
|
||||||
if(req.account){
|
if(req.account){
|
||||||
brew.authors = _.uniq(_.concat(brew.authors, req.account.username));
|
brew.authors = _.uniq(_.concat(brew.authors, req.account.username));
|
||||||
}
|
}
|
||||||
console.log(brew);
|
|
||||||
BrewData.update(req.params.editId, brew)
|
BrewData.update(req.params.editId, brew)
|
||||||
.then((brew) => {
|
.then((brew) => {
|
||||||
console.log(brew.toJSON());
|
|
||||||
return res.json(brew.toJSON());
|
return res.json(brew.toJSON());
|
||||||
})
|
})
|
||||||
.catch(next);
|
.catch(next);
|
||||||
|
|||||||
@@ -93,21 +93,6 @@ const BrewData = {
|
|||||||
return BrewData.get({ editId });
|
return BrewData.get({ editId });
|
||||||
},
|
},
|
||||||
|
|
||||||
//Removes all empty brews that are older than 3 days and that are shorter than a tweet
|
|
||||||
removeInvalid : (force = false) => {
|
|
||||||
const invalidBrewQuery = Brew.find({
|
|
||||||
'$where' : "this.text.length < 140",
|
|
||||||
createdAt: {
|
|
||||||
$lt: Moment().subtract(3, 'days').toDate()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if(force) return invalidBrewQuery.remove().exec();
|
|
||||||
return invalidBrewQuery.exec()
|
|
||||||
.then((objs) => {
|
|
||||||
return objs.length;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
search : (query, req={}) => {
|
search : (query, req={}) => {
|
||||||
//defaults with page and count
|
//defaults with page and count
|
||||||
//returns a non-text version of brews
|
//returns a non-text version of brews
|
||||||
|
|||||||
Reference in New Issue
Block a user