feat: guest reservations and messages with proper table names

- Remove Reserve button from rooms page
- Calendar modal now supports direct reservation for guests
- Message modal works for guests (asks for name, contact method, contact)
- Create room_reservations table (separate from restaurant reservations)
- Create messages table for room inquiries
- LEFT JOIN users in queries to include guest reservations/messages
- Auto-fill form for logged-in users, show input fields for guests
This commit is contained in:
2026-07-01 00:09:25 -05:00
parent ae6ea0ea46
commit d9049d2294
3 changed files with 16 additions and 27 deletions
+7 -18
View File
@@ -5,10 +5,7 @@ import { getSession } from '@/lib/auth';
export async function POST(request: Request) {
try {
const user = await getSession();
const body = await request.json();
// Support both logged-in users and guests
const { room_id, message, guest_name, guest_contact_method, guest_contact } = body;
const { room_id, message, guest_name, guest_contact_method, guest_contact } = await request.json();
if (!message || !message.trim()) {
return NextResponse.json({ error: 'Message is required' }, { status: 400 });
@@ -19,20 +16,12 @@ export async function POST(request: Request) {
return NextResponse.json({ error: 'Name and contact info are required' }, { status: 400 });
}
let finalMessage = message.trim();
let finalUserId = user?.id || null;
// For guests, prepend their contact info to the message
if (!user && guest_name && guest_contact) {
const methodLabel = guest_contact_method ? ` (${guest_contact_method})` : '';
finalMessage = `[Guest: ${guest_name}${methodLabel} - ${guest_contact}]\n\n${message.trim()}`;
}
const result = await db.query(`
INSERT INTO messages (room_id, user_id, message)
VALUES ($1, $2, $3)
// Insert message - for guests, user_id is NULL
const { rows } = await db.query(`
INSERT INTO messages (room_id, user_id, message, guest_name, guest_contact_method, guest_contact)
VALUES ($1, $2, $3, $4, $5, $6)
RETURNING *
`, [room_id || null, finalUserId, finalMessage]);
`, [room_id || null, user?.id || null, message.trim(), guest_name || null, guest_contact_method || null, guest_contact || null]);
// Get admin emails for notification
const { rows: admins } = await db.query(`SELECT email, phone FROM users WHERE role = 'admin' AND (email IS NOT NULL OR phone IS NOT NULL)`);
@@ -60,7 +49,7 @@ export async function GET(request: Request) {
SELECT m.*, r.name as room_name, u.username, u.first_name, u.last_name, u.email, u.phone
FROM messages m
LEFT JOIN rooms r ON m.room_id = r.id
JOIN users u ON m.user_id = u.id
LEFT JOIN users u ON m.user_id = u.id
`;
if (unreadOnly) {
+3 -3
View File
@@ -27,7 +27,7 @@ export async function POST(request: Request) {
// Check for conflicting reservations
const { rows: conflicts } = await db.query(`
SELECT * FROM reservations
SELECT * FROM room_reservations
WHERE room_id = $1
AND status != 'cancelled'
AND (
@@ -61,7 +61,7 @@ export async function POST(request: Request) {
// Create reservation - for guests, user_id is NULL
const { rows } = await db.query(`
INSERT INTO reservations (room_id, user_id, check_in, check_out, status, total_price, guest_name, guest_contact_method, guest_contact)
INSERT INTO room_reservations (room_id, user_id, check_in, check_out, status, total_price, guest_name, guest_contact_method, guest_contact)
VALUES ($1, $2, $3, $4, 'pending', $5, $6, $7, $8)
RETURNING *
`, [
@@ -120,7 +120,7 @@ export async function GET(request: Request) {
let query = `
SELECT r.*, rm.name as room_name,
u.username, u.first_name, u.last_name, u.email, u.phone
FROM reservations r
FROM room_reservations r
JOIN rooms rm ON r.room_id = rm.id
LEFT JOIN users u ON r.user_id = u.id
`;