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...

Rezervace obytného auta

Rezervace obytného auta

Aktuální rezervace