diff --git a/server/homebrew.api.js b/server/homebrew.api.js index 6bcd293b0..37fded14b 100644 --- a/server/homebrew.api.js +++ b/server/homebrew.api.js @@ -2,7 +2,6 @@ import _ from 'lodash'; import { model as HomebrewModel } from './homebrew.model.js'; import express from 'express'; -import zlib from 'zlib'; import GoogleActions from './googleActions.js'; import { hbfm } from 'marked-hbfm'; import * as yaml from 'js-yaml'; @@ -268,13 +267,8 @@ const api = { if(!googleId) return; newHomebrew = api.excludeStubProps(newHomebrew); newHomebrew.googleId = googleId; - } else { - // Compress brew text to binary before saving - newHomebrew.textBin = zlib.deflateRawSync(newHomebrew.text); - // Delete the non-binary text field since it's not needed anymore - newHomebrew.text = undefined; } - + saved = await newHomebrew.save() .catch((err)=>{ console.error(err, err.toString(), err.stack); @@ -374,12 +368,13 @@ const api = { if(failedPatchCount){ throw (`Patch failure: ${failedPatchCount}/${result[1].length} did not apply`); } - if(decodeURI(result[0]) != brewFromClient.text){ + patchedText = decodeURI(result[0]); + if(patchedText != brewFromClient.text){ + debugTextMismatch(brewFromClient.text, patchedText, `edit/${brewFromClient.editId}`); throw ('Patches did not apply cleanly, text mismatch detected'); } // brew.text = applyPatches(patches, brewFromServer.text)[0]; } catch (err) { - debugTextMismatch(brewFromClient.text, brewFromServer.text, `edit/${brewFromClient.editId}`); console.error('Failed to apply patches:', { // patches : brewFromClient.patches, // result : result, @@ -423,11 +418,6 @@ const api = { if(brew.googleId) { // If google id exists after above actions, Mongo will store only a stub; exclude non-stub properties from update brew = api.excludeStubProps(brew); - } else { - // Compress brew text to binary before saving - brew.textBin = zlib.deflateRawSync(brew.text); - // Delete the non-binary text field since it's not needed anymore - brew.text = undefined; } if(brew._id) // if the brew has a stub id, fetch and merge into Mongo stub document @@ -504,8 +494,6 @@ const api = { if(shouldDeleteGoogleBrew) { // When there are still authors remaining, we delete the google brew but store the full brew in the Homebrewery database brew.googleId = undefined; - brew.textBin = zlib.deflateRawSync(brew.text); - brew.text = undefined; } brew.markModified('authors'); //Mongo will not properly update arrays without markModified() await brew.save() diff --git a/server/homebrew.api.spec.js b/server/homebrew.api.spec.js index 8bda5407b..68aeec616 100644 --- a/server/homebrew.api.spec.js +++ b/server/homebrew.api.spec.js @@ -700,8 +700,16 @@ brew`); shareId : expect.any(String), style : undefined, tags : [], - text : undefined, - textBin : expect.objectContaining({}), + text : '```metadata\n' + + 'title: asdf\n' + + 'bleedSize: {}\n' + + 'safetySpace: {}\n' + + 'trimSize: {}\n' + + '\n' + + '```\n' + + '\n' + + 'asdf', + textBin : undefined, theme : '5ePHB', thumbnail : '', title : 'asdf', @@ -1233,8 +1241,7 @@ brew`); expect(saveFunc).toHaveBeenCalled(); expect(saved.authors).toEqual(['test2']); expect(saved.googleId).toEqual(undefined); - expect(saved.text).toEqual(undefined); - expect(saved.textBin).not.toEqual(undefined); + expect(saved.text).not.toEqual(undefined); }); it('should retain google brew and update stub when multiple authors and extra author requests deletion', async ()=>{ diff --git a/server/homebrew.model.js b/server/homebrew.model.js index e923ac928..b78ece631 100644 --- a/server/homebrew.model.js +++ b/server/homebrew.model.js @@ -32,6 +32,13 @@ const HomebrewSchema = mongoose.Schema({ lock : { type: Object, index: true } }, { versionKey: false }); +HomebrewSchema.pre('save', ()=>{ + if(!this.googleId) { + this.textBin = zlib.deflateRawSync(this.text); + this.text = undefined; + } +}); + HomebrewSchema.statics.increaseView = async function(query) { const brew = await Homebrew.findOne(query).exec(); brew.lastViewed = new Date(); @@ -51,6 +58,7 @@ HomebrewSchema.statics.get = async function(query, fields=null){ if(!_.isNil(brew.textBin)) { // Uncompress zipped text field const unzipped = zlib.inflateRawSync(brew.textBin); brew.text = unzipped.toString(); + brew.textBin = undefined; } return brew; };