diff --git a/client/homebrew/pages/newPage/newPage.jsx b/client/homebrew/pages/newPage/newPage.jsx
index a126d1325..cb8378bdd 100644
--- a/client/homebrew/pages/newPage/newPage.jsx
+++ b/client/homebrew/pages/newPage/newPage.jsx
@@ -157,45 +157,24 @@ const NewPage = createClass({
const index = brew.text.indexOf('```\n\n');
brew.style = `${brew.style ? `${brew.style}\n` : ''}${brew.text.slice(7, index - 1)}`;
brew.text = brew.text.slice(index + 5);
- };
+ }
brew.pageCount=((brew.renderer=='legacy' ? brew.text.match(/\\page/g) : brew.text.match(/^\\page$/gm)) || []).length + 1;
- if(this.state.saveGoogle) {
- const res = await request
- .post('/api/newGoogle/')
+ const res = await request
+ .post(`/api${this.state.saveGoogle ? '?transferToGoogle=true' : ''}`)
.send(brew)
.catch((err)=>{
- console.log(err.status === 401
- ? 'Not signed in!'
- : 'Error Creating New Google Brew!');
+ console.log(err);
this.setState({ isSaving: false, errors: err });
- return;
});
+ if(!res) return;
- brew = res.body;
- localStorage.removeItem(BREWKEY);
- localStorage.removeItem(STYLEKEY);
- localStorage.removeItem(METAKEY);
- window.location = `/edit/${brew.googleId}${brew.editId}`;
- } else {
- request.post('/api')
- .send(brew)
- .end((err, res)=>{
- if(err){
- this.setState({
- isSaving : false
- });
- return;
- }
- window.onbeforeunload = function(){};
- brew = res.body;
- localStorage.removeItem(BREWKEY);
- localStorage.removeItem(STYLEKEY);
- localStorage.removeItem(METAKEY);
- window.location = `/edit/${brew.editId}`;
- });
- }
+ brew = res.body;
+ localStorage.removeItem(BREWKEY);
+ localStorage.removeItem(STYLEKEY);
+ localStorage.removeItem(METAKEY);
+ window.location = `/edit/${brew.googleId ?? ''}${brew.editId}`;
},
renderSaveButton : function(){
@@ -208,26 +187,26 @@ const NewPage = createClass({
console.log(errMsg);
} catch (e){}
- if(this.state.errors.status == '401'){
- return
;
+ // }
- if(this.state.errors.response.req.url.match(/^\/api\/.*Google.*$/m)){
+ if(this.state.errors.response.req.url.match(/^\/api.*Google.*$/m)){
return
Oops!
diff --git a/client/homebrew/pages/userPage/userPage.jsx b/client/homebrew/pages/userPage/userPage.jsx
index a78ba11af..6c3af7907 100644
--- a/client/homebrew/pages/userPage/userPage.jsx
+++ b/client/homebrew/pages/userPage/userPage.jsx
@@ -19,6 +19,7 @@ const UserPage = createClass({
return {
username : '',
brews : [],
+ query : ''
};
},
getInitialState : function() {
@@ -62,7 +63,7 @@ const UserPage = createClass({
},
render : function(){
- return ;
+ return ;
}
});
diff --git a/client/homebrew/thumbnail.png b/client/homebrew/thumbnail.png
new file mode 100644
index 000000000..38b6d9699
Binary files /dev/null and b/client/homebrew/thumbnail.png differ
diff --git a/client/template.js b/client/template.js
index e2e0893e3..d7ef107fa 100644
--- a/client/template.js
+++ b/client/template.js
@@ -1,4 +1,6 @@
module.exports = async(name, title = '', props = {})=>{
+ const HOMEBREWERY_PUBLIC_URL=props.publicUrl;
+
return `
@@ -7,6 +9,13 @@ module.exports = async(name, title = '', props = {})=>{
+
+
+
+
+
+
+
${title.length ? `${title} - The Homebrewery`: 'The Homebrewery - NaturalCrit'}
diff --git a/config/default.json b/config/default.json
index f630b5b0f..70c90593e 100644
--- a/config/default.json
+++ b/config/default.json
@@ -4,5 +4,6 @@
"secret" : "secret",
"web_port" : 8000,
"enable_v3" : true,
- "local_environments" : ["docker", "local"]
+ "local_environments" : ["docker", "local"],
+ "publicUrl" : "https://homebrewery.naturalcrit.com"
}
diff --git a/package-lock.json b/package-lock.json
index 172e352e2..802ac42c1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,19 +1,19 @@
{
"name": "homebrewery",
- "version": "3.0.7",
+ "version": "3.0.8",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "version": "3.0.7",
+ "version": "3.0.8",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.17.8",
+ "@babel/core": "^7.17.9",
"@babel/plugin-transform-runtime": "^7.17.0",
"@babel/preset-env": "^7.16.11",
"@babel/preset-react": "^7.16.7",
- "body-parser": "^1.19.2",
+ "body-parser": "^1.20.0",
"classnames": "^2.3.1",
"codemirror": "^5.65.2",
"cookie-parser": "^1.4.6",
@@ -23,18 +23,18 @@
"express-async-handler": "^1.2.0",
"express-static-gzip": "2.1.5",
"fs-extra": "10.0.1",
- "googleapis": "98.0.0",
+ "googleapis": "100.0.0",
"js-yaml": "^4.1.0",
"jwt-simple": "^0.5.6",
"less": "^3.13.1",
"lodash": "^4.17.21",
- "marked": "4.0.12",
+ "marked": "4.0.14",
"marked-extended-tables": "^1.0.3",
"markedLegacy": "npm:marked@^0.3.19",
- "moment": "^2.29.1",
- "mongoose": "^6.2.8",
- "nanoid": "3.3.1",
- "nconf": "^0.11.3",
+ "moment": "^2.29.2",
+ "mongoose": "^6.2.10",
+ "nanoid": "3.3.2",
+ "nconf": "^0.11.4",
"query-string": "7.1.1",
"react": "^16.14.0",
"react-dom": "^16.14.0",
@@ -45,7 +45,7 @@
"vitreum": "git+https://git@github.com/calculuschild/vitreum.git"
},
"devDependencies": {
- "eslint": "^8.11.0",
+ "eslint": "^8.13.0",
"eslint-plugin-react": "^7.29.4",
"jest": "^27.5.1",
"supertest": "^6.2.2"
@@ -85,24 +85,24 @@
}
},
"node_modules/@babel/core": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz",
- "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz",
+ "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==",
"dependencies": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7",
- "@babel/generator": "^7.17.7",
+ "@babel/generator": "^7.17.9",
"@babel/helper-compilation-targets": "^7.17.7",
"@babel/helper-module-transforms": "^7.17.7",
- "@babel/helpers": "^7.17.8",
- "@babel/parser": "^7.17.8",
+ "@babel/helpers": "^7.17.9",
+ "@babel/parser": "^7.17.9",
"@babel/template": "^7.16.7",
- "@babel/traverse": "^7.17.3",
+ "@babel/traverse": "^7.17.9",
"@babel/types": "^7.17.0",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.1.2",
+ "json5": "^2.2.1",
"semver": "^6.3.0"
},
"engines": {
@@ -151,9 +151,9 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.17.7",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz",
- "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz",
+ "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==",
"dependencies": {
"@babel/types": "^7.17.0",
"jsesc": "^2.5.1",
@@ -324,24 +324,12 @@
}
},
"node_modules/@babel/helper-function-name": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
- "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
+ "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
"dependencies": {
- "@babel/helper-get-function-arity": "^7.16.7",
"@babel/template": "^7.16.7",
- "@babel/types": "^7.16.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-get-function-arity": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
- "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
- "dependencies": {
- "@babel/types": "^7.16.7"
+ "@babel/types": "^7.17.0"
},
"engines": {
"node": ">=6.9.0"
@@ -509,12 +497,12 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz",
- "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz",
+ "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==",
"dependencies": {
"@babel/template": "^7.16.7",
- "@babel/traverse": "^7.17.3",
+ "@babel/traverse": "^7.17.9",
"@babel/types": "^7.17.0"
},
"engines": {
@@ -564,9 +552,9 @@
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"node_modules/@babel/parser": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz",
- "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz",
+ "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==",
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -1779,17 +1767,17 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.17.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
- "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz",
+ "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==",
"dependencies": {
"@babel/code-frame": "^7.16.7",
- "@babel/generator": "^7.17.3",
+ "@babel/generator": "^7.17.9",
"@babel/helper-environment-visitor": "^7.16.7",
- "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-function-name": "^7.17.9",
"@babel/helper-hoist-variables": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7",
- "@babel/parser": "^7.17.3",
+ "@babel/parser": "^7.17.9",
"@babel/types": "^7.17.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
@@ -2781,9 +2769,9 @@
}
},
"node_modules/ansi-align/node_modules/ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"engines": {
"node": ">=6"
}
@@ -3322,21 +3310,94 @@
"integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
},
"node_modules/body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
+ "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.8.1",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
"iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.9.7",
- "raw-body": "2.4.3",
- "type-is": "~1.6.18"
+ "on-finished": "2.4.1",
+ "qs": "6.10.3",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
},
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/body-parser/node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/body-parser/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"engines": {
"node": ">= 0.8"
}
@@ -4959,9 +5020,9 @@
}
},
"node_modules/eslint": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz",
- "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz",
+ "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==",
"dev": true,
"dependencies": {
"@eslint/eslintrc": "^1.2.1",
@@ -5542,6 +5603,26 @@
"serve-static": "^1.14.1"
}
},
+ "node_modules/express/node_modules/body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.8.1",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.9.7",
+ "raw-body": "2.4.3",
+ "type-is": "~1.6.18"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/express/node_modules/cookie": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
@@ -5550,6 +5631,20 @@
"node": ">= 0.6"
}
},
+ "node_modules/express/node_modules/raw-body": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
+ "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "1.8.1",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/express/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -6056,9 +6151,9 @@
}
},
"node_modules/googleapis": {
- "version": "98.0.0",
- "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-98.0.0.tgz",
- "integrity": "sha512-gJS+JF03FXouOpHN7dqxg5wrNCBef3ExBtYdCJoX4wlURuy6pixg7SC8sNAjFIXphMZWQ1Bbcu9aKxNv2xCbuQ==",
+ "version": "100.0.0",
+ "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-100.0.0.tgz",
+ "integrity": "sha512-RToFQGY54B756IDbjdyjb1vWFmn03bYpXHB2lIf0eq2UBYsIbYOLZ0kqSomfJnpclEukwEmMF7Jn6Wsev871ew==",
"dependencies": {
"google-auth-library": "^7.0.2",
"googleapis-common": "^5.0.2"
@@ -8595,12 +8690,9 @@
"dev": true
},
"node_modules/json5": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
- "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
- "dependencies": {
- "minimist": "^1.2.5"
- },
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
"bin": {
"json5": "lib/cli.js"
},
@@ -8689,9 +8781,9 @@
}
},
"node_modules/kareem": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.4.tgz",
- "integrity": "sha512-Vcrt8lcpVl0s8ePx634BxwRqmFo+5DcOhlmNadehxreMTIQi/9hOL/B3hZQQbK5DgMS7Lem3xABXV7/S3jy+7g=="
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz",
+ "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg=="
},
"node_modules/keyv": {
"version": "3.1.0",
@@ -8939,9 +9031,9 @@
}
},
"node_modules/marked": {
- "version": "4.0.12",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
- "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==",
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz",
+ "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ==",
"bin": {
"marked": "bin/marked.js"
},
@@ -9219,9 +9311,9 @@
}
},
"node_modules/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
"node_modules/mixin-deep": {
"version": "1.3.2",
@@ -9278,9 +9370,9 @@
}
},
"node_modules/moment": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
- "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
+ "version": "2.29.2",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
+ "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==",
"engines": {
"node": "*"
}
@@ -9312,12 +9404,12 @@
}
},
"node_modules/mongoose": {
- "version": "6.2.8",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.2.8.tgz",
- "integrity": "sha512-Wq6HG0sOJEQHp5YqMlxrnf93vBFwdY2zlAwqI97EPPSt69kiVV21pTv4cDanrCNWi4upG8ajQ/p9jpDjcECjkQ==",
+ "version": "6.2.10",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.2.10.tgz",
+ "integrity": "sha512-Yp+6UH5M0AlxAVGdC2/Deq0St+2qW73oKCnhJDr83bOZ12eflTLTT5uQF0p6KzvtFj86XWbq/7ApvO4yW6h1sA==",
"dependencies": {
"bson": "^4.2.2",
- "kareem": "2.3.4",
+ "kareem": "2.3.5",
"mongodb": "4.3.1",
"mpath": "0.8.4",
"mquery": "4.0.2",
@@ -9389,9 +9481,9 @@
"optional": true
},
"node_modules/nanoid": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
- "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz",
+ "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA==",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
@@ -9433,9 +9525,9 @@
"dev": true
},
"node_modules/nconf": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.3.tgz",
- "integrity": "sha512-iYsAuDS9pzjVMGIzJrGE0Vk3Eh8r/suJanRAnWGBd29rVS2XtSgzcAo5l6asV3e4hH2idVONHirg1efoBOslBg==",
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.4.tgz",
+ "integrity": "sha512-YaDR846q11JnG1vTrhJ0QIlhiGY6+W1bgWtReG9SS3vkTl3AoNwFvUItdhG6/ZjGCfWpUVuRTNEBTDAQ3nWhGw==",
"dependencies": {
"async": "^1.4.0",
"ini": "^2.0.0",
@@ -9698,7 +9790,6 @@
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
- "dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -10381,12 +10472,12 @@
}
},
"node_modules/raw-body": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
- "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"dependencies": {
"bytes": "3.1.2",
- "http-errors": "1.8.1",
+ "http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
@@ -10394,6 +10485,42 @@
"node": ">= 0.8"
}
},
+ "node_modules/raw-body/node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/raw-body/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
@@ -11032,7 +11159,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
@@ -13120,24 +13246,24 @@
"integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ=="
},
"@babel/core": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz",
- "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz",
+ "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==",
"requires": {
"@ampproject/remapping": "^2.1.0",
"@babel/code-frame": "^7.16.7",
- "@babel/generator": "^7.17.7",
+ "@babel/generator": "^7.17.9",
"@babel/helper-compilation-targets": "^7.17.7",
"@babel/helper-module-transforms": "^7.17.7",
- "@babel/helpers": "^7.17.8",
- "@babel/parser": "^7.17.8",
+ "@babel/helpers": "^7.17.9",
+ "@babel/parser": "^7.17.9",
"@babel/template": "^7.16.7",
- "@babel/traverse": "^7.17.3",
+ "@babel/traverse": "^7.17.9",
"@babel/types": "^7.17.0",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.1.2",
+ "json5": "^2.2.1",
"semver": "^6.3.0"
},
"dependencies": {
@@ -13170,9 +13296,9 @@
}
},
"@babel/generator": {
- "version": "7.17.7",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz",
- "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz",
+ "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==",
"requires": {
"@babel/types": "^7.17.0",
"jsesc": "^2.5.1",
@@ -13296,21 +13422,12 @@
}
},
"@babel/helper-function-name": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
- "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
+ "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
"requires": {
- "@babel/helper-get-function-arity": "^7.16.7",
"@babel/template": "^7.16.7",
- "@babel/types": "^7.16.7"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.16.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
- "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
- "requires": {
- "@babel/types": "^7.16.7"
+ "@babel/types": "^7.17.0"
}
},
"@babel/helper-hoist-variables": {
@@ -13433,12 +13550,12 @@
}
},
"@babel/helpers": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz",
- "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz",
+ "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==",
"requires": {
"@babel/template": "^7.16.7",
- "@babel/traverse": "^7.17.3",
+ "@babel/traverse": "^7.17.9",
"@babel/types": "^7.17.0"
}
},
@@ -13478,9 +13595,9 @@
}
},
"@babel/parser": {
- "version": "7.17.8",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz",
- "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ=="
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz",
+ "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg=="
},
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.16.7",
@@ -14275,17 +14392,17 @@
}
},
"@babel/traverse": {
- "version": "7.17.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
- "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
+ "version": "7.17.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz",
+ "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==",
"requires": {
"@babel/code-frame": "^7.16.7",
- "@babel/generator": "^7.17.3",
+ "@babel/generator": "^7.17.9",
"@babel/helper-environment-visitor": "^7.16.7",
- "@babel/helper-function-name": "^7.16.7",
+ "@babel/helper-function-name": "^7.17.9",
"@babel/helper-hoist-variables": "^7.16.7",
"@babel/helper-split-export-declaration": "^7.16.7",
- "@babel/parser": "^7.17.3",
+ "@babel/parser": "^7.17.9",
"@babel/types": "^7.17.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
@@ -15091,9 +15208,9 @@
},
"dependencies": {
"ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="
},
"emoji-regex": {
"version": "7.0.3",
@@ -15516,20 +15633,72 @@
"integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
},
"body-parser": {
- "version": "1.19.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
- "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
+ "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
"requires": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.8.1",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
"iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.9.7",
- "raw-body": "2.4.3",
- "type-is": "~1.6.18"
+ "on-finished": "2.4.1",
+ "qs": "6.10.3",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "qs": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
+ "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
+ }
}
},
"boxen": {
@@ -16859,9 +17028,9 @@
}
},
"eslint": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz",
- "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==",
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.13.0.tgz",
+ "integrity": "sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ==",
"dev": true,
"requires": {
"@eslint/eslintrc": "^1.2.1",
@@ -17292,11 +17461,39 @@
"vary": "~1.1.2"
},
"dependencies": {
+ "body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
+ "requires": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.8.1",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.9.7",
+ "raw-body": "2.4.3",
+ "type-is": "~1.6.18"
+ }
+ },
"cookie": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
"integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
},
+ "raw-body": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
+ "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
+ "requires": {
+ "bytes": "3.1.2",
+ "http-errors": "1.8.1",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -17690,9 +17887,9 @@
}
},
"googleapis": {
- "version": "98.0.0",
- "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-98.0.0.tgz",
- "integrity": "sha512-gJS+JF03FXouOpHN7dqxg5wrNCBef3ExBtYdCJoX4wlURuy6pixg7SC8sNAjFIXphMZWQ1Bbcu9aKxNv2xCbuQ==",
+ "version": "100.0.0",
+ "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-100.0.0.tgz",
+ "integrity": "sha512-RToFQGY54B756IDbjdyjb1vWFmn03bYpXHB2lIf0eq2UBYsIbYOLZ0kqSomfJnpclEukwEmMF7Jn6Wsev871ew==",
"requires": {
"google-auth-library": "^7.0.2",
"googleapis-common": "^5.0.2"
@@ -19599,12 +19796,9 @@
"dev": true
},
"json5": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
- "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
- "requires": {
- "minimist": "^1.2.5"
- }
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
+ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
},
"jsonfile": {
"version": "6.1.0",
@@ -19669,9 +19863,9 @@
"integrity": "sha512-40aUybvhH9t2h71ncA1/1SbtTNCVZHgsTsTgqPUxGWDmUDrXyDf2wMNQKEbdBjbf4AI+fQhbECNTV6lWxQKUzg=="
},
"kareem": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.4.tgz",
- "integrity": "sha512-Vcrt8lcpVl0s8ePx634BxwRqmFo+5DcOhlmNadehxreMTIQi/9hOL/B3hZQQbK5DgMS7Lem3xABXV7/S3jy+7g=="
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz",
+ "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg=="
},
"keyv": {
"version": "3.1.0",
@@ -19864,9 +20058,9 @@
}
},
"marked": {
- "version": "4.0.12",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
- "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ=="
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.14.tgz",
+ "integrity": "sha512-HL5sSPE/LP6U9qKgngIIPTthuxC0jrfxpYMZ3LdGDD3vTnLs59m2Z7r6+LNDR3ToqEQdkKd6YaaEfJhodJmijQ=="
},
"marked-extended-tables": {
"version": "1.0.3",
@@ -20082,9 +20276,9 @@
}
},
"minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
"mixin-deep": {
"version": "1.3.2",
@@ -20134,9 +20328,9 @@
}
},
"moment": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
- "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
+ "version": "2.29.2",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
+ "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg=="
},
"mongodb": {
"version": "4.3.1",
@@ -20160,12 +20354,12 @@
}
},
"mongoose": {
- "version": "6.2.8",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.2.8.tgz",
- "integrity": "sha512-Wq6HG0sOJEQHp5YqMlxrnf93vBFwdY2zlAwqI97EPPSt69kiVV21pTv4cDanrCNWi4upG8ajQ/p9jpDjcECjkQ==",
+ "version": "6.2.10",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.2.10.tgz",
+ "integrity": "sha512-Yp+6UH5M0AlxAVGdC2/Deq0St+2qW73oKCnhJDr83bOZ12eflTLTT5uQF0p6KzvtFj86XWbq/7ApvO4yW6h1sA==",
"requires": {
"bson": "^4.2.2",
- "kareem": "2.3.4",
+ "kareem": "2.3.5",
"mongodb": "4.3.1",
"mpath": "0.8.4",
"mquery": "4.0.2",
@@ -20220,9 +20414,9 @@
"optional": true
},
"nanoid": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
- "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.2.tgz",
+ "integrity": "sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA=="
},
"nanomatch": {
"version": "1.2.13",
@@ -20255,9 +20449,9 @@
"dev": true
},
"nconf": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.3.tgz",
- "integrity": "sha512-iYsAuDS9pzjVMGIzJrGE0Vk3Eh8r/suJanRAnWGBd29rVS2XtSgzcAo5l6asV3e4hH2idVONHirg1efoBOslBg==",
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.4.tgz",
+ "integrity": "sha512-YaDR846q11JnG1vTrhJ0QIlhiGY6+W1bgWtReG9SS3vkTl3AoNwFvUItdhG6/ZjGCfWpUVuRTNEBTDAQ3nWhGw==",
"requires": {
"async": "^1.4.0",
"ini": "^2.0.0",
@@ -20456,8 +20650,7 @@
"object-inspect": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
- "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
- "dev": true
+ "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
},
"object-keys": {
"version": "1.1.1",
@@ -20983,14 +21176,43 @@
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
},
"raw-body": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
- "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
"requires": {
"bytes": "3.1.2",
- "http-errors": "1.8.1",
+ "http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
+ }
}
},
"rc": {
@@ -21524,7 +21746,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dev": true,
"requires": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
diff --git a/package.json b/package.json
index 2f95cea2a..504ef46b4 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.0.7",
+ "version": "3.0.8",
"engines": {
"node": "16.11.x"
},
@@ -51,11 +51,11 @@
]
},
"dependencies": {
- "@babel/core": "^7.17.8",
+ "@babel/core": "^7.17.9",
"@babel/plugin-transform-runtime": "^7.17.0",
"@babel/preset-env": "^7.16.11",
"@babel/preset-react": "^7.16.7",
- "body-parser": "^1.19.2",
+ "body-parser": "^1.20.0",
"classnames": "^2.3.1",
"codemirror": "^5.65.2",
"cookie-parser": "^1.4.6",
@@ -65,18 +65,18 @@
"express-async-handler": "^1.2.0",
"express-static-gzip": "2.1.5",
"fs-extra": "10.0.1",
- "googleapis": "98.0.0",
+ "googleapis": "100.0.0",
"js-yaml": "^4.1.0",
"jwt-simple": "^0.5.6",
"less": "^3.13.1",
"lodash": "^4.17.21",
- "marked": "4.0.12",
+ "marked": "4.0.14",
"marked-extended-tables": "^1.0.3",
"markedLegacy": "npm:marked@^0.3.19",
- "moment": "^2.29.1",
- "mongoose": "^6.2.8",
- "nanoid": "3.3.1",
- "nconf": "^0.11.3",
+ "moment": "^2.29.2",
+ "mongoose": "^6.2.10",
+ "nanoid": "3.3.2",
+ "nconf": "^0.11.4",
"query-string": "7.1.1",
"react": "^16.14.0",
"react-dom": "^16.14.0",
@@ -87,7 +87,7 @@
"vitreum": "git+https://git@github.com/calculuschild/vitreum.git"
},
"devDependencies": {
- "eslint": "^8.11.0",
+ "eslint": "^8.13.0",
"eslint-plugin-react": "^7.29.4",
"jest": "^27.5.1",
"supertest": "^6.2.2"
diff --git a/server/app.js b/server/app.js
index 746eed449..ae63cd029 100644
--- a/server/app.js
+++ b/server/app.js
@@ -291,6 +291,7 @@ app.use((req, res)=>{
};
const props = {
version : require('./../package.json').version,
+ publicUrl : config.get('publicUrl') ?? '',
url : req.originalUrl,
brew : req.brew,
brews : req.brews,
diff --git a/server/googleActions.js b/server/googleActions.js
index 6184b2aa6..89691e0d8 100644
--- a/server/googleActions.js
+++ b/server/googleActions.js
@@ -126,7 +126,8 @@ const GoogleActions = {
views : parseInt(file.properties.views),
tags : '',
published : file.properties.published ? file.properties.published == 'true' : false,
- systems : []
+ systems : [],
+ thumbnail : file.properties.thumbnail
};
});
return brews;
@@ -147,7 +148,8 @@ const GoogleActions = {
renderer : brew.renderer,
tags : brew.tags,
pageCount : brew.pageCount,
- systems : brew.systems.join()
+ systems : brew.systems.join(),
+ thumbnail : brew.thumbnail
}
},
media : {
@@ -180,12 +182,13 @@ const GoogleActions = {
'description' : `${brew.description}`,
'parents' : [folderId],
'properties' : { //AppProperties is not accessible
- 'shareId' : nanoid(12),
- 'editId' : nanoid(12),
+ 'shareId' : brew.shareId || nanoid(12),
+ 'editId' : brew.editId || nanoid(12),
'title' : brew.title,
'views' : '0',
'pageCount' : brew.pageCount,
- 'renderer' : brew.renderer || 'legacy'
+ 'renderer' : brew.renderer || 'legacy',
+ 'thumbnail' : brew.thumbnail || ''
}
};
@@ -286,6 +289,7 @@ const GoogleActions = {
views : parseInt(obj.data.properties.views) || 0, //brews with no view parameter will return undefined
version : parseInt(obj.data.properties.version) || 0,
renderer : obj.data.properties.renderer ? obj.data.properties.renderer : 'legacy',
+ thumbnail : obj.data.properties.thumbnail || '',
gDrive : true,
googleId : id
diff --git a/server/homebrew.api.js b/server/homebrew.api.js
index 747c2360c..4415c948b 100644
--- a/server/homebrew.api.js
+++ b/server/homebrew.api.js
@@ -5,6 +5,7 @@ const zlib = require('zlib');
const GoogleActions = require('./googleActions.js');
const Markdown = require('../shared/naturalcrit/markdown.js');
const yaml = require('js-yaml');
+const asyncHandler = require('express-async-handler');
// const getTopBrews = (cb) => {
// HomebrewModel.find().sort({ views: -1 }).limit(5).exec(function(err, brews) {
@@ -41,154 +42,195 @@ const excludePropsFromUpdate = (brew)=>{
const propsToExclude = ['views', 'lastViewed'];
for (const prop of propsToExclude) {
delete brew[prop];
- };
+ }
return brew;
};
-const newBrew = (req, res)=>{
- const brew = req.body;
-
+const beforeNewSave = (account, brew)=>{
if(!brew.title) {
brew.title = getGoodBrewTitle(brew.text);
}
- brew.authors = (req.account) ? [req.account.username] : [];
+ brew.authors = (account) ? [account.username] : [];
brew.text = mergeBrewText(brew);
+};
- delete brew.editId;
- delete brew.shareId;
- delete brew.googleId;
-
+const newLocalBrew = async (brew)=>{
const newHomebrew = new HomebrewModel(brew);
// 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;
- newHomebrew.save((err, obj)=>{
- if(err) {
- console.error(err, err.toString(), err.stack);
- return res.status(500).send(`Error while creating new brew, ${err.toString()}`);
- }
-
- obj = obj.toObject();
- obj.gDrive = false;
- return res.status(200).send(obj);
- });
-};
-
-const updateBrew = (req, res)=>{
- HomebrewModel.get({ editId: req.params.id })
- .then((brew)=>{
- const updateBrew = excludePropsFromUpdate(req.body);
- brew = _.merge(brew, updateBrew);
- brew.text = mergeBrewText(brew);
-
- // 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;
- brew.updatedAt = new Date();
-
- if(req.account) {
- brew.authors = _.uniq(_.concat(brew.authors, req.account.username));
- }
-
- brew.markModified('authors');
- brew.markModified('systems');
-
- brew.save((err, obj)=>{
- if(err) throw err;
- return res.status(200).send(obj);
- });
- })
+ let saved = await newHomebrew.save()
.catch((err)=>{
- console.error(err);
- return res.status(500).send('Error while saving');
+ console.error(err, err.toString(), err.stack);
+ throw `Error while creating new brew, ${err.toString()}`;
});
+
+ saved = saved.toObject();
+ saved.gDrive = false;
+ return saved;
};
-const deleteBrew = (req, res)=>{
- HomebrewModel.find({ editId: req.params.id }, (err, objs)=>{
- if(!objs.length || err) {
- return res.status(404).send('Can not find homebrew with that id');
- }
+const newGoogleBrew = async (account, brew, res)=>{
+ const oAuth2Client = GoogleActions.authCheck(account, res);
- const brew = objs[0];
-
- if(req.account) {
- // Remove current user as author
- brew.authors = _.pull(brew.authors, req.account.username);
- brew.markModified('authors');
- }
-
- if(brew.authors.length === 0) {
- // Delete brew if there are no authors left
- brew.remove((err)=>{
- if(err) return res.status(500).send('Error while removing');
- return res.status(200).send();
- });
- } else {
- // Otherwise, save the brew with updated author list
- brew.save((err, savedBrew)=>{
- if(err) throw err;
- return res.status(200).send(savedBrew);
- });
- }
- });
+ return await GoogleActions.newGoogleBrew(oAuth2Client, brew);
};
-const newGoogleBrew = async (req, res, next)=>{
- let oAuth2Client;
-
- try { oAuth2Client = GoogleActions.authCheck(req.account, res); } catch (err) { return res.status(err.status).send(err.message); }
-
+const newBrew = async (req, res)=>{
const brew = req.body;
-
- if(!brew.title) {
- brew.title = getGoodBrewTitle(brew.text);
- }
-
- brew.authors = (req.account) ? [req.account.username] : [];
- brew.text = mergeBrewText(brew);
+ const { transferToGoogle } = req.query;
delete brew.editId;
delete brew.shareId;
delete brew.googleId;
- req.body = brew;
+ beforeNewSave(req.account, brew);
- try {
- const newBrew = await GoogleActions.newGoogleBrew(oAuth2Client, brew);
- return res.status(200).send(newBrew);
- } catch (err) {
- return res.status(err.response.status).send(err);
+ let saved;
+ if(transferToGoogle) {
+ saved = await newGoogleBrew(req.account, brew, res)
+ .catch((err)=>{
+ res.status(err.status || err.response.status).send(err.message || err);
+ });
+ } else {
+ saved = await newLocalBrew(brew)
+ .catch((err)=>{
+ res.status(500).send(err);
+ });
+ }
+ if(!saved) return;
+ return res.status(200).send(saved);
+};
+
+const updateBrew = async (req, res)=>{
+ let brew = excludePropsFromUpdate(req.body);
+ const { transferToGoogle, transferFromGoogle } = req.query;
+
+ let saved;
+ if(brew.googleId && transferFromGoogle) {
+ beforeNewSave(req.account, brew);
+
+ saved = await newLocalBrew(brew)
+ .catch((err)=>{
+ console.error(err);
+ res.status(500).send(err);
+ });
+ if(!saved) return;
+
+ await deleteGoogleBrew(req.account, `${brew.googleId}${brew.editId}`, res)
+ .catch((err)=>{
+ console.error(err);
+ res.status(err.status || err.response.status).send(err.message || err);
+ });
+ } else if(!brew.googleId && transferToGoogle) {
+ saved = await newGoogleBrew(req.account, brew, res)
+ .catch((err)=>{
+ console.error(err);
+ res.status(err.status || err.response.status).send(err.message || err);
+ });
+ if(!saved) return;
+
+ await deleteLocalBrew(req.account, brew.editId)
+ .catch((err)=>{
+ console.error(err);
+ res.status(err.status).send(err.message);
+ });
+ } else if(brew.googleId) {
+ brew.text = mergeBrewText(brew);
+
+ saved = await GoogleActions.updateGoogleBrew(brew)
+ .catch((err)=>{
+ console.error(err);
+ res.status(err.response?.status || 500).send(err);
+ });
+ } else {
+ const dbBrew = await HomebrewModel.get({ editId: req.params.id })
+ .catch((err)=>{
+ console.error(err);
+ return res.status(500).send('Error while saving');
+ });
+
+ brew = _.merge(dbBrew, brew);
+ brew.text = mergeBrewText(brew);
+
+ // 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;
+ brew.updatedAt = new Date();
+
+ if(req.account) {
+ brew.authors = _.uniq(_.concat(brew.authors, req.account.username));
+ }
+
+ brew.markModified('authors');
+ brew.markModified('systems');
+
+ saved = await brew.save();
+ }
+ if(!saved) return;
+
+ if(!res.headersSent) return res.status(200).send(saved);
+};
+
+const deleteBrew = async (req, res)=>{
+ if(req.params.id.length > 12) {
+ const deleted = await deleteGoogleBrew(req.account, req.params.id, res)
+ .catch((err)=>{
+ res.status(500).send(err);
+ });
+ if(deleted) return res.status(200).send();
+ } else {
+ const deleted = await deleteLocalBrew(req.account, req.params.id)
+ .catch((err)=>{
+ res.status(err.status).send(err.message);
+ });
+ if(deleted) return res.status(200).send(deleted);
+ return res.status(200).send();
}
};
-const updateGoogleBrew = async (req, res, next)=>{
- const brew = excludePropsFromUpdate(req.body);
- brew.text = mergeBrewText(brew);
+const deleteLocalBrew = async (account, id)=>{
+ const brew = await HomebrewModel.findOne({ editId: id });
+ if(!brew) {
+ throw { status: 404, message: 'Can not find homebrew with that id' };
+ }
- try {
- const updatedBrew = await GoogleActions.updateGoogleBrew(brew);
- return res.status(200).send(updatedBrew);
- } catch (err) {
- return res.status(err.response?.status || 500).send(err);
+ if(account) {
+ // Remove current user as author
+ brew.authors = _.pull(brew.authors, account.username);
+ brew.markModified('authors');
+ }
+
+ if(brew.authors.length === 0) {
+ // Delete brew if there are no authors left
+ await brew.remove()
+ .catch((err)=>{
+ console.error(err);
+ throw { status: 500, message: 'Error while removing' };
+ });
+ } else {
+ // Otherwise, save the brew with updated author list
+ return await brew.save()
+ .catch((err)=>{
+ throw { status: 500, message: err };
+ });
}
};
-router.post('/api', newBrew);
-router.post('/api/newGoogle/', newGoogleBrew);
-router.put('/api/:id', updateBrew);
-router.put('/api/update/:id', updateBrew);
-router.put('/api/updateGoogle/:id', updateGoogleBrew);
-router.delete('/api/:id', deleteBrew);
-router.get('/api/remove/:id', deleteBrew);
-router.get('/api/removeGoogle/:id', async (req, res)=>{
- const auth = await GoogleActions.authCheck(req.account, res);
- await GoogleActions.deleteGoogleBrew(auth, req.params.id);
- return res.status(200).send();
-});
+const deleteGoogleBrew = async (account, id, res)=>{
+ const auth = await GoogleActions.authCheck(account, res);
+ await GoogleActions.deleteGoogleBrew(auth, id);
+ return true;
+};
+
+router.post('/api', asyncHandler(newBrew));
+router.put('/api/:id', asyncHandler(updateBrew));
+router.put('/api/update/:id', asyncHandler(updateBrew));
+router.delete('/api/:id', asyncHandler(deleteBrew));
+router.get('/api/remove/:id', asyncHandler(deleteBrew));
module.exports = router;
diff --git a/server/homebrew.model.js b/server/homebrew.model.js
index acc78a624..be6b2f6cd 100644
--- a/server/homebrew.model.js
+++ b/server/homebrew.model.js
@@ -17,6 +17,7 @@ const HomebrewSchema = mongoose.Schema({
renderer : { type: String, default: '' },
authors : [String],
published : { type: Boolean, default: false },
+ thumbnail : { type: String, default: '' },
createdAt : { type: Date, default: Date.now },
updatedAt : { type: Date, default: Date.now },