diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx index e8c0db03e..873f5d3d2 100644 --- a/client/homebrew/pages/editPage/editPage.jsx +++ b/client/homebrew/pages/editPage/editPage.jsx @@ -21,6 +21,8 @@ const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); const Markdown = require('naturalcrit/markdown.js'); +const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); + const googleDriveActive = require('../../googleDrive.png'); const googleDriveInactive = require('../../googleDriveMono.png'); @@ -30,24 +32,7 @@ const EditPage = createClass({ displayName : 'EditPage', getDefaultProps : function() { return { - brew : { - text : '', - style : '', - shareId : null, - editId : null, - createdAt : null, - updatedAt : null, - gDrive : false, - trashed : false, - - title : '', - description : '', - tags : '', - published : false, - authors : [], - systems : [], - renderer : 'legacy' - } + brew : DEFAULT_BREW_LOAD }; }, diff --git a/client/homebrew/pages/homePage/homePage.jsx b/client/homebrew/pages/homePage/homePage.jsx index f634a9387..7e9d9c3b4 100644 --- a/client/homebrew/pages/homePage/homePage.jsx +++ b/client/homebrew/pages/homePage/homePage.jsx @@ -18,16 +18,14 @@ const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); - +const { DEFAULT_BREW } = require('../../../../server/brewDefaults.js'); const HomePage = createClass({ displayName : 'HomePage', getDefaultProps : function() { return { - brew : { - text : '', - }, - ver : '0.0.0' + brew : DEFAULT_BREW, + ver : '0.0.0' }; }, getInitialState : function() { diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx index 251f169c9..cd197f5fb 100644 --- a/client/homebrew/pages/newPage/newPage.jsx +++ b/client/homebrew/pages/newPage/newPage.jsx @@ -17,6 +17,8 @@ const SplitPane = require('naturalcrit/splitPane/splitPane.jsx'); const Editor = require('../../editor/editor.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); +const { DEFAULT_BREW } = require('../../../../server/brewDefaults.js'); + const BREWKEY = 'homebrewery-new'; const STYLEKEY = 'homebrewery-new-style'; const METAKEY = 'homebrewery-new-meta'; @@ -26,30 +28,12 @@ const NewPage = createClass({ displayName : 'NewPage', getDefaultProps : function() { return { - brew : { - text : '', - style : undefined, - title : '', - description : '', - renderer : 'V3', - theme : '5ePHB' - } + brew : DEFAULT_BREW }; }, getInitialState : function() { - let brew = this.props.brew; - - if(this.props.brew.shareId) { - brew = { - text : brew.text ?? '', - style : brew.style ?? undefined, - title : brew.title ?? '', - description : brew.description ?? '', - renderer : brew.renderer ?? 'legacy', - theme : brew.theme ?? '5ePHB' - }; - } + const brew = this.props.brew; return { brew : brew, @@ -83,7 +67,8 @@ const NewPage = createClass({ } localStorage.setItem(BREWKEY, brew.text); - localStorage.setItem(STYLEKEY, brew.style); + if(brew.style) + localStorage.setItem(STYLEKEY, brew.style); localStorage.setItem(METAKEY, JSON.stringify({ 'renderer': brew.renderer, 'theme': brew.theme })); }, componentWillUnmount : function() { diff --git a/client/homebrew/pages/printPage/printPage.jsx b/client/homebrew/pages/printPage/printPage.jsx index 64ced6072..cff8ebe32 100644 --- a/client/homebrew/pages/printPage/printPage.jsx +++ b/client/homebrew/pages/printPage/printPage.jsx @@ -29,9 +29,10 @@ const PrintPage = createClass({ getInitialState : function() { return { brew : { - text : this.props.brew.text || '', - style : this.props.brew.style || undefined, - renderer : this.props.brew.renderer || 'legacy' + text : this.props.brew.text || '', + style : this.props.brew.style || undefined, + renderer : this.props.brew.renderer || 'legacy', + theme : this.props.brew.theme || '5ePHB' } }; }, @@ -48,7 +49,7 @@ const PrintPage = createClass({ text : brewStorage, style : styleStorage, renderer : metaStorage?.renderer || 'legacy', - theme : metaStorage?.theme || '5ePHB' + theme : metaStorage?.theme || '5ePHB' } }; }); diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx index eb092b11e..232c2a1e3 100644 --- a/client/homebrew/pages/sharePage/sharePage.jsx +++ b/client/homebrew/pages/sharePage/sharePage.jsx @@ -12,21 +12,13 @@ const Account = require('../../navbar/account.navitem.jsx'); const BrewRenderer = require('../../brewRenderer/brewRenderer.jsx'); +const { DEFAULT_BREW_LOAD } = require('../../../../server/brewDefaults.js'); const SharePage = createClass({ displayName : 'SharePage', getDefaultProps : function() { return { - brew : { - title : '', - text : '', - style : '', - shareId : null, - createdAt : null, - updatedAt : null, - views : 0, - renderer : '' - } + brew : DEFAULT_BREW_LOAD }; }, diff --git a/server/app.js b/server/app.js index 8a3e4c12a..de7586209 100644 --- a/server/app.js +++ b/server/app.js @@ -15,6 +15,8 @@ const serveCompressedStaticAssets = require('./static-assets.mv.js'); const sanitizeFilename = require('sanitize-filename'); const asyncHandler = require('express-async-handler'); +const { DEFAULT_BREW } = require('./brewDefaults.js'); + const splitTextStyleAndMetadata = (brew)=>{ brew.text = brew.text.replaceAll('\r\n', '\n'); if(brew.text.startsWith('```metadata')) { @@ -29,7 +31,6 @@ const splitTextStyleAndMetadata = (brew)=>{ brew.style = brew.text.slice(7, index - 1); brew.text = brew.text.slice(index + 5); } - _.defaults(brew, { 'renderer': 'legacy', 'theme': '5ePHB' }); }; const sanitizeBrew = (brew, accessType)=>{ @@ -406,6 +407,7 @@ if(isLocalEnvironment){ //Render the page const templateFn = require('./../client/template.js'); app.use(asyncHandler(async (req, res, next)=>{ + // Create configuration object const configuration = { local : isLocalEnvironment, diff --git a/server/brewDefaults.js b/server/brewDefaults.js new file mode 100644 index 000000000..092f7070a --- /dev/null +++ b/server/brewDefaults.js @@ -0,0 +1,36 @@ +const _ = require('lodash'); + +// Default properties for newly-created brews +const DEFAULT_BREW = { + title : '', + text : '', + style : undefined, + description : '', + editId : undefined, + shareId : undefined, + createdAt : undefined, + updatedAt : undefined, + renderer : 'V3', + theme : '5ePHB', + authors : [], + tags : [], + systems : [], + thumbnail : '', + published : false, + pageCount : 1, + gDrive : false, + trashed : false + +}; +// Default values for older brews with missing properties +// e.g., missing "renderer" is assumed to be "legacy" +const DEFAULT_BREW_LOAD = _.defaults( + { + renderer : 'legacy', + }, + DEFAULT_BREW); + +module.exports = { + DEFAULT_BREW, + DEFAULT_BREW_LOAD +}; diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 20a3369f4..506af9293 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -9,6 +9,8 @@ const yaml = require('js-yaml'); const asyncHandler = require('express-async-handler'); const { nanoid } = require('nanoid'); +const { DEFAULT_BREW, DEFAULT_BREW_LOAD } = require('./brewDefaults.js'); + // const getTopBrews = (cb) => { // HomebrewModel.find().sort({ views: -1 }).limit(5).exec(function(err, brews) { // cb(brews); @@ -71,11 +73,13 @@ If you believe you should have access to this brew, ask the file owner to invite throw 'Brew not found in Homebrewery database or Google Drive'; } - if(typeof stub?.tags === 'string') { - stub.tags = []; - } - req.brew = stub || {}; + // Clean up brew: fill in missing fields with defaults / fix old invalid values + stub.tags = stub.tags || undefined; // Clear empty strings + stub.renderer = stub.renderer || undefined; // Clear empty strings + stub = _.defaults(stub, DEFAULT_BREW_LOAD); // Fill in blank fields + + req.brew = stub; next(); }; }; @@ -138,6 +142,8 @@ const beforeNewSave = (account, brew)=>{ brew.authors = (account) ? [account.username] : []; brew.text = mergeBrewText(brew); + + _.defaults(brew, DEFAULT_BREW); }; const newGoogleBrew = async (account, brew, res)=>{ diff --git a/server/homebrew.model.js b/server/homebrew.model.js index da8853de7..41f3b8716 100644 --- a/server/homebrew.model.js +++ b/server/homebrew.model.js @@ -47,8 +47,6 @@ HomebrewSchema.statics.get = function(query, fields=null){ unzipped = zlib.inflateRawSync(brews[0].textBin); brews[0].text = unzipped.toString(); } - if(!brews[0].renderer) - brews[0].renderer = 'legacy'; return resolve(brews[0]); }); });