server/routes/cancellations.js Repository wynajem_motorowek Original path server/routes/cancellations.jsRole SOURCE Size 2416 bytes Lines 62 SHA-256 f506423e3438292db125c322ee48d9e2ae9f1d56f6a3e5a4bb3cb40a130cc566Displayed range 1–62 Previous file/page · Project index · Next file/page
const express = require("express");
const { requestRefund } = require("../lib/payment_gateway");
const { sendCancellationEmails } = require("../lib/notifications");
module.exports = function cancellationsRoute({ db }) {
const router = express.Router();
router.post("/request", async (req, res, next) => {
try {
const orderNumber = String(req.body?.orderNumber || "").trim();
const cancelToken = String(req.body?.cancelToken || "").trim();
if (!orderNumber) return res.status(400).json({ ok: false, reason: "ORDER_NUMBER_REQUIRED" });
if (!cancelToken) return res.status(400).json({ ok: false, reason: "CANCEL_TOKEN_REQUIRED" });
const reservationResult = await db.query(
`SELECT id, status, payment_status, payment_method, payment_ref, order_number, customer_email
FROM reservations
WHERE order_number = ? AND cancel_token = ?
LIMIT 1`,
[orderNumber, cancelToken]
);
const reservation = reservationResult.rows[0];
if (!reservation) return res.status(404).json({ ok: false, reason: "NOT_FOUND" });
if (!["CONFIRMED", "HOLD"].includes(String(reservation.status || ""))) {
return res.status(409).json({ ok: false, reason: "ALREADY_CLOSED" });
}
let nextPaymentStatus = "CANCELLED";
if (String(reservation.payment_status || "") === "PAID" && String(reservation.payment_method || "ONLINE") === "ONLINE") {
const refund = await requestRefund({ reservation });
nextPaymentStatus = "REFUND_REQUESTED";
await db.query(
`UPDATE reservations
SET payment_ref = ?
WHERE id = ?`,
[refund.refundReference || reservation.payment_ref, reservation.id]
);
}
await db.query(
`UPDATE reservations
SET status = 'CANCELLED',
payment_status = ?
WHERE id = ?`,
[nextPaymentStatus, reservation.id]
);
const updated = (await db.query(`SELECT * FROM reservations WHERE id = ? LIMIT 1`, [reservation.id])).rows[0];
try {
await sendCancellationEmails({ db, reservation: updated, reason: "Klient anulował" });
} catch (mailError) {
console.error("[cancellations] cancellation email failed", String(mailError && mailError.message ? mailError.message : mailError));
}
return res.json({ ok: true, status: "CANCELLED", paymentStatus: nextPaymentStatus });
} catch (err) {
next(err);
}
});
return router;
};