From 3c2fd320f1807c77485cabbb9366399683c7325c Mon Sep 17 00:00:00 2001 From: AdityaKoche01 Date: Tue, 20 Feb 2024 21:22:01 +0530 Subject: [PATCH] done --- app.js | 19 +++++++ db/index.js | 10 +++- models/Drone.model.js | 16 +++++- package.json | 2 +- routes/drones.js | 106 ++++++++++++++++++++++++++++++++++- seeds/drones.seed.js | 63 +++++++++++++++++++++ views/drones/create-form.hbs | 15 ++++- views/drones/list.hbs | 21 ++++++- views/drones/update-form.hbs | 15 ++++- views/index.hbs | 6 ++ views/layout.hbs | 6 ++ 11 files changed, 268 insertions(+), 11 deletions(-) diff --git a/app.js b/app.js index 7e0543a..9dd55f2 100644 --- a/app.js +++ b/app.js @@ -13,10 +13,21 @@ const express = require('express'); // https://www.npmjs.com/package/hbs const hbs = require('hbs'); + + const app = express(); // ℹ️ This function is getting exported from the config folder. It runs most middlewares require('./config')(app); +app.get('/', (req, res) => { + res.render('index', { title: 'Homepage' }); + }); + + app.get('/', (req, res) => { + res.render('list', { title: 'Homepage' }); + }); + + // default value for title local const projectName = 'lab-express-drones'; @@ -34,4 +45,12 @@ app.use('/', droneRoutes) // ❗ To handle errors. Routes that don't exist or errors that you handle in specific routes require('./error-handling')(app); +const mongoose = require("mongoose"); + + + + + + + module.exports = app; diff --git a/db/index.js b/db/index.js index 873910d..bfbcf30 100644 --- a/db/index.js +++ b/db/index.js @@ -5,13 +5,17 @@ const mongoose = require("mongoose"); // ℹ️ Sets the MongoDB URI for our app to have access to it. // If no env has been set, we dynamically set it to whatever the folder name was upon the creation of the app -const MONGO_URI = process.env.MONGODB_URI || "mongodb://localhost/lab-express-drones"; +const MONGO_URI = process.env.MONGODB_URI || "mongodb://127.0.0.1:27017/lab-express-drones"; -mongoose - .connect(MONGO_URI) + + +mongoose.connect(MONGO_URI) .then((x) => { console.log(`Connected to Mongo! Database name: "${x.connections[0].name}"`); }) .catch((err) => { console.error("Error connecting to mongo: ", err); }); + + + \ No newline at end of file diff --git a/models/Drone.model.js b/models/Drone.model.js index 93e3ea9..ba2583f 100644 --- a/models/Drone.model.js +++ b/models/Drone.model.js @@ -1 +1,15 @@ -// Iteration #1 \ No newline at end of file +// Iteration #1 +// models/Drone.model.js + +const mongoose = require('mongoose'); + + +const droneSchema = new mongoose.Schema({ + name: { type: String, required: true }, + propellers: { type: Number, required: true }, + maxSpeed: { type: Number, required: true } +}); + +const Drone = mongoose.model('Drone', droneSchema); + +module.exports = Drone; diff --git a/package.json b/package.json index e6dd70d..48a1272 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "dotenv": "^8.2.0", "express": "^4.17.1", "hbs": "^4.1.1", - "mongoose": "^6.1.2", + "mongoose": "^6.12.6", "morgan": "^1.10.0", "serve-favicon": "^2.5.0" }, diff --git a/routes/drones.js b/routes/drones.js index 51da515..ef7110c 100644 --- a/routes/drones.js +++ b/routes/drones.js @@ -1,35 +1,135 @@ + const express = require('express'); const router = express.Router(); +const Drone = require('../models/Drone.model'); // require the Drone model here -router.get('/drones', (req, res, next) => { + +router.get('/drones',(req, res, next) => { // Iteration #2: List the drones - // ... your code here + + Drone.find() + .then(allTheDronesFromDB => { + // Render the list view and pass the drones data + console.log("Retrieved Drones from Database:",allTheDronesFromDB); + res.render('drones/list', { drones:allTheDronesFromDB}); + }) + .catch(error => { + + console.error('Error retrieving drones:', error); + + next(error); + }); + + + + +// ... your code here }); -router.get('/drones/create', (req, res, next) => { +router.get('drones/create', (req, res, next) => { // Iteration #3: Add a new drone + res.render('drones/create-form'); + + // ... your code here }); router.post('/drones/create', (req, res, next) => { // Iteration #3: Add a new drone + const { name,propellers,maxSpeed } = req.body; + + // Create a new drone instance + const newDrone = new Drone({ + name, + propellers, + maxSpeed + }); + + + newDrone.save() + .then(() => { + + res.redirect('/drones'); + }) + .catch(error => { + console.error('Error creating drone:', error); + + res.render('drones/create-form', { errorMessage: 'Failed to create drone. Please try again.' }); + }); + + + // ... your code here }); router.get('/drones/:id/edit', (req, res, next) => { // Iteration #4: Update the drone + const droneId = req.params.id; + // Find the drone by id + Drone.findById(droneId) + .then(drone => { + if (!drone) { + res.status(404).render('not-found'); + } else { + res.render('drones/update-form', { drone }); + } + }) + .catch(error => { + console.error('Error updating drone:', error); + next(error); + }); + + + // ... your code here }); router.post('/drones/:id/edit', (req, res, next) => { // Iteration #4: Update the drone + router.post('/drones/:id/edit', (req, res, next) => { + const droneId = req.params.id; + const { name, propellers, maxSpeed } = req.body; + + // Find the drone by id and update it + Drone.findByIdAndUpdate(droneId, { name, propellers, maxSpeed }, { new: true }) + .then(updatedDrone => { + if (!updatedDrone) { + res.status(404).render('not-found'); + } else { + res.redirect('/drones'); + } + }) + .catch(error => { + console.error('Error updating drone:', error); + res.render('drones/update-form', { errorMessage: 'Failed to update drone. Please try again.', drone: req.body }); + }); + }); + + + + // ... your code here }); router.post('/drones/:id/delete', (req, res, next) => { // Iteration #5: Delete the drone + const droneId = req.params.id; + + + Drone.findByIdAndDelete(droneId) + .then(() => { + + res.redirect('/drones'); + }) + .catch(error => { + console.error('Error deleting drone:', error); + + res.render('error'); + }); + + // ... your code here }); diff --git a/seeds/drones.seed.js b/seeds/drones.seed.js index 4b29ecb..c628cac 100644 --- a/seeds/drones.seed.js +++ b/seeds/drones.seed.js @@ -1 +1,64 @@ // Iteration #1 + +const mongoose = require('mongoose'); +const Drone = require('../models/Drone.model'); + +const MONGO_URI = process.env.MONGODB_URI || "mongodb://127.0.0.1:27017/lab-express-drones"; + + +mongoose.connect(MONGO_URI, { + useNewUrlParser: true, + useUnifiedTopology: true, + +}) +.then(() => { + console.log('Connected to MongoDB.'); + + + + +const drones = [ + { name: 'General Atomics MQ-9 Reaper', propellers: 4, maxSpeed: 18 }, + { name: 'DJI Phantom 4 Pro', propellers: 4, maxSpeed: 20 }, + { name: 'Parrot Anafi', propellers: 4, maxSpeed: 14 }, + { name: 'DJI Mavic Air 2', propellers: 4, maxSpeed: 19 }, + { name: 'Skydio 2', propellers: 6, maxSpeed: 18 }, + { name: 'Autel Robotics EVO', propellers: 4, maxSpeed: 20 }, + { name: 'Yuneec Typhoon H Pro', propellers: 6, maxSpeed: 13 }, + { name: 'PowerVision PowerEgg X', propellers: 4, maxSpeed: 16 }, + { name: 'Hubsan Zino Pro', propellers: 4, maxSpeed: 20 }, + { name: 'Holy Stone HS100', propellers: 4, maxSpeed: 10 }, + { name: 'Walkera Vitus', propellers: 4, maxSpeed: 16 }, + { name: 'Potensic D85', propellers: 4, maxSpeed: 18 }, + { name: 'JJRC X12', propellers: 4, maxSpeed: 20 }, + { name: 'Ryze Tello', propellers: 4, maxSpeed: 8 }, + { name: 'Altair Aerial Outlaw SE', propellers: 4, maxSpeed: 24 }, + { name: 'Contixo F22', propellers: 4, maxSpeed: 19 }, + { name: 'Force1 F100 Ghost', propellers: 4, maxSpeed: 25 }, + { name: 'Eachine E520', propellers: 4, maxSpeed: 18 }, + { name: 'MJX Bugs 2W', propellers: 4, maxSpeed: 25 }, + { name: 'Syma X5C', propellers: 4, maxSpeed: 7 }, + { name: 'Cheerwing Syma X5SW-V3', propellers: 4, maxSpeed: 7 }, + { name: 'UDI U818A HD', propellers: 4, maxSpeed: 10 }, + { name: 'Holy Stone HS200', propellers: 4, maxSpeed: 10 }, + { name: 'Helifar H816', propellers: 4, maxSpeed: 15 }, + { name: 'Drocon Bugs 3', propellers: 4, maxSpeed: 48 } + ]; + + + // Create drones in the database + Drone.create(drones) + .then(createdDrones => { + console.log(`${createdDrones.length} drones have been created.`); + }) + .catch(error => { + console.error('Error creating drones:', error); + }) + .finally(() => { + // Close the connection after seeding + mongoose.disconnect(); + }); +}) +.catch(error => { + console.error('MongoDB connection error:', error); +}); \ No newline at end of file diff --git a/views/drones/create-form.hbs b/views/drones/create-form.hbs index 1a8197f..d824913 100644 --- a/views/drones/create-form.hbs +++ b/views/drones/create-form.hbs @@ -1 +1,14 @@ -

Create a new drone

\ No newline at end of file +

Create a new drone

+ +
+ +

+ + +

+ + +

+ + +
diff --git a/views/drones/list.hbs b/views/drones/list.hbs index a2830d3..be57326 100644 --- a/views/drones/list.hbs +++ b/views/drones/list.hbs @@ -1 +1,20 @@ -

Available drones

\ No newline at end of file +{{!--views/drones/list.hbs--}} +

Available drones

+ \ No newline at end of file diff --git a/views/drones/update-form.hbs b/views/drones/update-form.hbs index 0a27dc3..848c7f5 100644 --- a/views/drones/update-form.hbs +++ b/views/drones/update-form.hbs @@ -1 +1,14 @@ -

Update the drone

\ No newline at end of file +

Update the drone

+ +
+ +

+ + +

+ + +

+ + +
diff --git a/views/index.hbs b/views/index.hbs index 1f308fd..b4c06ae 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -1,2 +1,8 @@

{{title}}

Welcome to {{title}}

+ + + diff --git a/views/layout.hbs b/views/layout.hbs index 73199c1..4dc277d 100644 --- a/views/layout.hbs +++ b/views/layout.hbs @@ -10,6 +10,12 @@ + {{{body}}}