0
0
mirror of https://github.com/naturalcrit/homebrewery.git synced 2026-01-15 14:52:39 +00:00

Merge branch 'master' into fixThemesDefault

This commit is contained in:
G.Ambatte
2022-12-14 12:30:28 +13:00
7 changed files with 80 additions and 47 deletions

View File

@@ -7,6 +7,11 @@ h5 {
margin-left: 0px; margin-left: 0px;
} }
.page .taskList {
display:block;
break-inside:auto;
}
.taskList li input { .taskList li input {
list-style-type : none; list-style-type : none;
margin-left : -0.52cm; margin-left : -0.52cm;
@@ -35,15 +40,42 @@ pre {
margin-top : 0.1cm; margin-top : 0.1cm;
} }
.page ul + h5 {
margin-top: 0.25cm;
}
.page p + h5 {
margin-top: 0.25cm;
}
.page .openSans { .page .openSans {
font-family: 'Open Sans'; font-family: 'Open Sans';
font-size: 0.9em; font-size: 0.9em;
} }
``` ```
## changelog ## changelog
For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery). For a full record of development, visit our [Github Page](https://github.com/naturalcrit/homebrewery).
### Saturday 10/12/2022 - v3.4.2
{{taskList
##### Jeddai
* [x] Fix broken tags editor
* [x] Reduce server load to fix some saving issues
Fixes issues [#2322](https://github.com/naturalcrit/homebrewery/issues/2322)
##### G-Ambatte
* [x] Account page help link for Google Drive errors
Fixes issues [#2520](https://github.com/naturalcrit/homebrewery/issues/2520)
}}
### Monday 05/12/2022 - v3.4.1 ### Monday 05/12/2022 - v3.4.1
{{taskList {{taskList
@@ -142,12 +174,7 @@ Fixes issues [#2135](https://github.com/naturalcrit/homebrewery/issues/2135)
* [x] Fix brew settings being lost on first save * [x] Fix brew settings being lost on first save
Fixes issues [#2427](https://github.com/naturalcrit/homebrewery/issues/2427) Fixes issues [#2427](https://github.com/naturalcrit/homebrewery/issues/2427)
}}
\column
{{taskList
##### Gazook: ##### Gazook:
* [x] Several updates to bug reporting and error popups * [x] Several updates to bug reporting and error popups
@@ -197,6 +224,10 @@ Fixes issues [#2317](https://github.com/naturalcrit/homebrewery/issues/2317), [
Fixes issues: [#1797](https://github.com/naturalcrit/homebrewery/issues/1797), [#2315](https://github.com/naturalcrit/homebrewery/issues/2315), [#2326](https://github.com/naturalcrit/homebrewery/issues/2326), [#2328](https://github.com/naturalcrit/homebrewery/issues/2328) Fixes issues: [#1797](https://github.com/naturalcrit/homebrewery/issues/1797), [#2315](https://github.com/naturalcrit/homebrewery/issues/2315), [#2326](https://github.com/naturalcrit/homebrewery/issues/2326), [#2328](https://github.com/naturalcrit/homebrewery/issues/2328)
}} }}
\page
### Wednesday 31/08/2022 - v3.2.1 ### Wednesday 31/08/2022 - v3.2.1
{{taskList {{taskList
@@ -223,8 +254,6 @@ Fixes issues [#2317](https://github.com/naturalcrit/homebrewery/issues/2317), [
Fixes issues: [#2301](https://github.com/naturalcrit/homebrewery/issues/2301), [#2303](https://github.com/naturalcrit/homebrewery/issues/2303), [#2121](https://github.com/naturalcrit/homebrewery/issues/2121) Fixes issues: [#2301](https://github.com/naturalcrit/homebrewery/issues/2301), [#2303](https://github.com/naturalcrit/homebrewery/issues/2303), [#2121](https://github.com/naturalcrit/homebrewery/issues/2121)
}} }}
\page
### Saturday 27/08/2022 - v3.2.0 ### Saturday 27/08/2022 - v3.2.0
{{taskList {{taskList

View File

@@ -42,7 +42,6 @@ const AccountPage = createClass({
}, },
renderUiItems : function() { renderUiItems : function() {
// console.log(this.props.uiItems);
return <> return <>
<div className='dataGroup'> <div className='dataGroup'>
<h1>Account Information <i className='fas fa-user'></i></h1> <h1>Account Information <i className='fas fa-user'></i></h1>
@@ -51,12 +50,16 @@ const AccountPage = createClass({
</div> </div>
<div className='dataGroup'> <div className='dataGroup'>
<h3>Homebrewery Information <NaturalCritIcon /></h3> <h3>Homebrewery Information <NaturalCritIcon /></h3>
<p><strong>Brews on Homebrewery: </strong> {this.props.uiItems.mongoCount || '-'}</p> <p><strong>Brews on Homebrewery: </strong> {this.props.uiItems.mongoCount}</p>
</div> </div>
<div className='dataGroup'> <div className='dataGroup'>
<h3>Google Information <i className='fab fa-google-drive'></i></h3> <h3>Google Information <i className='fab fa-google-drive'></i></h3>
<p><strong>Linked to Google: </strong> {this.props.uiItems.googleId ? 'YES' : 'NO'}</p> <p><strong>Linked to Google: </strong> {this.props.uiItems.googleId ? 'YES' : 'NO'}</p>
{this.props.uiItems.googleId ? <p><strong>Brews on Google Drive: </strong> {this.props.uiItems.fileCount || '-'}</p> : '' } {this.props.uiItems.googleId &&
<p>
<strong>Brews on Google Drive: </strong> {this.props.uiItems.googleCount ?? <>Unable to retrieve files - <a href='https://github.com/naturalcrit/homebrewery/discussions/1580'>follow these steps to renew your Google credentials.</a></>}
</p>
}
</div> </div>
</>; </>;
}, },

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "homebrewery", "name": "homebrewery",
"version": "3.4.1", "version": "3.4.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "homebrewery", "name": "homebrewery",
"version": "3.4.1", "version": "3.4.2",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {

View File

@@ -1,7 +1,7 @@
{ {
"name": "homebrewery", "name": "homebrewery",
"description": "Create authentic looking D&D homebrews using only markdown", "description": "Create authentic looking D&D homebrews using only markdown",
"version": "3.4.1", "version": "3.4.2",
"engines": { "engines": {
"node": "16.11.x" "node": "16.11.x"
}, },

View File

@@ -279,7 +279,6 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), (req, res, next)=>{
title : req.brew.title || 'Untitled Brew', title : req.brew.title || 'Untitled Brew',
description : req.brew.description || 'No description.', description : req.brew.description || 'No description.',
image : req.brew.thumbnail || defaultMetaTags.image, image : req.brew.thumbnail || defaultMetaTags.image,
type : 'article' type : 'article'
}; };
@@ -340,7 +339,7 @@ app.get('/account', asyncHandler(async (req, res, next)=>{
data.title = 'Account Information Page'; data.title = 'Account Information Page';
let auth; let auth;
let files; let googleCount = [];
if(req.account) { if(req.account) {
if(req.account.googleId) { if(req.account.googleId) {
try { try {
@@ -352,9 +351,9 @@ app.get('/account', asyncHandler(async (req, res, next)=>{
} }
if(auth.credentials.access_token) { if(auth.credentials.access_token) {
try { try {
files = await GoogleActions.listGoogleBrews(auth); googleCount = await GoogleActions.listGoogleBrews(auth);
} catch (e) { } catch (e) {
files = undefined; googleCount = undefined;
console.log('List Google files failed!'); console.log('List Google files failed!');
console.log(e); console.log(e);
} }
@@ -362,18 +361,19 @@ app.get('/account', asyncHandler(async (req, res, next)=>{
} }
const query = { authors: req.account.username, googleId: { $exists: false } }; const query = { authors: req.account.username, googleId: { $exists: false } };
const brews = await HomebrewModel.find(query, 'id') const mongoCount = await HomebrewModel.countDocuments(query)
.catch((err)=>{ .catch((err)=>{
mongoCount = 0;
console.log(err); console.log(err);
}); });
data.uiItems = { data.uiItems = {
username : req.account.username, username : req.account.username,
issued : req.account.issued, issued : req.account.issued,
mongoCount : brews.length,
googleId : Boolean(req.account.googleId), googleId : Boolean(req.account.googleId),
authCheck : Boolean(req.account.googleId && auth.credentials.access_token), authCheck : Boolean(req.account.googleId && auth.credentials.access_token),
fileCount : files?.length || '-' mongoCount : mongoCount,
googleCount : googleCount?.length
}; };
} }

View File

@@ -253,7 +253,6 @@ const GoogleActions = {
text : file.data, text : file.data,
description : obj.data.description, description : obj.data.description,
tags : obj.data.properties.tags ? obj.data.properties.tags : '',
systems : obj.data.properties.systems ? obj.data.properties.systems.split(',') : [], systems : obj.data.properties.systems ? obj.data.properties.systems.split(',') : [],
authors : [], authors : [],
published : obj.data.properties.published ? obj.data.properties.published == 'true' : false, published : obj.data.properties.published ? obj.data.properties.published == 'true' : false,

View File

@@ -45,7 +45,7 @@ const getId = (req)=>{
return { id, googleId }; return { id, googleId };
}; };
const getBrew = (accessType)=>{ const getBrew = (accessType, stubOnly = false)=>{
// Create middleware with the accessType passed in as part of the scope // Create middleware with the accessType passed in as part of the scope
return async (req, res, next)=>{ return async (req, res, next)=>{
// Get relevant IDs for the brew // Get relevant IDs for the brew
@@ -61,9 +61,12 @@ const getBrew = (accessType)=>{
} }
}); });
stub = stub?.toObject(); stub = stub?.toObject();
if(accessType === 'edit' && stub?.authors?.length > 0 && !stub?.authors.includes(req.account?.username)) {
throw 'Current logged in user does not have access to this brew.';
}
// If there is a google id, try to find the google brew // If there is a google id, try to find the google brew
if(googleId || stub?.googleId) { if(!stubOnly && (googleId || stub?.googleId)) {
let googleError; let googleError;
const googleBrew = await GoogleActions.getGoogleBrew(googleId || stub?.googleId, id, accessType) const googleBrew = await GoogleActions.getGoogleBrew(googleId || stub?.googleId, id, accessType)
.catch((err)=>{ .catch((err)=>{
@@ -77,11 +80,11 @@ const getBrew = (accessType)=>{
} }
// If after all of that we still don't have a brew, throw an exception // If after all of that we still don't have a brew, throw an exception
if(!stub) { if(!stub && !stubOnly) {
throw 'Brew not found in Homebrewery database or Google Drive'; throw 'Brew not found in Homebrewery database or Google Drive';
} }
if(typeof stub.tags === 'string') { if(typeof stub?.tags === 'string') {
stub.tags = []; stub.tags = [];
} }
@@ -261,23 +264,22 @@ const updateBrew = async (req, res)=>{
brew.authors = _.uniq(_.concat(brew.authors, req.account.username)); brew.authors = _.uniq(_.concat(brew.authors, req.account.username));
} }
// Fetch the brew from the database again (if it existed there to begin with), and assign the existing brew to it // define a function to catch our save errors
brew = _.assign(await HomebrewModel.findOne({ _id: brew._id }), brew); const saveError = (err)=>{
if(!brew.markModified) {
// If it wasn't in the database, create a new db brew
brew = new HomebrewModel(brew);
}
brew.markModified('authors');
brew.markModified('systems');
// Save the database brew
const saved = await brew.save()
.catch((err)=>{
console.error(err); console.error(err);
res.status(err.status || 500).send(err.message || 'Unable to save brew to Homebrewery database'); res.status(err.status || 500).send(err.message || 'Unable to save brew to Homebrewery database');
}); };
let saved;
if(!brew._id) {
// if the brew does not have a stub id, create and save it, then write the new value back to the brew.
saved = await new HomebrewModel(brew).save().catch(saveError);
brew = saved?.toObject();
} else {
// if the brew does have a stub id, update it using the stub id as the key.
brew = _.assign(await HomebrewModel.findOne({ _id: brew._id }), brew);
saved = await brew.save()
.catch(saveError);
}
if(!saved) return; if(!saved) return;
// Call and wait for afterSave to complete // Call and wait for afterSave to complete
const after = await afterSave(); const after = await afterSave();
@@ -353,8 +355,8 @@ const deleteBrew = async (req, res, next)=>{
}; };
router.post('/api', asyncHandler(newBrew)); router.post('/api', asyncHandler(newBrew));
router.put('/api/:id', asyncHandler(getBrew('edit')), asyncHandler(updateBrew)); router.put('/api/:id', asyncHandler(getBrew('edit', true)), asyncHandler(updateBrew));
router.put('/api/update/:id', asyncHandler(getBrew('edit')), asyncHandler(updateBrew)); router.put('/api/update/:id', asyncHandler(getBrew('edit', true)), asyncHandler(updateBrew));
router.delete('/api/:id', asyncHandler(deleteBrew)); router.delete('/api/:id', asyncHandler(deleteBrew));
router.get('/api/remove/:id', asyncHandler(deleteBrew)); router.get('/api/remove/:id', asyncHandler(deleteBrew));