0
0
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:
Scott Tolksdorf
2017-01-10 17:20:33 -05:00
parent 0878439750
commit 728277f861
8 changed files with 159 additions and 28 deletions

View File

@@ -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'>

View File

@@ -4,5 +4,6 @@
input{ input{
height : 33px; height : 33px;
padding : 0px 10px; padding : 0px 10px;
margin-bottom: 20px;
} }
} }

View 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;

View 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;
}
}
*/
}
}

View File

@@ -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>
} }
}); });

View File

@@ -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);
}); });

View File

@@ -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);

View File

@@ -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