server/routes/availability.js Repository wynajem_motorowek Original path server/routes/availability.jsRole SOURCE Size 1688 bytes Lines 62 SHA-256 219ac97d8725b57254815cc027c61e23d79c00a75b8b63183e0504b630f93e49Displayed range 1–62 Previous file/page · Project index · Next file/page
const express = require("express");
const { parseDateKey } = require("../lib/time");
module.exports = function availabilityRoute({ db }) {
const router = express.Router();
router.get("/", async (req, res, next) => {
try {
const date = String(req.query.date || "");
const dateObj = parseDateKey(date);
if (!dateObj) {
return res.status(400).json({ ok: false, reason: "INVALID_DATE" });
}
const dayStart = `${date} 08:00:00`;
const dayEnd = `${date} 20:00:00`;
const { rows } = await db.query(
`SELECT r.name AS resource_name,
rv.start_time AS start_local,
rv.end_time AS end_local,
'BUSY' AS block_type
FROM reservations rv
JOIN resources r ON r.id = rv.resource_id
WHERE rv.status IN ('HOLD', 'CONFIRMED')
AND rv.start_time < ?
AND rv.end_time > ?
UNION ALL
SELECT r.name AS resource_name,
rv.end_time AS start_local,
datetime(rv.end_time, '+15 minutes') AS end_local,
'SERVICE' AS block_type
FROM reservations rv
JOIN resources r ON r.id = rv.resource_id
WHERE rv.status IN ('HOLD', 'CONFIRMED')
AND rv.kind = 'CUSTOMER'
AND rv.end_time < ?
AND datetime(rv.end_time, '+15 minutes') > ?
ORDER BY start_local ASC`,
[dayEnd, dayStart, dayEnd, dayStart]
);
res.json({
ok: true,
date,
blocks: rows.map((item) => ({
resourceName: item.resource_name,
start: item.start_local,
end: item.end_local,
type: item.block_type,
})),
});
} catch (err) {
next(err);
}
});
return router;
};