diff --git a/models/Drone.model.js b/models/Drone.model.js index 93e3ea9..bf3243e 100644 --- a/models/Drone.model.js +++ b/models/Drone.model.js @@ -1 +1,21 @@ -// Iteration #1 \ No newline at end of file +// Iteration #1 +const mongoose = require('mongoose'); +mongoose.set('strictQuery', true); +// Define the Drone schema +const DroneSchema = new mongoose.Schema({ + name: { + type: String, + required: true + }, + propellers: { + type: Number, + required: true + }, + maxSpeed: { + type: Number, + required: true + } + }); + + +module.exports = mongoose.model('Drone', DroneSchema); \ No newline at end of file diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 05a1470..801b29c 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -5,4 +5,55 @@ body { a { color: #00b7ff; + top: 20px; + text-decoration: none; +} + +a:hover { + background: #e3e3e3; + color: #000; +} + +h1 { + font-size: 2.6em; + margin: 0.67em 0; + text-align: center; +} + +h2 { + font-size: 2.2em; + margin: 0.83em 0; + text-align: center; +} + +label { + font-size: 1.4em; + margin: 0.83em 0; + font-weight: bold; +} +li, a, button { + margin-top:18px ; + font-size: 1rem; + padding: 0.8em 2em; + background-color: #000; + border: 3px solid yellow; + border-radius: 1em; + color: #fff; + font-weight: bolder; + transition: cubic-bezier(0.68, -0.55, 0.265, 1.55) 0.4s; + box-shadow: -5px 5px 0px 0px rgb(25, 47, 147); +} + +button:hover { + transform: translate(5px, -5px); +} + +input,textarea { + width: 100%; + padding: 12px 20px; + margin: 8px 0; + display: flex; + border: 1px solid #0a0909; + border-radius: 8px; + box-sizing: border-box; } diff --git a/routes/drones.js b/routes/drones.js index 51da515..ccd68ad 100644 --- a/routes/drones.js +++ b/routes/drones.js @@ -2,35 +2,93 @@ const express = require('express'); const router = express.Router(); // require the Drone model here +const Drone = require('../models/Drone.model'); router.get('/drones', (req, res, next) => { // Iteration #2: List the drones // ... your code here + Drone.find() + .then(dronesFromDB => { + console.log('Retreived Drones from DB: ', dronesFromDB); + res.render('../views/drones/list.hbs', { drones : dronesFromDB}); + }) + .catch(error => { + console.log('Error while fetching Drones From Database:', error); + next(error); + }) }); router.get('/drones/create', (req, res, next) => { // Iteration #3: Add a new drone // ... your code here + res.render('/drones/create-form.hbs'); }); router.post('/drones/create', (req, res, next) => { // Iteration #3: Add a new drone // ... your code here + const { name, propellers, maxSpeed } = req.body; + + Drone.create({ name, propellers, maxSpeed }) + .then(() => res.redirect('/drones')) + .catch(error => next(error)); }); -router.get('/drones/:id/edit', (req, res, next) => { +router.get('/drones/:id/edit', async(req, res) => { // Iteration #4: Update the drone // ... your code here + const { id } = req.params; + + try { + const drone = await Drone.findById(id); + if (!drone) { + return res.status(404).send('Drone not found'); + } + res.render('drones/update-form', { drone }); + } catch (err) { + console.error('Error fetching drone for update:', err); + res.status(500).send('Internal Server Error'); + } }); -router.post('/drones/:id/edit', (req, res, next) => { +router.post('/drones/:id/edit', async(req, res) => { // Iteration #4: Update the drone // ... your code here + const { id } = req.params; + const { name, propellers, maxSpeed } = req.body; + + try { + const updatedDrone = await Drone.findByIdAndUpdate( + id, + { name, propellers, maxSpeed }, + { new: true } // This option returns the updated document + ); + + if (!updatedDrone) { + return res.status(404).send('Drone not found'); + } + + res.redirect('/drones'); // Redirect to the drones list after update + } catch (err) { + console.error('Error updating drone:', err); + res.render('drones/update-form', { drone: req.body, error: 'Failed to update drone. Please try again.' }); + } }); -router.post('/drones/:id/delete', (req, res, next) => { - // Iteration #5: Delete the drone - // ... your code here + +router.post('/drones/:id/delete', async (req, res) => { + const { id } = req.params; + + try { + const deletedDrone = await Drone.findByIdAndDelete(id); + if (!deletedDrone) { + return res.status(404).send('Drone not found'); + } + res.redirect('/drones'); // Redirect to the drones list after deletion + } catch (err) { + console.error('Error deleting drone:', err); + res.status(500).send('Internal Server Error'); + } }); module.exports = router; diff --git a/seeds/drones.seed.js b/seeds/drones.seed.js index 4b29ecb..100cf80 100644 --- a/seeds/drones.seed.js +++ b/seeds/drones.seed.js @@ -1 +1,29 @@ // Iteration #1 + +const mongoose = require('mongoose'); +const Drone = require('../models/Drone.model'); + +const MONGO_URI = "mongodb://localhost/lab-express-drones"; + +mongoose.set('strictQuery', true); +mongoose.connect(MONGO_URI, { + useNewUrlParser: true, + useUnifiedTopology: true +}); + +const drones = [ + + { name: "Creeper XL 500", propellers: 3, maxSpeed: 12}, + + { name: "Racer 57", propellers: 4, maxSpeed: 20 }, + + { name: "Courier 3000i", propellers: 6, maxSpeed: 18 } +]; + +Drone.insertMany(drones) +.then(dronesFromDB => { + console.log(`Created ${dronesFromDB.length} drones`); + + mongoose.connection.close(); +}) +.catch(err => console.log(`An error occured while creating drones from the DB: ${err}`)); \ No newline at end of file diff --git a/views/drones/create-form.hbs b/views/drones/create-form.hbs index 1a8197f..bc28634 100644 --- a/views/drones/create-form.hbs +++ b/views/drones/create-form.hbs @@ -1 +1,16 @@ -