feat: бронирование товаров и сброс пароля по email

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shop
2026-05-17 11:38:52 +03:00
parent bda73e1662
commit ade031b0e7
22 changed files with 666 additions and 3 deletions
+25 -1
View File
@@ -6,6 +6,7 @@ const { requireAuth } = require('../middleware/auth');
const { requireCookieConsent } = require('../middleware/cookieConsent');
const { ROLE_LABELS } = require('../constants/roles');
const { asyncHandler } = require('../utils/asyncHandler');
const { expireOldReservations } = require('../services/reservations');
const router = express.Router();
@@ -35,12 +36,22 @@ async function verifyPassword(userId, password) {
}
function accountRender(res, options) {
const { user, orderCount, error, success, activeTab } = options;
const {
user,
orderCount,
reservations,
error,
success,
activeTab,
formatPrice,
} = options;
res.render('account/index', {
title: 'Личный кабинет',
user,
orderCount,
reservations: reservations || [],
roleLabels: ROLE_LABELS,
formatPrice: formatPrice || res.locals.formatPrice,
error: error || null,
success: success || null,
activeTab: activeTab || 'profile',
@@ -51,14 +62,27 @@ router.get(
'/',
requireAuth,
asyncHandler(async (req, res) => {
await expireOldReservations();
const user = await loadAccountUser(req.session.userId);
const countResult = await query(
'SELECT COUNT(*)::int AS n FROM orders WHERE user_id = $1',
[user.id]
);
const { rows: reservations } = await query(
`SELECT r.*, p.name AS product_name, p.slug AS product_slug, p.price_cents, p.image_url
FROM reservations r
JOIN products p ON p.id = r.product_id
WHERE r.user_id = $1
ORDER BY r.created_at DESC`,
[user.id]
);
accountRender(res, {
user,
orderCount: countResult.rows[0].n,
reservations,
formatPrice,
success: req.query.success ? decodeURIComponent(String(req.query.success)) : null,
error: req.query.error ? decodeURIComponent(String(req.query.error)) : null,
activeTab: req.query.tab || 'profile',