/
melissaaaz
/
MemoryOffice
Обзор
Документация
Войти
/
melissaaaz
/
MemoryOffice
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
back/controllers.js
218 строк
7 KB
melissaaaz
upload files Backend
19 дек 2025, 21:53
19 дек 2025, 21:53
c280ed0
Код
Авторство
О чём код?
const bcrypt = require('bcryptjs'); const { generateToken } = require('./middlewares'); const { User, Route, Like, Booking } = require('./database'); // Аутентификация const authController = { register: (req, res) => { const { email, password, name } = req.body; if (!email || !password || !name) { return res.status(400).json({ error: 'Все поля обязательны' }); } User.findByEmail(email, (err, existingUser) => { if (err) return res.status(500).json({ error: 'Ошибка сервера' }); if (existingUser) return res.status(400).json({ error: 'Пользователь уже существует' }); User.register(email, password, name, (err, user) => { if (err) return res.status(500).json({ error: 'Ошибка регистрации' }); const token = generateToken(user.id); res.status(201).json({ message: 'Регистрация успешна', token, user: { id: user.id, email: user.email, name: user.name } }); }); }); }, login: (req, res) => { const { email, password } = req.body; if (!email || !password) { return res.status(400).json({ error: 'Email и пароль обязательны' }); } User.findByEmail(email, (err, user) => { if (err) return res.status(500).json({ error: 'Ошибка сервера' }); if (!user) return res.status(401).json({ error: 'Неверный email или пароль' }); bcrypt.compare(password, user.password, (err, isMatch) => { if (err) return res.status(500).json({ error: 'Ошибка сервера' }); if (!isMatch) return res.status(401).json({ error: 'Неверный email или пароль' }); const token = generateToken(user.id); res.json({ message: 'Вход выполнен', token, user: { id: user.id, email: user.email, name: user.name } }); }); }); }, getCurrentUser: (req, res) => { User.findById(req.userId, (err, user) => { if (err) return res.status(500).json({ error: 'Ошибка сервера' }); if (!user) return res.status(404).json({ error: 'Пользователь не найден' }); res.json(user); }); } }; // Маршруты const routeController = { getAllRoutes: (req, res) => { const filters = { city: req.query.city, difficulty: req.query.difficulty, maxPrice: req.query.maxPrice, search: req.query.search }; Route.getAll(filters, (err, routes) => { if (err) return res.status(500).json({ error: 'Ошибка получения маршрутов' }); if (req.userId) { Like.getUserFavorites(req.userId, (err, favorites) => { if (!err && favorites) { const favoriteIds = new Set(favorites.map(fav => fav.id)); routes.forEach(route => { route.isLiked = favoriteIds.has(route.id); }); } res.json(routes); }); } else { res.json(routes); } }); }, getRouteById: (req, res) => { const { id } = req.params; Route.getById(id, (err, route) => { if (err) return res.status(500).json({ error: 'Ошибка получения маршрута' }); if (!route) return res.status(404).json({ error: 'Маршрут не найден' }); if (route.full_description) { try { route.full_description = JSON.parse(route.full_description); } catch (e) {} } if (req.userId) { Like.check(req.userId, id, (err, like) => { route.isLiked = !!like; res.json(route); }); } else { res.json(route); } }); }, createRoute: (req, res) => { const routeData = req.body; if (!routeData.title || !routeData.city || !routeData.description) { return res.status(400).json({ error: 'Заполните обязательные поля' }); } Route.create(routeData, (err, route) => { if (err) return res.status(500).json({ error: 'Ошибка создания маршрута' }); res.status(201).json({ message: 'Маршрут создан', route }); }); }, addToFavorites: (req, res) => { const { routeId } = req.params; const userId = req.userId; Like.add(userId, routeId, (err) => { if (err) return res.status(500).json({ error: 'Ошибка добавления в избранное' }); res.json({ message: 'Добавлено в избранное' }); }); }, removeFromFavorites: (req, res) => { const { routeId } = req.params; const userId = req.userId; Like.remove(userId, routeId, (err) => { if (err) return res.status(500).json({ error: 'Ошибка удаления из избранного' }); res.json({ message: 'Удалено из избранного' }); }); }, getFavorites: (req, res) => { const userId = req.userId; Like.getUserFavorites(userId, (err, routes) => { if (err) return res.status(500).json({ error: 'Ошибка получения избранного' }); const favorites = routes.map(route => { route.isLiked = true; return route; }); res.json(favorites); }); } }; // Бронирования const bookingController = { createBooking: (req, res) => { const { routeId, bookingDate, numberOfPeople } = req.body; const userId = req.userId; if (!routeId || !bookingDate || !numberOfPeople) { return res.status(400).json({ error: 'Все поля обязательны' }); } Route.getById(routeId, (err, route) => { if (err || !route) return res.status(404).json({ error: 'Маршрут не найден' }); const totalPrice = route.price * numberOfPeople; const bookingData = { user_id: userId, route_id: routeId, booking_date: bookingDate, number_of_people: numberOfPeople, total_price: totalPrice }; Booking.create(bookingData, (err, booking) => { if (err) return res.status(500).json({ error: 'Ошибка создания записи' }); res.status(201).json({ message: 'Запись создана', booking: { ...booking, routeTitle: route.title, routeCity: route.city } }); }); }); }, getUserBookings: (req, res) => { const userId = req.userId; Booking.getUserBookings(userId, (err, bookings) => { if (err) return res.status(500).json({ error: 'Ошибка получения записей' }); res.json(bookings); }); } }; module.exports = { authController, routeController, bookingController };