diff --git a/.gitignore b/.gitignore index 5148e52..c680556 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ jspm_packages # Optional REPL history .node_repl_history + +# dot env +.env diff --git a/README.md b/README.md index b26b556..6d40f2c 100644 --- a/README.md +++ b/README.md @@ -46,14 +46,24 @@ We don't need to worry about update or delete. * Import and use the controller functions in the appropiate Router # Part 4 - Database -* In server/index.js, import and use mongoose. Connect to a database "advanced-express-practice" -* Create the mongoose models for Contact, Vehicle, Comment Product +* https://github.com/AustinCodingAcademy/express-mongodb +* Create a database somewhere for advanced-express-practice +* Create a new file database.js, implement the code for MongoClient and connect() +* Implement the mongodb client tool into your controllers for list, show, create +* Use insertMany() for create and find() for list and show +* How are your controllers going to get access to const db = client.db("advanced-express-practice"); + +# Part 5 - Mongoose + +* In server/index.js, import and use mongoose. Connect to a database "advanced-express-practice" +* Create the mongoose models for * * Contact, Vehicle, Comment Product * CommentModel - body * ContactModel - name, occupation, avatar * VehicleModel - year, make, model * ProductModel - name, description * Change the code in the controllers to use the Models instead of hard coded arrays + ### Points * Base - 10pts * Data shows in the page for the Lists - 5pts each (20pts) diff --git a/controllers/comment.js b/controllers/comment.js new file mode 100644 index 0000000..8904473 --- /dev/null +++ b/controllers/comment.js @@ -0,0 +1,20 @@ +let Comment = require("../models/commentModel") + +exports.list = function list(req, res) { + Comment.find((err,c)=>{ + return res.json(c); + }); +} +exports.show = function show(req, res) { + Comment.findById(req.params.id, (err,c)=>{ + return res.json(c); + }); +} +exports.create = function create(req, res) { + const newComment = new Comment({ + body: req.body.body + }) + newComment.save().then(savedComment=>{ + console.log(savedComment) + }) +} diff --git a/controllers/contact.js b/controllers/contact.js new file mode 100644 index 0000000..9fdf064 --- /dev/null +++ b/controllers/contact.js @@ -0,0 +1,22 @@ +let Contact = require("../models/contactModel") + +exports.list = function list(req, res) { + Contact.find((err,c)=>{ + return res.json(c); + }); +} +exports.show = function show(req, res) { + Contact.findById(req.params.id, (err,c)=>{ + return res.json(c); + }); +} +exports.create = function create(req, res) { + const newContact = new Contact({ + name: req.body.name, + occupation: req.body.occupation, + avatar: req.body.avatar + }) + newContact.save().then(savedContact=>{ + console.log(savedContact) + }) +} \ No newline at end of file diff --git a/controllers/product.js b/controllers/product.js new file mode 100644 index 0000000..608c8c1 --- /dev/null +++ b/controllers/product.js @@ -0,0 +1,21 @@ +let Product = require("../models/productModel") + +exports.list = function list(req, res) { + Product.find((err,p)=>{ + return res.json(p); + }); +} +exports.show = function show(req, res) { + Product.findById(req.params.id, (err,p)=>{ + return res.json(p); + }); +} +exports.create = function create(req, res) { + const newProduct = new Product({ + name: req.body.name, + description: req.body.description + }) + newProduct.save().then(savedProduct=>{ + console.log(savedProduct) + }) +} diff --git a/controllers/vehicle.js b/controllers/vehicle.js new file mode 100644 index 0000000..50b624d --- /dev/null +++ b/controllers/vehicle.js @@ -0,0 +1,25 @@ +let Vehicle = require("../models/vehicleModel.js") + +exports.list = function list(req, res) { + Vehicle.find((err,v)=>{ + if(err){ + console.log(err); + } + return res.json(v); + }); +} +exports.show = function show(req, res) { + Vehicle.findById(req.params.id, (err,v)=>{ + return res.json(v); + }); +} +exports.create = function create(req, res) { + const newVehicle = new Vehicle({ + year: req.body.year, + make: req.body.make, + model: req.body.model + }) + newVehicle.save().then(savedVehicle=>{ + console.log(savedVehicle) + }) +} diff --git a/database.js b/database.js new file mode 100644 index 0000000..a879c29 --- /dev/null +++ b/database.js @@ -0,0 +1,26 @@ +const MongoClient = require('mongodb').MongoClient; +const assert = require('assert'); +const dotenv = require('dotenv').config(); +let db = null; + + + +// change this to your mongodb atlas uri +const url = `mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASSWORD}@aca-practice-bx4sb.mongodb.net/test?retryWrites=true&w=majority`; +const client = new MongoClient(url); +const dbName = 'advanced-express-practice'; + +let areYouConnected = (err) => { + if (err) { + console.log(err); + return + } + console.log('Connected successfully to server') +} + +// Use connect method to connect to the server +client.connect(areYouConnected, { useNewUrlParser: true }) + +exports.getDatabase = function() { + return db; +} \ No newline at end of file diff --git a/index.js b/index.js index 3d47752..6894c65 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,13 @@ let express = require("express"); -let comments = require("./comments"); -let products = require("./products"); -let vehicles = require("./vehicles"); -let contacts = require("./contacts"); +const mongoose = require('mongoose'); +const assert = require('assert'); +const dotenv = require('dotenv').config(); +let commentRoutes = require('./routes/comment'); +let productRoutes = require('./routes/product'); +let contactRoutes = require('./routes/contact'); +let vehicleRoutes = require('./routes/vehicle'); + +mongoose.connect(`mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASSWORD}@aca-practice-bx4sb.mongodb.net/test?retryWrites=true&w=majority`, {useNewUrlParser: true}); const bodyParser = require("body-parser"); const app = express(); @@ -11,6 +16,10 @@ app.use(express.static("public")); const thePort = 3001; +app.use(vehicleRoutes); +app.use(commentRoutes); +app.use(productRoutes); +app.use(contactRoutes); app.listen(thePort, (err) => { if (err) { diff --git a/models/commentModel.js b/models/commentModel.js new file mode 100644 index 0000000..4d5b562 --- /dev/null +++ b/models/commentModel.js @@ -0,0 +1,10 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const commentSchema = new Schema ({ + body: String +}) + +let Comment = mongoose.model('Comment', commentSchema); + +module.exports = Comment; diff --git a/models/contactModel.js b/models/contactModel.js new file mode 100644 index 0000000..5e2a4a8 --- /dev/null +++ b/models/contactModel.js @@ -0,0 +1,12 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const contactSchema = new Schema ({ + name: String, + occupation: String, + avatar: String +}) + +let Contact = mongoose.model('Contact', contactSchema); + +module.exports = Contact; diff --git a/models/productModel.js b/models/productModel.js new file mode 100644 index 0000000..ef24bbc --- /dev/null +++ b/models/productModel.js @@ -0,0 +1,11 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +let productsSchema = new Schema({ + name: String, + description: String +}); + +let Product = mongoose.model('Product', productsSchema); + +module.exports = Product; diff --git a/models/vehicleModel.js b/models/vehicleModel.js new file mode 100644 index 0000000..4204d0b --- /dev/null +++ b/models/vehicleModel.js @@ -0,0 +1,12 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const vehicleSchema = new Schema ({ + year: Number, + make: String, + model: String +}) + +let Vehicle = mongoose.model('Vehicle', vehicleSchema); + +module.exports = Vehicle; diff --git a/package-lock.json b/package-lock.json index a533283..ba52b32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,19 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "^4.17.11" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, "body-parser": { "version": "1.18.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", @@ -35,6 +48,11 @@ "type-is": "~1.6.16" } }, + "bson": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", + "integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg==" + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -78,6 +96,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "dotenv": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz", + "integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -202,11 +225,27 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, + "kareem": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.0.tgz", + "integrity": "sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg==" + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, "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", @@ -235,6 +274,107 @@ "mime-db": "~1.37.0" } }, + "mongodb": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.11.tgz", + "integrity": "sha512-60KV+DPW++fzaD5cYbieCRQcXiYWQdRLHBqQyuu3rJmrP8vYZgI4u5UwfsUX6nGLON69FUIu4d3tH+WL4jShuA==", + "requires": { + "mongodb-core": "3.0.11" + } + }, + "mongodb-core": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.11.tgz", + "integrity": "sha512-agzBbSP3ahEYJyBMQicj70B+n+NNYsKaroezu5ETcImXs9nqf89/QI6e8iipg2rY3a8OWZBHWvqYxnsWasrUQA==", + "requires": { + "bson": "~1.0.4", + "require_optional": "^1.0.1" + } + }, + "mongoose": { + "version": "5.6.9", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.6.9.tgz", + "integrity": "sha512-NRW5UJSmwyJxK+MRHmq+dQKgZqMZCpW1aPkpBZESqrrgF2J15Flo/4K3RYkSSQY7oKhfbgqZTPo+J1snJ3hJ3w==", + "requires": { + "async": "2.6.2", + "bson": "~1.1.1", + "kareem": "2.3.0", + "mongodb": "3.2.7", + "mongodb-core": "3.2.7", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.6.0", + "mquery": "3.2.1", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.1.2", + "sift": "7.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "bson": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz", + "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==" + }, + "mongodb": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.7.tgz", + "integrity": "sha512-2YdWrdf1PJgxcCrT1tWoL6nHuk6hCxhddAAaEh8QJL231ci4+P9FLyqopbTm2Z2sAU6mhCri+wd9r1hOcHdoMw==", + "requires": { + "mongodb-core": "3.2.7", + "safe-buffer": "^5.1.2" + } + }, + "mongodb-core": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.7.tgz", + "integrity": "sha512-WypKdLxFNPOH/Jy6i9z47IjG2wIldA54iDZBmHMINcgKOUcWJh8og+Wix76oGd7EyYkHJKssQ2FAOw5Su/n4XQ==", + "requires": { + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "mpath": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", + "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" + }, + "mquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.1.tgz", + "integrity": "sha512-kY/K8QToZWTTocm0U+r8rqcJCp5PRl6e8tPmoDs5OeSO3DInZE2rAL6AYH+V406JTo8305LdASOQcxRDqHojyw==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -293,6 +433,25 @@ "unpipe": "1.0.0" } }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "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", @@ -303,6 +462,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.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", @@ -346,6 +519,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "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", diff --git a/package.json b/package.json index d82072f..4b2a0d9 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "devDependencies": {}, "dependencies": { "body-parser": "*", - "express": "*" + "dotenv": "^8.0.0", + "express": "*", + "mongodb": "~3.0.8", + "mongoose": "^5.6.9" } } diff --git a/routes/comment.js b/routes/comment.js new file mode 100644 index 0000000..42aa6e4 --- /dev/null +++ b/routes/comment.js @@ -0,0 +1,10 @@ +const express = require('express'); +const router = express.Router(); +const {list, show, create} = require('../controllers/comment'); + +// COMMENTS +router.get('/comments', list); +router.get('/comments/:commentId', show); +router.post('/contacts', create); + +module.exports = router; \ No newline at end of file diff --git a/routes/contact.js b/routes/contact.js new file mode 100644 index 0000000..5aa20af --- /dev/null +++ b/routes/contact.js @@ -0,0 +1,10 @@ +const express = require('express'); +const router = express.Router(); +const {list, show, create} = require('../controllers/contact'); + +// CONTACTS +router.get('/contacts', list); +router.get('/contacts/:contactId', show); +router.post('/contacts', create); + +module.exports = router; diff --git a/routes/product.js b/routes/product.js new file mode 100644 index 0000000..1f7db77 --- /dev/null +++ b/routes/product.js @@ -0,0 +1,10 @@ +const express = require('express'); +const router = express.Router(); +const {list, show, create} = require('../controllers/product'); + +// PRODUCTS +router.get('/products', list); +router.get('/products/:productsId', show); +router.post('/products', create); + +module.exports = router; \ No newline at end of file diff --git a/routes/vehicle.js b/routes/vehicle.js new file mode 100644 index 0000000..f3cbfbb --- /dev/null +++ b/routes/vehicle.js @@ -0,0 +1,10 @@ +const express = require('express'); +const router = express.Router(); +const {list, create, show} = require('../controllers/vehicle') + +// VEHICLES +router.get('/vehicles', list); +router.get('/vehicles/:vehicleId', show); +router.post('/vehicles', create); + +module.exports = router; \ No newline at end of file