From 0533450e9901cb8ca84612b806defa5767981dc9 Mon Sep 17 00:00:00 2001 From: Muhammad Irshad <85778819+Irshadmdk19@users.noreply.github.com> Date: Mon, 30 Dec 2024 22:51:02 +0530 Subject: [PATCH] Completed Iterations --- .env | 3 +- app.js | 12 ++++---- db/index.js | 2 +- models/Drone.model.js | 12 +++++++- package.json | 6 ++-- routes/drones.js | 71 ++++++++++++++++++++++++++++--------------- seeds/drones.seed.js | 20 ++++++++++++ 7 files changed, 90 insertions(+), 36 deletions(-) diff --git a/.env b/.env index c0c68b1..de1ff20 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -PORT=3000 \ No newline at end of file +PORT=3000 +MONGODB_URI="mongodb+srv://irshadmdk99:irshamongo@cluster0.dapdax3.mongodb.net/lab-express-drones" \ No newline at end of file diff --git a/app.js b/app.js index 7e0543a..8282cc0 100644 --- a/app.js +++ b/app.js @@ -5,7 +5,7 @@ require('dotenv/config'); // â„šī¸ Connects to the database require('./db'); -// Handles http requests (express is node js framework) +// Handles HTTP requests (Express is Node.js framework) // https://www.npmjs.com/package/express const express = require('express'); @@ -20,16 +20,16 @@ require('./config')(app); // default value for title local const projectName = 'lab-express-drones'; -const capitalized = string => string[0].toUpperCase() + string.slice(1).toLowerCase(); +const capitalized = (string) => string[0].toUpperCase() + string.slice(1).toLowerCase(); -app.locals.title = `${capitalized(projectName)}- Generated with Rootlauncher`; +app.locals.title = `${capitalized(projectName)} - Generated with Rootlauncher`; // 👇 Start handling routes here const index = require('./routes/index'); -app.use('/', index); +app.use('/', index); // Handles homepage routes -const droneRoutes = require('./routes/drones') -app.use('/', droneRoutes) +const droneRoutes = require('./routes/drones'); +app.use('/drones', droneRoutes); // All drone-related routes will use `/drones` // ❗ To handle errors. Routes that don't exist or errors that you handle in specific routes require('./error-handling')(app); diff --git a/db/index.js b/db/index.js index 873910d..4eaabf8 100644 --- a/db/index.js +++ b/db/index.js @@ -6,7 +6,7 @@ const mongoose = require("mongoose"); // 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"; - +mongoose.set('strictQuery', true); mongoose .connect(MONGO_URI) .then((x) => { diff --git a/models/Drone.model.js b/models/Drone.model.js index 93e3ea9..e8ec639 100644 --- a/models/Drone.model.js +++ b/models/Drone.model.js @@ -1 +1,11 @@ -// Iteration #1 \ No newline at end of file +// Iteration #1 +const mongoose = require('mongoose'); +const { Schema, model } = mongoose; + +const droneSchema = new Schema({ + name: String, + propellers: Number, + maxSpeed: Number +}); + +module.exports = model('Drone', droneSchema); diff --git a/package.json b/package.json index e6dd70d..1894dd1 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,10 @@ }, "dependencies": { "cookie-parser": "^1.4.5", - "dotenv": "^8.2.0", - "express": "^4.17.1", + "dotenv": "^8.6.0", + "express": "^4.21.2", "hbs": "^4.1.1", - "mongoose": "^6.1.2", + "mongoose": "^6.13.5", "morgan": "^1.10.0", "serve-favicon": "^2.5.0" }, diff --git a/routes/drones.js b/routes/drones.js index 51da515..4659d04 100644 --- a/routes/drones.js +++ b/routes/drones.js @@ -1,36 +1,59 @@ const express = require('express'); const router = express.Router(); - -// require the Drone model here - -router.get('/drones', (req, res, next) => { - // Iteration #2: List the drones - // ... your code here +const Drone = require('../models/Drone.model'); + +// List all drones +router.get('/', async (req, res, next) => { + try { + const drones = await Drone.find(); + res.render('drones/list', { drones }); + } catch (error) { + console.error('Error retrieving drones:', error); + next(error); + } }); -router.get('/drones/create', (req, res, next) => { - // Iteration #3: Add a new drone - // ... your code here +// Create a new drone +router.get('/create', (req, res) => res.render('drones/create-form')); +router.post('/create', async (req, res, next) => { + try { + await Drone.create(req.body); + res.redirect('/drones'); + } catch (error) { + console.error('Error creating drone:', error); + res.render('drones/create-form'); + } }); -router.post('/drones/create', (req, res, next) => { - // Iteration #3: Add a new drone - // ... your code here +// Update a drone +router.get('/:id/edit', async (req, res, next) => { + try { + const drone = await Drone.findById(req.params.id); + res.render('drones/update-form', { drone }); + } catch (error) { + console.error('Error fetching drone:', error); + next(error); + } }); - -router.get('/drones/:id/edit', (req, res, next) => { - // Iteration #4: Update the drone - // ... your code here -}); - -router.post('/drones/:id/edit', (req, res, next) => { - // Iteration #4: Update the drone - // ... your code here +router.post('/:id/edit', async (req, res, next) => { + try { + await Drone.findByIdAndUpdate(req.params.id, req.body); + res.redirect('/drones'); + } catch (error) { + console.error('Error updating drone:', error); + res.render('drones/update-form', { drone: req.body }); + } }); -router.post('/drones/:id/delete', (req, res, next) => { - // Iteration #5: Delete the drone - // ... your code here +// Delete a drone +router.post('/:id/delete', async (req, res, next) => { + try { + await Drone.findByIdAndDelete(req.params.id); + res.redirect('/drones'); + } catch (error) { + console.error('Error deleting drone:', error); + next(error); + } }); module.exports = router; diff --git a/seeds/drones.seed.js b/seeds/drones.seed.js index 4b29ecb..ea31951 100644 --- a/seeds/drones.seed.js +++ b/seeds/drones.seed.js @@ -1 +1,21 @@ // Iteration #1 +const mongoose = require('mongoose'); +const Drone = require('../models/Drone.model'); + +const drones = [ + { name: 'Creeper XL 500', propellers: 3, maxSpeed: 12 }, + { name: 'Racer 57', propellers: 4, maxSpeed: 20 }, + { name: 'Courier 3000i', propellers: 6, maxSpeed: 18 } +]; + +const MONGO_URI = process.env.MONGODB_URI || 'mongodb://localhost/drone-management'; + +mongoose + .connect(MONGO_URI) + .then(async () => { + await Drone.deleteMany(); // Clear existing data + const createdDrones = await Drone.create(drones); + console.log(`Seeded ${createdDrones.length} drones.`); + mongoose.disconnect(); + }) + .catch(err => console.error('Error seeding drones:', err));