From 959382abff923b0bef9d313a6562c12d2effc257 Mon Sep 17 00:00:00 2001 From: Raymonzut <40148684+Raymonzut@users.noreply.github.com> Date: Mon, 11 May 2020 10:07:02 +0200 Subject: [PATCH 1/3] Dedicate folder for posts --- server/posts/.gitignore | 1 + server/posts/.gitkeep | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 server/posts/.gitignore create mode 100644 server/posts/.gitkeep diff --git a/server/posts/.gitignore b/server/posts/.gitignore new file mode 100644 index 0000000..a6c57f5 --- /dev/null +++ b/server/posts/.gitignore @@ -0,0 +1 @@ +*.json diff --git a/server/posts/.gitkeep b/server/posts/.gitkeep new file mode 100644 index 0000000..bb06c9a --- /dev/null +++ b/server/posts/.gitkeep @@ -0,0 +1,6 @@ +All the posts will be in here seperate in JSON format + +post + - title + - date + - content From 30ec01fa9b912b1ccfdc557e85b6906b08b3e4d1 Mon Sep 17 00:00:00 2001 From: Raymonzut <40148684+Raymonzut@users.noreply.github.com> Date: Mon, 11 May 2020 10:21:09 +0200 Subject: [PATCH 2/3] Rewrite posts route to use posts folder - Remove mongodb related code - Implement file based posts --- server/routes/api/posts.js | 60 +++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/server/routes/api/posts.js b/server/routes/api/posts.js index e7939ac..a58a0a6 100644 --- a/server/routes/api/posts.js +++ b/server/routes/api/posts.js @@ -1,43 +1,61 @@ const express = require('express') -const mongodb = require('mongodb') +const fs = require('fs') const router = express.Router() -const DB_NAME = process.env.DB_NAME || 'test' -const URI = process.env.URI || 'mongodb://localhost:27017' +const posts_dir = 'posts/' -async function getPostCollection() { - const client = await mongodb.MongoClient.connect(URI, { - useNewUrlParser: true, - useUnifiedTopology: true, - }) - return client.db(DB_NAME).collection('posts') +if (!fs.existsSync(posts_dir)) throw Error(`Missing ${posts_dir}`) + +let posts = readPosts(); + +setInterval(() => posts = readPosts(), 1000 * 60 * 60) + +function readPostsDelayed() { + return new Promise(setTimeout, 1000).then(posts = readPosts()) +} + +function readPosts() { + console.warn("reading all posts") + const files = fs.readdirSync(posts_dir) + + if (files.length === 0) throw Error(`Could not find posts in ${posts_dir}`) + + return files.filter(file_name => file_name.endsWith('.json')) + .map(file_name => `${posts_dir}${file_name}`) + .map(readJSONAsObject) +} + +function readJSONAsObject(filename) { + return JSON.parse(fs.readFileSync(filename, 'utf8')) +} + +function notFoundResponse(res) { + res.status(404).send('Sorry, can not find that') } router.get('/', async (req, res) => { - const posts = await getPostCollection() if (req.query.sort === '-1' || req.query.sort === '1') { - res.send( - await posts - .find({}) - .sort({ date: parseInt(req.query.sort) }) - .toArray() - ) - return + const posts_sorted = posts.sort((a, b) => { + return new Date(a.date).getTime() - new Date(b.date).getTime() + }) + + if (req.query.sort === '1') res.send(posts_sorted) + else res.send(posts_sorted.reverse()) } - res.send(await posts.find({}).toArray()) }) router.get('/:id', async (req, res) => { const re = /[0-9A-Fa-f]{24}/g if (!re.test(req.params.id)) { - res.status(404).send('Sorry, can not find that') + notFoundResponse(res) return } + const results = posts.filter(post => post._id === req.params.id) - const posts = await getPostCollection() - res.send(await posts.find({ _id: mongodb.ObjectID(req.params.id) }).toArray()) + if (!results.length) notFoundResponse(res) + else res.send(results[0]) }) module.exports = router From 092cca38ec1ab89704dc5a535b0c023f91981e42 Mon Sep 17 00:00:00 2001 From: Raymonzut <40148684+Raymonzut@users.noreply.github.com> Date: Mon, 11 May 2020 14:01:23 +0200 Subject: [PATCH 3/3] Remove mongodb --- server/package-lock.json | 117 --------------------------------------- server/package.json | 3 +- 2 files changed, 1 insertion(+), 119 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 1b5c755..dc6ed52 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -18,15 +18,6 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "bl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", - "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -44,11 +35,6 @@ "type-is": "~1.6.17" } }, - "bson": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", - "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==" - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -77,11 +63,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, "cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -99,11 +80,6 @@ "ms": "2.0.0" } }, - "denque": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -225,22 +201,11 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -269,19 +234,6 @@ "mime-db": "1.43.0" } }, - "mongodb": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.6.tgz", - "integrity": "sha512-sh3q3GLDLT4QmoDLamxtAECwC3RGjq+oNuK1ENV8+tnipIavss6sMYt77hpygqlMOCt0Sla5cl7H4SKCVBCGEg==", - "requires": { - "bl": "^2.2.0", - "bson": "^1.1.4", - "denque": "^1.4.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -315,11 +267,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "proxy-addr": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", @@ -350,34 +297,6 @@ "unpipe": "1.0.0" } }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, - "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -388,20 +307,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -445,28 +350,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", @@ -486,11 +374,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/server/package.json b/server/package.json index 8ccadef..b06551e 100644 --- a/server/package.json +++ b/server/package.json @@ -12,7 +12,6 @@ "license": "ISC", "dependencies": { "cors": "^2.8.5", - "express": "^4.17.1", - "mongodb": "^3.5.6" + "express": "^4.17.1" } }