Skip to content
Open

done #26

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion models/Drone.model.js
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
// Iteration #1
// 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);
51 changes: 51 additions & 0 deletions public/stylesheets/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
68 changes: 63 additions & 5 deletions routes/drones.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
28 changes: 28 additions & 0 deletions seeds/drones.seed.js
Original file line number Diff line number Diff line change
@@ -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}`));
17 changes: 16 additions & 1 deletion views/drones/create-form.hbs
Original file line number Diff line number Diff line change
@@ -1 +1,16 @@
<h2>Create a new drone</h2>
<h2>Create a new drone</h2>
<form action="/drones/create" method="post">
<label> Name :
<input type="text" name="name" />
</label>

<label> propellers :
<input type="number" name="propellers" />
</label>

<label> max Speed :
<input type="number" name="maxSpeed"/>
</label>

<button type="submit"> Create </button>
</form>
15 changes: 14 additions & 1 deletion views/drones/list.hbs
Original file line number Diff line number Diff line change
@@ -1 +1,14 @@
<h2>Available drones</h2>
<h2>Available drones</h2>
<h1>List of Drones</h1>
<ul>
{{#each drones}}
<li>Name: {{this.name}}</li>
<li>Propellers: {{this.propellers}}</li>
<li>Max Speed: {{this.maxSpeed}}</li>
{{!-- for updating --}}
<a href="/drones/{{_id}}/edit">Edit</a>
{{!-- For deleting --}}
<form action="/drones/{{_id}}/delete" method="POST">
<button>Delete</button>
{{/each}}
</ul>
20 changes: 19 additions & 1 deletion views/drones/update-form.hbs
Original file line number Diff line number Diff line change
@@ -1 +1,19 @@
<h2>Update the drone</h2>
<h2>Update the drone</h2>

<h2>Edit the drone : {{drone.name}}</h2>

<form action="/drones/{{drone._id}}/edit" method="post">
<label> Name:
<input type="text" name="name" value="{{drone.name}}" />
</label>

<label> Propeller :
<input type="number" name="propellers" value="{{drone.propellers}}" />
</label>

<label> Max Speed:
<input type="number" name="maxSpeed" min="1" value="{{drone.maxSpeed}}" />
</label>

<button >Save changes</button>
</form>
9 changes: 9 additions & 0 deletions views/layout.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@
</head>

<body>
<header>
<nav>

<a href="/">Home</a>
<!-- Add other navigation links -->
<a href="/drones">Drones</a>
<a href="/drones/create">Create</a>
</nav>
</header>

{{{body}}}

Expand Down