97 lines
4.1 KiB
JavaScript
97 lines
4.1 KiB
JavaScript
let db;
|
||
|
||
function init(database) {
|
||
db = database;
|
||
}
|
||
|
||
function getAll(req, res) {
|
||
db.all(`SELECT * FROM seasonal_prices ORDER BY date_from ASC`, [], (err, rows) => {
|
||
if (err) return res.status(500).json({ error: 'Database error' });
|
||
res.json(rows);
|
||
});
|
||
}
|
||
|
||
function create(req, res) {
|
||
const { room_type, date_from, date_to, price_per_night, label, is_active } = req.body;
|
||
if (!room_type || !date_from || !date_to || !price_per_night) {
|
||
return res.status(400).json({ error: 'room_type, date_from, date_to и price_per_night обязательны' });
|
||
}
|
||
if (new Date(date_to) <= new Date(date_from)) {
|
||
return res.status(400).json({ error: 'date_to должна быть позже date_from' });
|
||
}
|
||
db.run(
|
||
`INSERT INTO seasonal_prices (room_type, date_from, date_to, price_per_night, label, is_active) VALUES (?, ?, ?, ?, ?, ?)`,
|
||
[room_type, date_from, date_to, price_per_night, label || null, is_active !== undefined ? (is_active ? 1 : 0) : 1],
|
||
function(err) {
|
||
if (err) return res.status(500).json({ error: 'Database error' });
|
||
db.get(`SELECT * FROM seasonal_prices WHERE id = ?`, [this.lastID], (err, row) => {
|
||
if (err) return res.status(500).json({ error: 'Database error' });
|
||
res.status(201).json(row);
|
||
});
|
||
}
|
||
);
|
||
}
|
||
|
||
function update(req, res) {
|
||
const { id } = req.params;
|
||
const { room_type, date_from, date_to, price_per_night, label, is_active } = req.body;
|
||
|
||
db.get(`SELECT * FROM seasonal_prices WHERE id = ?`, [id], (err, row) => {
|
||
if (err) return res.status(500).json({ error: 'Database error' });
|
||
if (!row) return res.status(404).json({ error: 'Не найдено' });
|
||
|
||
const newRoomType = room_type ?? row.room_type;
|
||
const newDateFrom = date_from ?? row.date_from;
|
||
const newDateTo = date_to ?? row.date_to;
|
||
|
||
if (new Date(newDateTo) <= new Date(newDateFrom)) {
|
||
return res.status(400).json({ error: 'date_to должна быть позже date_from' });
|
||
}
|
||
|
||
db.run(
|
||
`UPDATE seasonal_prices SET room_type=?, date_from=?, date_to=?, price_per_night=?, label=?, is_active=? WHERE id=?`,
|
||
[newRoomType, newDateFrom, newDateTo,
|
||
price_per_night ?? row.price_per_night,
|
||
label !== undefined ? label : row.label,
|
||
is_active !== undefined ? (is_active ? 1 : 0) : row.is_active,
|
||
id],
|
||
function(err) {
|
||
if (err) return res.status(500).json({ error: 'Database error' });
|
||
db.get(`SELECT * FROM seasonal_prices WHERE id = ?`, [id], (err, row) => {
|
||
if (err) return res.status(500).json({ error: 'Database error' });
|
||
res.json(row);
|
||
});
|
||
}
|
||
);
|
||
});
|
||
}
|
||
|
||
function remove(req, res) {
|
||
const { id } = req.params;
|
||
db.run(`DELETE FROM seasonal_prices WHERE id = ?`, [id], function(err) {
|
||
if (err) return res.status(500).json({ error: 'Database error' });
|
||
if (this.changes === 0) return res.status(404).json({ error: 'Не найдено' });
|
||
res.json({ message: 'Сезонная цена удалена' });
|
||
});
|
||
}
|
||
|
||
function getSeasonalPrice(roomType, date, callback) {
|
||
db.get(
|
||
`SELECT price_per_night FROM seasonal_prices WHERE room_type = ? AND is_active = 1 AND date_from <= ? AND date_to >= ? ORDER BY date_from DESC LIMIT 1`,
|
||
[roomType, date, date],
|
||
(err, row) => {
|
||
if (err) return callback(err, null);
|
||
callback(null, row ? row.price_per_night : null);
|
||
}
|
||
);
|
||
}
|
||
|
||
function setupRoutes(app, authenticateToken, requireAdmin) {
|
||
app.get('/api/admin/seasonal-prices', authenticateToken, requireAdmin, getAll);
|
||
app.post('/api/admin/seasonal-prices', authenticateToken, requireAdmin, create);
|
||
app.put('/api/admin/seasonal-prices/:id', authenticateToken, requireAdmin, update);
|
||
app.delete('/api/admin/seasonal-prices/:id', authenticateToken, requireAdmin, remove);
|
||
}
|
||
|
||
module.exports = { init, setupRoutes, getSeasonalPrice };
|