const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const nodemailer = require('nodemailer');
const app = express();
app.use(bodyParser.json());
mongoose.connect('mongodb://localhost:27017/rezervace', {
useNewUrlParser: true,
useUnifiedTopology: true
});
const UserSchema = new mongoose.Schema({
username: String,
password: String,
role: String
});
const RezervaceSchema = new mongoose.Schema({
jmeno: String,
email: String,
datumOd: Date,
datumDo: Date,
auto: String
});
const User = mongoose.model('User', UserSchema);
const Rezervace = mongoose.model('Rezervace', RezervaceSchema);
// Middleware pro autentizaci
const authenticateJWT = (req, res, next) => {
const token = req.header('Authorization').replace('Bearer ', '');
if (!token) {
return res.status(401).send('Přístup zamítnut');
}
try {
const decoded = jwt.verify(token, 'secretkey');
req.user = decoded;
next();
} catch (e) {
res.status(401).send('Neplatný token');
}
};
// Middleware pro autorizaci administrátora
const authorizeAdmin = (req, res, next) => {
if (req.user.role !== 'admin') {
return res.status(403).send('Přístup zamítnut');
}
next();
};
// Přihlášení uživatele
app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = await User.findOne({ username, password });
if (!user) {
return res.status(400).send('Nesprávné přihlašovací údaje');
}
const token = jwt.sign({ id: user._id, role: user.role }, 'secretkey', { expiresIn: '1h' });
res.send({ token });
});
// Vytvoření nové rezervace
app.post('/rezervace', authenticateJWT, async (req, res) => {
const { jmeno, email, datumOd, datumDo, auto } = req.body;
// Kontrola konfliktů
const konflikt = await Rezervace.findOne({
auto,
$or: [
{ datumOd: { $lt: datumDo, $gte: datumOd } },
{ datumDo: { $gt: datumOd, $lte: datumDo } },
]
});
if (konflikt) {
return res.status(400).send('Auto je v tomto termínu již rezervováno');
}
const novaRezervace = new Rezervace({ jmeno, email, datumOd, datumDo, auto });
try {
await novaRezervace.save();
// Odeslání e-mailu
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'tvuj-email@gmail.com',
pass: 'tvuj-email-heslo'
}
});
const mailOptions = {
from: 'tvuj-email@gmail.com',
to: email,
subject: 'Potvrzení rezervace',
text: `Rezervace byla úspěšně vytvořena. Auto: ${auto}, Od: ${datumOd}, Do: ${datumDo}`
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log('Email sent: ' + info.response);
});
res.status(201).send(novaRezervace);
} catch (e) {
res.status(400).send(e);
}
});
// Získání všech rezervací (jen pro admina)
app.get('/rezervace', authenticateJWT, authorizeAdmin, async (req, res) => {
try {
const rezervace = await Rezervace.find({});
res.status(200).send(rezervace);
} catch (e) {
res.status(500).send(e);
}
});
// Aktualizace rezervace (jen pro admina)
app.patch('/rezervace/:id', authenticateJWT, authorizeAdmin, async (req, res) => {
try {
const rezervace = await Rezervace.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true });
if (!rezervace) {
return res.status(404).send();
}
res.send(rezervace);
} catch (e) {
res.status(400).send(e);
}
});
// Smazání rezervace (jen pro admina)
app.delete('/rezervace/:id', authenticateJWT, authorizeAdmin, async (req, res) => {
try {
const rezervace = await Rezervace.findByIdAndDelete(req.params.id);
if (!rezervace) {
return res.status(404).send();
}
res.send(rezervace);
} catch (e) {
res.status(500).send(e);
}
});
app.listen(3000, () => {
console.log('Server běží na portu 3000');
});
adminTest
Vložte svůj text...