From 20ec2747ae3da4ccea56c139f6bc8e6c7ef74976 Mon Sep 17 00:00:00 2001 From: jleveau Date: Mon, 12 Oct 2020 16:09:41 +0200 Subject: [PATCH] mongo reposityory --- js/inMemoryWorkshop.js | 9 +++- js/index.js | 98 ++++++++++++++++++---------------- js/mongoWorkshop.js | 89 +++++++++++++++++++++++++++++++ package-lock.json | 117 +++++++++++++++++++++++++++++++++++++++++ package.json | 4 +- 5 files changed, 268 insertions(+), 49 deletions(-) create mode 100644 js/mongoWorkshop.js diff --git a/js/inMemoryWorkshop.js b/js/inMemoryWorkshop.js index e0ecb80..4a9c5e4 100644 --- a/js/inMemoryWorkshop.js +++ b/js/inMemoryWorkshop.js @@ -1,5 +1,9 @@ -inMemoryWorkshop = [] +let inMemoryWorkshop; +function init() { + inMemoryWorkshop = []; + return Promise.resolve(); +} function getWorkshopList() { return new Promise((resolve, ) => { @@ -38,13 +42,14 @@ function removeWorkshopByName(name) { }) } -function updateWorkshop(name) { +function updateWorkshop(name, description) { return new Promise((resolve, reject) => { reject(new Error("Not implemented")) }) } module.exports = { + init, getWorkshopList, getWorkshopByName, addWorkshop, diff --git a/js/index.js b/js/index.js index 7feae67..21e7c3d 100644 --- a/js/index.js +++ b/js/index.js @@ -1,64 +1,70 @@ const express = require('express') const app = express() -const InMemoryWorkshop = require("./inMemoryWorkshop") const path = require("path") const ejs = require('ejs') var bodyParser = require('body-parser') +const repository = require('./inMemoryWorkshop'); +//const repository = require("./mongoWorkshop"); -app.use(bodyParser.urlencoded({ extended: false })) +repository.init().then(() => { -// set the view engine to ejs -app.set('view engine', 'ejs'); -app.set('views', path.join(__dirname, '..', '/ejs')); -app.use(express.static(path.join(__dirname , '..', 'css'))); + app.use(bodyParser.urlencoded({ extended: false })) - -app.get('/', function (req, res) { - InMemoryWorkshop.getWorkshopList() - .then(workshops => { - res.render("index", { - workshops: workshops - }) - }) -}) - -app.get('/workshop', function (req, res) { - console.log("get") - res.render('workshop') -}) - -app.post('/workshop', function (req, res) { - const name = req.body.name - const description = req.body.description - InMemoryWorkshop.addWorkshop(name, description).then(() => { - InMemoryWorkshop.getWorkshopList() + // set the view engine to ejs + app.set('view engine', 'ejs'); + app.set('views', path.join(__dirname, '..', '/ejs')); + app.use(express.static(path.join(__dirname , '..', 'css'))); + + + app.get('/', function (req, res) { + repository.getWorkshopList() .then(workshops => { res.render("index", { workshops: workshops }) }) }) - .catch(e =>res.send(e.message)) -}) - -app.get('/workshop/:name', function (req, res) { - const workshopName = req.params.name - InMemoryWorkshop.getWorkshopByName(workshopName) - .then(workshop => { - res.render('ejs/workshop', workshop) + + app.get('/workshop', function (req, res) { + console.log("get") + res.render('workshop') }) - .catch(e =>ejs.send(e.message)) + + app.post('/workshop', function (req, res) { + const name = req.body.name + const description = req.body.description + repository.addWorkshop(name, description).then(() => { + repository.getWorkshopList() + .then(workshops => { + res.render("index", { + workshops: workshops + }) + }) + }) + .catch(e =>res.send(e.message)) + }) + + app.get('/workshop/:name', function (req, res) { + const workshopName = req.params.name + repository.getWorkshopByName(workshopName) + .then(workshop => { + res.render('ejs/workshop', workshop) + }) + .catch(e =>ejs.send(e.message)) + }) + + app.post('/remove-workshop', function (req, res) { + res.status(500).send("TODO") + }) + + app.post('/update-workshop', function(req, res) { + res.status(500).send("TODO") + }) + + app.listen(3000, function () { + console.log('Workshop app listening on port 3000!') + }) + }) -app.post('/remove-workshop', function (req, res) { - res.status(500).send("TODO") -}) - -app.post('/update-workshop', function(req, res) { - res.status(500).send("TODO") -}) - -app.listen(3000, function () { - console.log('Workshop app listening on port 3000!') -}) diff --git a/js/mongoWorkshop.js b/js/mongoWorkshop.js new file mode 100644 index 0000000..1b70338 --- /dev/null +++ b/js/mongoWorkshop.js @@ -0,0 +1,89 @@ +const MongoClient = require('mongodb').MongoClient; +const url = 'mongodb://localhost:27017'; +const dbName = 'workshopDatabase'; +const COLLECTION_NAME = "workshops" +let db; + +function init() { + return new Promise((resolve, reject) => { + MongoClient.connect(url, function(err, client) { + if (err) { + return reject(err) + } + console.log("Connected successfully to server"); + db = client.db(dbName); + resolve(); + }); + }) +} + +function getWorkshopList() { + return new Promise((resolve, reject) => { + const collection = db.collection(COLLECTION_NAME); + collection.find({}).toArray(function(err, workshops) { + if (err) { + return reject(err); + } + return resolve(workshops) + }) + }) +} + +function getWorkshopByName(name) { + return new Promise((resolve, reject) => { + if (!name) { + reject(new Error("name parameter is required")) + } + const collection = db.collection(COLLECTION_NAME); + collection.find({ + name + }).toArray(function(err, workshops) { + if (err) { + return reject(err); + } + if (workshops.length > 0) { + return resolve(workshops[0]) + } else { + return resolve(null) + } + }) + }) +} + +function addWorkshop(name, description) { + if (!name) { + return Promise.reject(new Error("Workshop name required")); + } + if (!description) { + return Promise.reject(new Error("Workshop description required")); + } + const collection = db.collection(COLLECTION_NAME); + return collection.insert({ + name, description + }).then(() => {return}) +} + +function removeWorkshopByName(name) { + const collection = db.collection(COLLECTION_NAME); + return collection.deleteMany({ + name + }).then(() => {return}) +} + +function updateWorkshop(name, description) { + const collection = db.collection(COLLECTION_NAME); + return collection.updateMany({ + name + }, { + description + }).then(() => {return}) +} + +module.exports = { + init, + getWorkshopList, + getWorkshopByName, + addWorkshop, + removeWorkshopByName, + updateWorkshop +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 90f3182..f7cb840 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,15 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "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", @@ -35,6 +44,11 @@ "type-is": "~1.6.17" } }, + "bson": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", + "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -63,6 +77,11 @@ "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=" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -71,6 +90,11 @@ "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", @@ -197,11 +221,22 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, + "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", @@ -230,6 +265,19 @@ "mime-db": "1.40.0" } }, + "mongodb": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz", + "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==", + "requires": { + "bl": "^2.2.1", + "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", @@ -258,6 +306,11 @@ "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.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -288,6 +341,34 @@ "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", @@ -298,6 +379,20 @@ "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", @@ -341,11 +436,28 @@ "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", @@ -365,6 +477,11 @@ "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/package.json b/package.json index b95e392..5aa5766 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "description": "", "main": "index.js", "scripts": { + "start": "node js index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", @@ -11,6 +12,7 @@ "dependencies": { "body-parser": "^1.19.0", "ejs": "^2.7.1", - "express": "^4.17.1" + "express": "^4.17.1", + "mongodb": "^3.6.2" } }