mirror of
https://github.com/naturalcrit/homebrewery.git
synced 2026-01-26 16:03:14 +00:00
Compare commits
1 Commits
editBasePa
...
crawlGoogl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
698d60e0f2 |
@@ -1,37 +0,0 @@
|
||||
require('./editPage.less');
|
||||
const React = require('react');
|
||||
|
||||
const Nav = require('naturalcrit/nav/nav.jsx');
|
||||
const Navbar = require('../../../navbar/navbar.jsx');
|
||||
const NewBrewItem = require('../../../navbar/newbrew.navitem.jsx');
|
||||
const HelpNavItem = require('../../../navbar/help.navitem.jsx');
|
||||
const PrintNavItem = require('../../../navbar/print.navitem.jsx');
|
||||
const ErrorNavItem = require('../../../navbar/error-navitem.jsx');
|
||||
const AccountNavItem = require('../../../navbar/account.navitem.jsx');
|
||||
const RecentNavItem = require('../../../navbar/recent.navitem.jsx').both;
|
||||
const VaultNavItem = require('../../../navbar/vault.navitem.jsx');
|
||||
|
||||
const BaseEditPage = (props)=>{
|
||||
return (
|
||||
<div className={`sitePage ${props.className || ''}`}>
|
||||
<Navbar>
|
||||
<Nav.section>
|
||||
<Nav.item className='brewTitle'>{props.brew.title}</Nav.item>
|
||||
</Nav.section>
|
||||
<Nav.section>
|
||||
{props.navButtons}
|
||||
<PrintNavItem />
|
||||
<NewBrewItem />
|
||||
<HelpNavItem />
|
||||
<VaultNavItem />
|
||||
<RecentNavItem brew={props.brew} storageKey={props.recentStorageKey} />
|
||||
<AccountNavItem />
|
||||
</Nav.section>
|
||||
</Navbar>
|
||||
|
||||
{props.children}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
module.exports = BaseEditPage;
|
||||
@@ -11,11 +11,17 @@ import request from '../../utils/request-middleware.js';
|
||||
const { Meta } = require('vitreum/headtags');
|
||||
|
||||
const Nav = require('naturalcrit/nav/nav.jsx');
|
||||
const Navbar = require('../../navbar/navbar.jsx');
|
||||
|
||||
const NewBrew = require('../../navbar/newbrew.navitem.jsx');
|
||||
const HelpNavItem = require('../../navbar/help.navitem.jsx');
|
||||
const PrintNavItem = require('../../navbar/print.navitem.jsx');
|
||||
const ErrorNavItem = require('../../navbar/error-navitem.jsx');
|
||||
const Account = require('../../navbar/account.navitem.jsx');
|
||||
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
|
||||
const VaultNavItem = require('../../navbar/vault.navitem.jsx');
|
||||
|
||||
const BaseEditPage = require('../basePages/editPage/editPage.jsx');
|
||||
const SplitPane = require('client/components/splitPane/splitPane.jsx');
|
||||
const SplitPane = require('naturalcrit/splitPane/splitPane.jsx');
|
||||
const Editor = require('../../editor/editor.jsx');
|
||||
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
|
||||
|
||||
@@ -435,7 +441,11 @@ const EditPage = createClass({
|
||||
renderNavbar : function(){
|
||||
const shareLink = this.processShareId();
|
||||
|
||||
return <>
|
||||
return <Navbar>
|
||||
<Nav.section>
|
||||
<Nav.item className='brewTitle'>{this.state.brew.title}</Nav.item>
|
||||
</Nav.section>
|
||||
|
||||
<Nav.section>
|
||||
{this.renderGoogleDriveIcon()}
|
||||
{this.state.error ?
|
||||
@@ -445,6 +455,8 @@ const EditPage = createClass({
|
||||
{this.renderAutoSaveButton()}
|
||||
</Nav.dropdown>
|
||||
}
|
||||
<NewBrew />
|
||||
<HelpNavItem/>
|
||||
<Nav.dropdown>
|
||||
<Nav.item color='teal' icon='fas fa-share-alt'>
|
||||
share
|
||||
@@ -459,19 +471,20 @@ const EditPage = createClass({
|
||||
post to reddit
|
||||
</Nav.item>
|
||||
</Nav.dropdown>
|
||||
<PrintNavItem />
|
||||
<VaultNavItem />
|
||||
<RecentNavItem brew={this.state.brew} storageKey='edit' />
|
||||
<Account />
|
||||
</Nav.section>
|
||||
</>;
|
||||
|
||||
</Navbar>;
|
||||
},
|
||||
|
||||
render : function(){
|
||||
return <BaseEditPage
|
||||
className="editPage"
|
||||
errorState={this.state.error}
|
||||
parent={this}
|
||||
brew={this.state.brew}
|
||||
navButtons={this.renderNavbar()}
|
||||
recentStorageKey='edit'>
|
||||
return <div className='editPage sitePage'>
|
||||
<Meta name='robots' content='noindex, nofollow' />
|
||||
{this.renderNavbar()}
|
||||
|
||||
{this.props.brew.lock && <LockNotification shareId={this.props.brew.shareId} message={this.props.brew.lock.editMessage} reviewRequested={this.props.brew.lock.reviewRequested} />}
|
||||
<div className='content'>
|
||||
<SplitPane onDragFinish={this.handleSplitMove}>
|
||||
@@ -509,7 +522,7 @@ const EditPage = createClass({
|
||||
/>
|
||||
</SplitPane>
|
||||
</div>
|
||||
</BaseEditPage>;
|
||||
</div>;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -6,11 +6,16 @@ import request from '../../utils/request-middleware.js';
|
||||
const { Meta } = require('vitreum/headtags');
|
||||
|
||||
const Nav = require('naturalcrit/nav/nav.jsx');
|
||||
const Navbar = require('../../navbar/navbar.jsx');
|
||||
const NewBrewItem = require('../../navbar/newbrew.navitem.jsx');
|
||||
const HelpNavItem = require('../../navbar/help.navitem.jsx');
|
||||
const VaultNavItem = require('../../navbar/vault.navitem.jsx');
|
||||
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
|
||||
const AccountNavItem = require('../../navbar/account.navitem.jsx');
|
||||
const ErrorNavItem = require('../../navbar/error-navitem.jsx');
|
||||
const { fetchThemeBundle } = require('../../../../shared/helpers.js');
|
||||
|
||||
const BaseEditPage = require('../basePages/editPage/editPage.jsx');
|
||||
const SplitPane = require('client/components/splitPane/splitPane.jsx');
|
||||
const SplitPane = require('naturalcrit/splitPane/splitPane.jsx');
|
||||
const Editor = require('../../editor/editor.jsx');
|
||||
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
|
||||
|
||||
@@ -20,13 +25,13 @@ const HomePage = createClass({
|
||||
displayName : 'HomePage',
|
||||
getDefaultProps : function() {
|
||||
return {
|
||||
brew : DEFAULT_BREW
|
||||
brew : DEFAULT_BREW,
|
||||
ver : '0.0.0'
|
||||
};
|
||||
},
|
||||
getInitialState : function() {
|
||||
return {
|
||||
brew : this.props.brew,
|
||||
isSaving : false,
|
||||
welcomeText : this.props.brew.text,
|
||||
error : undefined,
|
||||
currentEditorViewPageNum : 1,
|
||||
@@ -42,11 +47,7 @@ const HomePage = createClass({
|
||||
fetchThemeBundle(this, this.props.brew.renderer, this.props.brew.theme);
|
||||
},
|
||||
|
||||
save : function(){
|
||||
this.setState({
|
||||
isSaving : true
|
||||
});
|
||||
|
||||
handleSave : function(){
|
||||
request.post('/api')
|
||||
.send(this.state.brew)
|
||||
.end((err, res)=>{
|
||||
@@ -56,9 +57,6 @@ const HomePage = createClass({
|
||||
}
|
||||
const brew = res.body;
|
||||
window.location = `/edit/${brew.editId}`;
|
||||
})
|
||||
.catch((err)=>{
|
||||
this.setState({ isSaving: false, error: err });
|
||||
});
|
||||
},
|
||||
handleSplitMove : function(){
|
||||
@@ -82,38 +80,26 @@ const HomePage = createClass({
|
||||
brew : { ...prevState.brew, text: text },
|
||||
}));
|
||||
},
|
||||
|
||||
renderSaveButton : function(){
|
||||
if(this.state.isSaving){
|
||||
return <Nav.item icon='fas fa-spinner fa-spin' className='save'>
|
||||
save...
|
||||
</Nav.item>;
|
||||
} else {
|
||||
return <Nav.item icon='fas fa-save' className='save' onClick={this.save}>
|
||||
save
|
||||
</Nav.item>;
|
||||
}
|
||||
},
|
||||
|
||||
renderNavbar : function(){
|
||||
return <>
|
||||
return <Navbar ver={this.props.ver}>
|
||||
<Nav.section>
|
||||
{this.state.error ?
|
||||
<ErrorNavItem error={this.state.error} parent={this}></ErrorNavItem> :
|
||||
null
|
||||
}
|
||||
<NewBrewItem />
|
||||
<HelpNavItem />
|
||||
<VaultNavItem />
|
||||
<RecentNavItem />
|
||||
<AccountNavItem />
|
||||
</Nav.section>
|
||||
</>;
|
||||
</Navbar>;
|
||||
},
|
||||
|
||||
render : function(){
|
||||
return <BaseEditPage
|
||||
className="homePage"
|
||||
errorState={this.state.error}
|
||||
parent={this}
|
||||
brew={this.state.brew}
|
||||
navButtons={this.renderNavbar()}>
|
||||
return <div className='homePage sitePage'>
|
||||
<Meta name='google-site-verification' content='NwnAQSSJZzAT7N-p5MY6ydQ7Njm67dtbu73ZSyE5Fy4' />
|
||||
{this.renderNavbar()}
|
||||
<div className='content'>
|
||||
<SplitPane onDragFinish={this.handleSplitMove}>
|
||||
<Editor
|
||||
@@ -141,14 +127,14 @@ const HomePage = createClass({
|
||||
/>
|
||||
</SplitPane>
|
||||
</div>
|
||||
<div className={cx('floatingSaveButton', { show: this.state.welcomeText != this.state.brew.text })} onClick={this.save}>
|
||||
<div className={cx('floatingSaveButton', { show: this.state.welcomeText != this.state.brew.text })} onClick={this.handleSave}>
|
||||
Save current <i className='fas fa-save' />
|
||||
</div>
|
||||
|
||||
<a href='/new' className='floatingNewButton'>
|
||||
Create your own <i className='fas fa-magic' />
|
||||
</a>
|
||||
</BaseEditPage>
|
||||
</div>;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -7,10 +7,14 @@ import request from '../../utils/request-middleware.js';
|
||||
import Markdown from 'naturalcrit/markdown.js';
|
||||
|
||||
const Nav = require('naturalcrit/nav/nav.jsx');
|
||||
const PrintNavItem = require('../../navbar/print.navitem.jsx');
|
||||
const Navbar = require('../../navbar/navbar.jsx');
|
||||
const AccountNavItem = require('../../navbar/account.navitem.jsx');
|
||||
const ErrorNavItem = require('../../navbar/error-navitem.jsx');
|
||||
const RecentNavItem = require('../../navbar/recent.navitem.jsx').both;
|
||||
const HelpNavItem = require('../../navbar/help.navitem.jsx');
|
||||
|
||||
const BaseEditPage = require('../basePages/editPage/editPage.jsx');
|
||||
const SplitPane = require('client/components/splitPane/splitPane.jsx');
|
||||
const SplitPane = require('naturalcrit/splitPane/splitPane.jsx');
|
||||
const Editor = require('../../editor/editor.jsx');
|
||||
const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx');
|
||||
|
||||
@@ -208,23 +212,28 @@ const NewPage = createClass({
|
||||
},
|
||||
|
||||
renderNavbar : function(){
|
||||
return <>
|
||||
return <Navbar>
|
||||
|
||||
<Nav.section>
|
||||
<Nav.item className='brewTitle'>{this.state.brew.title}</Nav.item>
|
||||
</Nav.section>
|
||||
|
||||
<Nav.section>
|
||||
{this.state.error ?
|
||||
<ErrorNavItem error={this.state.error} parent={this}></ErrorNavItem> :
|
||||
this.renderSaveButton()
|
||||
}
|
||||
<PrintNavItem />
|
||||
<HelpNavItem />
|
||||
<RecentNavItem />
|
||||
<AccountNavItem />
|
||||
</Nav.section>
|
||||
</>;
|
||||
</Navbar>;
|
||||
},
|
||||
|
||||
render : function(){
|
||||
return <BaseEditPage
|
||||
className="newPage"
|
||||
errorState={this.state.error}
|
||||
parent={this}
|
||||
brew={this.state.brew}
|
||||
navButtons={this.renderNavbar()}>
|
||||
return <div className='newPage sitePage'>
|
||||
{this.renderNavbar()}
|
||||
<div className='content'>
|
||||
<SplitPane onDragFinish={this.handleSplitMove}>
|
||||
<Editor
|
||||
@@ -259,7 +268,7 @@ const NewPage = createClass({
|
||||
/>
|
||||
</SplitPane>
|
||||
</div>
|
||||
</BaseEditPage>;
|
||||
</div>;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ const Account = require('../../navbar/account.navitem.jsx');
|
||||
const NewBrew = require('../../navbar/newbrew.navitem.jsx');
|
||||
const HelpNavItem = require('../../navbar/help.navitem.jsx');
|
||||
const BrewItem = require('../basePages/listPage/brewItem/brewItem.jsx');
|
||||
const SplitPane = require('client/components/splitPane/splitPane.jsx');
|
||||
const SplitPane = require('../../../../shared/naturalcrit/splitPane/splitPane.jsx');
|
||||
const ErrorIndex = require('../errorPage/errors/errorIndex.js');
|
||||
|
||||
import request from '../../utils/request-middleware.js';
|
||||
|
||||
1101
package-lock.json
generated
1101
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -142,13 +142,13 @@
|
||||
"eslint-plugin-jest": "^29.0.1",
|
||||
"eslint-plugin-react": "^7.37.5",
|
||||
"globals": "^16.3.0",
|
||||
"jest": "^30.0.5",
|
||||
"jest": "^30.0.4",
|
||||
"jest-expect-message": "^1.1.3",
|
||||
"jsdom-global": "^3.0.2",
|
||||
"postcss-less": "^6.0.0",
|
||||
"stylelint": "^16.22.0",
|
||||
"stylelint": "^16.21.1",
|
||||
"stylelint-config-recess-order": "^7.1.0",
|
||||
"stylelint-config-recommended": "^16.0.0",
|
||||
"supertest": "^7.1.4"
|
||||
"supertest": "^7.1.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ fs.emptyDirSync('./build');
|
||||
livereload('./build'); // Install the Chrome extension LiveReload to automatically refresh the browser
|
||||
watchFile('./server.js', { // Restart server when change detected to this file or any nested directory from here
|
||||
ignore : ['./build', './client', './themes'], // Ignore folders that are not running server code / avoids unneeded restarts
|
||||
ext : 'js json' // Extensions to watch (only .js/.json by default)
|
||||
ext : 'js' // Extensions to watch (only .js/.json by default)
|
||||
//watch : ['./server', './themes'], // Watch additional folders if needed
|
||||
});
|
||||
}
|
||||
|
||||
103
server/app.js
103
server/app.js
@@ -147,6 +147,109 @@ app.get('/', (req, res, next)=>{
|
||||
return next();
|
||||
});
|
||||
|
||||
app.get('/analyze', async (req, res, next) => {
|
||||
const accounts = JSON.parse(fs.readFileSync('accounts.json', 'utf8'));
|
||||
|
||||
let totalBrewsStubbed = accounts.reduce((sum, account) => {
|
||||
if (account.brewsStubbed) {
|
||||
return sum + account.brewsStubbed;
|
||||
}
|
||||
return sum;
|
||||
}, 0);
|
||||
|
||||
let totalAccountsProcessed = accounts.filter(account => account.fullyProcessed).length;
|
||||
let totalAccountsWithInvalidCredentials = accounts.filter(account => account.invalidCredentials).length;
|
||||
|
||||
console.log(`Total Brews Stubbed: ${totalBrewsStubbed}`);
|
||||
console.log(`Total Accounts Processed: ${totalAccountsProcessed}`);
|
||||
console.log(`Total Accounts with Invalid Credentials: ${totalAccountsWithInvalidCredentials}`);
|
||||
});
|
||||
|
||||
app.get('/destroy', async (req, res, next) => {
|
||||
const accounts = JSON.parse(fs.readFileSync('accounts.json', 'utf8'));
|
||||
let updated = false;
|
||||
|
||||
function sleep(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
for (let i = 40000; i < accounts.length; i++) {
|
||||
if (accounts[i].fullyProcessed || accounts[i].invalidCredentials) continue;
|
||||
|
||||
const originalAccount = { ...accounts[i] };
|
||||
const account = accounts[i];
|
||||
|
||||
console.log(`Processing account: ${account.username}`);
|
||||
|
||||
let googleBrews;
|
||||
let auth;
|
||||
try {
|
||||
auth = await GoogleActions.authCheck(account, res);
|
||||
googleBrews = await GoogleActions.listGoogleBrews(auth);
|
||||
} catch (err) {
|
||||
console.error(`Auth error for ${account.username}`);
|
||||
accounts[i] = { ...originalAccount, invalidCredentials: true };
|
||||
updated = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!auth) {
|
||||
accounts[i] = { ...originalAccount, missingAuth: true };
|
||||
updated = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
console.log('Google Brews:', googleBrews.length);
|
||||
if (googleBrews.length === 0) {
|
||||
accounts[i] = { ...originalAccount, fullyProcessed: true, brewsStubbed: 0 };
|
||||
updated = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
const fields = ['googleId', 'title', 'editId', 'shareId'];
|
||||
let brews = await HomebrewModel.getByUser(account.username, true, fields).catch(err => console.error(err));
|
||||
const stubbedEditIds = new Set(brews.map(b => b.editId));
|
||||
googleBrews = googleBrews.filter(b => !stubbedEditIds.has(b.editId));
|
||||
console.log('Unstubbed Google Brews:', googleBrews.length);
|
||||
|
||||
const results = await Promise.all(
|
||||
googleBrews.map(async (brew) => {
|
||||
let brewFromServer = await GoogleActions.getGoogleBrew(auth, brew.googleId, brew.editId, 'edit');
|
||||
splitTextStyleAndMetadata(brewFromServer);
|
||||
brewFromServer.authors = [account.username];
|
||||
api.excludeStubProps(brewFromServer);
|
||||
console.log(`Trying to Stub: ${brewFromServer.title} (${brewFromServer.shareId})`);
|
||||
let saved = await new HomebrewModel(brewFromServer).save().catch(err => console.error(err));
|
||||
if (saved) {
|
||||
console.log(`Saved Stub: ${saved.title} (${saved.shareId})`);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
})
|
||||
);
|
||||
|
||||
const stubCount = results.filter(Boolean).length;
|
||||
console.log('Brews stubbed:', stubCount);
|
||||
|
||||
accounts[i] = {
|
||||
...originalAccount,
|
||||
brewsStubbed: stubCount,
|
||||
fullyProcessed: stubCount === googleBrews.length
|
||||
};
|
||||
|
||||
updated = true;
|
||||
|
||||
sleep(1000);
|
||||
}
|
||||
|
||||
if (updated) {
|
||||
fs.writeFileSync('accounts.json', JSON.stringify(accounts, null, 2), 'utf8');
|
||||
console.log('accounts.json updated');
|
||||
}
|
||||
|
||||
res.send('One account processed');
|
||||
});
|
||||
|
||||
//Home page Legacy
|
||||
app.get('/legacy', (req, res, next)=>{
|
||||
req.brew = {
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
import Mongoose from 'mongoose';
|
||||
|
||||
const getMongoDBURL = (config)=>{
|
||||
return config.get('mongodb_uri') ||
|
||||
console.log('mongodb uri', config.get('MONGODB_URI'));
|
||||
return config.get('MONGODB_URI') ||
|
||||
config.get('mongolab_uri') ||
|
||||
'mongodb://127.0.0.1/homebrewery'; // changed from mongodb://localhost/homebrewery to accommodate versions 16+ of node.
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user