diff --git a/changelog.md b/changelog.md index 89b8a1976..452705f00 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,11 @@ h5 { margin-left: 0px; } +.page .taskList { + display:block; + break-inside:auto; +} + .taskList li input { list-style-type : none; margin-left : -0.52cm; @@ -35,15 +40,42 @@ pre { margin-top : 0.1cm; } +.page ul + h5 { + margin-top: 0.25cm; +} + +.page p + h5 { + margin-top: 0.25cm; +} + .page .openSans { font-family: 'Open Sans'; font-size: 0.9em; } + + ``` ## changelog 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 {{taskList @@ -142,12 +174,7 @@ Fixes issues [#2135](https://github.com/naturalcrit/homebrewery/issues/2135) * [x] Fix brew settings being lost on first save Fixes issues [#2427](https://github.com/naturalcrit/homebrewery/issues/2427) -}} -\column - - -{{taskList ##### Gazook: * [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) }} + + +\page + ### Wednesday 31/08/2022 - v3.2.1 {{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) }} -\page - ### Saturday 27/08/2022 - v3.2.0 {{taskList diff --git a/client/homebrew/pages/accountPage/accountPage.jsx b/client/homebrew/pages/accountPage/accountPage.jsx index 644ab13d8..77f246a8b 100644 --- a/client/homebrew/pages/accountPage/accountPage.jsx +++ b/client/homebrew/pages/accountPage/accountPage.jsx @@ -42,7 +42,6 @@ const AccountPage = createClass({ }, renderUiItems : function() { - // console.log(this.props.uiItems); return <>

Account Information

@@ -51,12 +50,16 @@ const AccountPage = createClass({

Homebrewery Information

-

Brews on Homebrewery: {this.props.uiItems.mongoCount || '-'}

+

Brews on Homebrewery: {this.props.uiItems.mongoCount}

Google Information

Linked to Google: {this.props.uiItems.googleId ? 'YES' : 'NO'}

- {this.props.uiItems.googleId ?

Brews on Google Drive: {this.props.uiItems.fileCount || '-'}

: '' } + {this.props.uiItems.googleId && +

+ Brews on Google Drive: {this.props.uiItems.googleCount ?? <>Unable to retrieve files - follow these steps to renew your Google credentials.} +

+ }
; }, diff --git a/package-lock.json b/package-lock.json index 37db3aa82..b2499d137 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "homebrewery", - "version": "3.4.1", + "version": "3.4.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "homebrewery", - "version": "3.4.1", + "version": "3.4.2", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 3838a5b66..a6a25de1e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "homebrewery", "description": "Create authentic looking D&D homebrews using only markdown", - "version": "3.4.1", + "version": "3.4.2", "engines": { "node": "16.11.x" }, diff --git a/server/app.js b/server/app.js index 10ef184cd..b24054187 100644 --- a/server/app.js +++ b/server/app.js @@ -279,7 +279,6 @@ app.get('/edit/:id', asyncHandler(getBrew('edit')), (req, res, next)=>{ title : req.brew.title || 'Untitled Brew', description : req.brew.description || 'No description.', image : req.brew.thumbnail || defaultMetaTags.image, - type : 'article' }; @@ -340,7 +339,7 @@ app.get('/account', asyncHandler(async (req, res, next)=>{ data.title = 'Account Information Page'; let auth; - let files; + let googleCount = []; if(req.account) { if(req.account.googleId) { try { @@ -352,9 +351,9 @@ app.get('/account', asyncHandler(async (req, res, next)=>{ } if(auth.credentials.access_token) { try { - files = await GoogleActions.listGoogleBrews(auth); + googleCount = await GoogleActions.listGoogleBrews(auth); } catch (e) { - files = undefined; + googleCount = undefined; console.log('List Google files failed!'); 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 brews = await HomebrewModel.find(query, 'id') + const mongoCount = await HomebrewModel.countDocuments(query) .catch((err)=>{ + mongoCount = 0; console.log(err); }); data.uiItems = { - username : req.account.username, - issued : req.account.issued, - mongoCount : brews.length, - googleId : Boolean(req.account.googleId), - authCheck : Boolean(req.account.googleId && auth.credentials.access_token), - fileCount : files?.length || '-' + username : req.account.username, + issued : req.account.issued, + googleId : Boolean(req.account.googleId), + authCheck : Boolean(req.account.googleId && auth.credentials.access_token), + mongoCount : mongoCount, + googleCount : googleCount?.length }; } diff --git a/server/googleActions.js b/server/googleActions.js index 3b2c360b3..e5fa9cc89 100644 --- a/server/googleActions.js +++ b/server/googleActions.js @@ -253,7 +253,6 @@ const GoogleActions = { text : file.data, description : obj.data.description, - tags : obj.data.properties.tags ? obj.data.properties.tags : '', systems : obj.data.properties.systems ? obj.data.properties.systems.split(',') : [], authors : [], published : obj.data.properties.published ? obj.data.properties.published == 'true' : false, diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 8d19e915c..abcbfc7de 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -45,7 +45,7 @@ const getId = (req)=>{ return { id, googleId }; }; -const getBrew = (accessType)=>{ +const getBrew = (accessType, stubOnly = false)=>{ // Create middleware with the accessType passed in as part of the scope return async (req, res, next)=>{ // Get relevant IDs for the brew @@ -61,9 +61,12 @@ const getBrew = (accessType)=>{ } }); 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(googleId || stub?.googleId) { + if(!stubOnly && (googleId || stub?.googleId)) { let googleError; const googleBrew = await GoogleActions.getGoogleBrew(googleId || stub?.googleId, id, accessType) .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(!stub) { + if(!stub && !stubOnly) { throw 'Brew not found in Homebrewery database or Google Drive'; } - if(typeof stub.tags === 'string') { + if(typeof stub?.tags === 'string') { stub.tags = []; } @@ -261,23 +264,22 @@ const updateBrew = async (req, res)=>{ 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 - brew = _.assign(await HomebrewModel.findOne({ _id: brew._id }), brew); - - if(!brew.markModified) { - // If it wasn't in the database, create a new db brew - brew = new HomebrewModel(brew); + // define a function to catch our save errors + const saveError = (err)=>{ + console.error(err); + 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); } - - brew.markModified('authors'); - brew.markModified('systems'); - - // Save the database brew - const saved = await brew.save() - .catch((err)=>{ - console.error(err); - res.status(err.status || 500).send(err.message || 'Unable to save brew to Homebrewery database'); - }); if(!saved) return; // Call and wait for afterSave to complete const after = await afterSave(); @@ -353,8 +355,8 @@ const deleteBrew = async (req, res, next)=>{ }; router.post('/api', asyncHandler(newBrew)); -router.put('/api/:id', asyncHandler(getBrew('edit')), asyncHandler(updateBrew)); -router.put('/api/update/:id', asyncHandler(getBrew('edit')), asyncHandler(updateBrew)); +router.put('/api/:id', asyncHandler(getBrew('edit', true)), asyncHandler(updateBrew)); +router.put('/api/update/:id', asyncHandler(getBrew('edit', true)), asyncHandler(updateBrew)); router.delete('/api/:id', asyncHandler(deleteBrew)); router.get('/api/remove/:id', asyncHandler(deleteBrew));