diff --git a/README.md b/README.md index 27b17ea1737734ccce1148e812e29ea562e07336..2881aa3d6b9afb99f19524670ffa6c92a1040cdb 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,4 @@ show collections; db.orders.find(); ``` - +Open api at http://localhost:8080/ diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..25c8fdbaba62c31aacfa2307975b06fbfd017485 --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,2 @@ +node_modules +package-lock.json \ No newline at end of file diff --git a/api/Dockerfile b/api/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..8e06e5834352a245711c3d0d4769a139a7230abe --- /dev/null +++ b/api/Dockerfile @@ -0,0 +1,5 @@ +FROM node:11 +WORKDIR /home/nodejs/app +COPY . . +RUN npm install --production +CMD ["npm", "start"] diff --git a/api/app/queries.js b/api/app/queries.js new file mode 100644 index 0000000000000000000000000000000000000000..205b4ea6596935490addecf908e9b190df004d75 --- /dev/null +++ b/api/app/queries.js @@ -0,0 +1,27 @@ +const u = require('./utils'); +const MongoClient = require('mongodb').MongoClient; + +const url = 'mongodb://mongo-orders:27017'; +const dbName = 'order'; + +let db; +MongoClient.connect(url, function(err, client) { + if (err) { + console.log(err); + } + else { + console.log('Connected successfully to server'); + db = client.db(dbName); + } +}); + +exports.byCustomerPseudo = (req, res) => { + u.logReq(req); + db.collection('orders').find({ 'customer.pseudo': { $eq: req.params.pseudo } }).toArray((err, docs) => { + if (err) { + console.log(err); + } + console.log(docs); + res.send(docs); + }); +} diff --git a/api/app/router.js b/api/app/router.js new file mode 100644 index 0000000000000000000000000000000000000000..b3fc2d48daff59456ac7df59da4cddc6d4a0ded1 --- /dev/null +++ b/api/app/router.js @@ -0,0 +1,14 @@ +const u = require('./utils'); +const queries = require('./queries'); +const router = require('express').Router(); + +router.get('/hello', (req, res) => { + u.logReq(req); + res.send({ message: 'hello' }); +}); + +router.get('/by-customer-pseudo/:pseudo', queries.byCustomerPseudo); + +router.use((_, res) => res.status(404).send({ message: 'Route not found' })); + +module.exports = router; diff --git a/api/app/utils.js b/api/app/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..5332ef77c3760969e129060ea969fe22e1e14b73 --- /dev/null +++ b/api/app/utils.js @@ -0,0 +1,7 @@ +exports.logReq = (req) => { + console.log('METHOD:', req.method); + console.log('ENDPOINT:', req.originalUrl); + console.log('HEADERS:', req.headers); + console.log('PARAMS:', req.params); + console.log('BODY:', req.body); +} diff --git a/api/package.json b/api/package.json new file mode 100644 index 0000000000000000000000000000000000000000..a9da8a9a086732929a2c12a78264063bab879e17 --- /dev/null +++ b/api/package.json @@ -0,0 +1,30 @@ +{ + "name": "api", + "version": "0.1.0", + "description": "Node.js api interacting with MongoDB", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://githepia.hesge.ch/joel.cavat/mongodb-orders" + }, + "keywords": [ + "mongo", + "mongodb", + "node", + "nodejs", + "api" + ], + "author": "Joël Cavat, Steven Liatti", + "license": "ISC", + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.17.0", + "mongodb": "^3.2.5" + }, + "devDependencies": { + "nodemon": "^1.19.0" + } +} diff --git a/api/server.js b/api/server.js new file mode 100644 index 0000000000000000000000000000000000000000..6ce992de8a87e984fe44a37a2e4346125f53970c --- /dev/null +++ b/api/server.js @@ -0,0 +1,24 @@ +// modules +const express = require('express'); +const app = express(); +const bodyParser = require('body-parser'); +const router = require('./app/router'); + +// get all data/stuff of the body (POST) parameters +app.use(bodyParser.json()); // parse application/json +app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // parse application/vnd.api+json as json +app.use(bodyParser.urlencoded({ extended: true })); // parse application/x-www-form-urlencoded +app.use(function (req, res, next) { + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); + res.header('Access-Control-Allow-Origin', '*'); + next(); +}); + +// routes +app.use('/', router); + +// start api +const port = process.env.PORT || 8080; // set our port +app.listen(port); +console.log('Api listening on port ' + port); diff --git a/docker-compose.yml b/docker-compose.yml index 3094ff78db262fb65f7c25359ae4b500141e57ae..fca59398392aa3d9c14663c785df6d4342fce5ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +1,16 @@ version: "2" services: mongo-orders: - image: mongo - ports: + image: mongo + ports: - "27017:27017" + depends_on: + - mongo-seed mongo-seed: - build: . - links: + build: ./mongodb + api: + build: ./api + ports: + - "8080:8080" + depends_on: - mongo-orders diff --git a/Dockerfile b/mongodb/Dockerfile similarity index 92% rename from Dockerfile rename to mongodb/Dockerfile index e4acc536afb35bf0d03c43ca38e5a0c77b4e45a6..b75eedb180eced096dedeb7a880dcd4edd64dfd8 100644 --- a/Dockerfile +++ b/mongodb/Dockerfile @@ -1,3 +1,3 @@ FROM mongo COPY ./data/orders.json /orders.json -CMD mongoimport --host mongo-orders --db order --collection orders --type json --file orders.json --jsonArray && mongo --host mongo-orders order --eval 'db.orders.find( { "customer.id.floatApprox": { $exists: true } } ).forEach( tr => db.orders.update({_id: tr._id},{$set:{"customer.id": tr.customer.id.floatApprox}} ) )' && mongo --host mongo-orders order --eval 'db.orders.find().forEach( tr => db.orders.update({_id: tr._id}, {$set:{"shipping.when": new Date(tr.shipping.when)}}))' +CMD mongoimport --host mongo-orders --db order --collection orders --type json --file orders.json --jsonArray && mongo --host mongo-orders order --eval 'db.orders.find( { "customer.id.floatApprox": { $exists: true } } ).forEach( tr => db.orders.update({_id: tr._id},{$set:{"customer.id": tr.customer.id.floatApprox}} ) )' && mongo --host mongo-orders order --eval 'db.orders.find().forEach( tr => db.orders.update({_id: tr._id}, {$set:{"shipping.when": new Date(tr.shipping.when)}}))' \ No newline at end of file diff --git a/data/orders.json b/mongodb/data/orders.json similarity index 100% rename from data/orders.json rename to mongodb/data/orders.json