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:
@@ -5,10 +5,7 @@ import { getSession } from '@/lib/auth';
|
|||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
try {
|
try {
|
||||||
const user = await getSession();
|
const user = await getSession();
|
||||||
const body = await request.json();
|
const { room_id, message, guest_name, guest_contact_method, guest_contact } = await request.json();
|
||||||
|
|
||||||
// Support both logged-in users and guests
|
|
||||||
const { room_id, message, guest_name, guest_contact_method, guest_contact } = body;
|
|
||||||
|
|
||||||
if (!message || !message.trim()) {
|
if (!message || !message.trim()) {
|
||||||
return NextResponse.json({ error: 'Message is required' }, { status: 400 });
|
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 });
|
return NextResponse.json({ error: 'Name and contact info are required' }, { status: 400 });
|
||||||
}
|
}
|
||||||
|
|
||||||
let finalMessage = message.trim();
|
// Insert message - for guests, user_id is NULL
|
||||||
let finalUserId = user?.id || null;
|
const { rows } = await db.query(`
|
||||||
|
INSERT INTO messages (room_id, user_id, message, guest_name, guest_contact_method, guest_contact)
|
||||||
// For guests, prepend their contact info to the message
|
VALUES ($1, $2, $3, $4, $5, $6)
|
||||||
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)
|
|
||||||
RETURNING *
|
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
|
// 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)`);
|
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
|
SELECT m.*, r.name as room_name, u.username, u.first_name, u.last_name, u.email, u.phone
|
||||||
FROM messages m
|
FROM messages m
|
||||||
LEFT JOIN rooms r ON m.room_id = r.id
|
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) {
|
if (unreadOnly) {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export async function POST(request: Request) {
|
|||||||
|
|
||||||
// Check for conflicting reservations
|
// Check for conflicting reservations
|
||||||
const { rows: conflicts } = await db.query(`
|
const { rows: conflicts } = await db.query(`
|
||||||
SELECT * FROM reservations
|
SELECT * FROM room_reservations
|
||||||
WHERE room_id = $1
|
WHERE room_id = $1
|
||||||
AND status != 'cancelled'
|
AND status != 'cancelled'
|
||||||
AND (
|
AND (
|
||||||
@@ -61,7 +61,7 @@ export async function POST(request: Request) {
|
|||||||
|
|
||||||
// Create reservation - for guests, user_id is NULL
|
// Create reservation - for guests, user_id is NULL
|
||||||
const { rows } = await db.query(`
|
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)
|
VALUES ($1, $2, $3, $4, 'pending', $5, $6, $7, $8)
|
||||||
RETURNING *
|
RETURNING *
|
||||||
`, [
|
`, [
|
||||||
@@ -120,7 +120,7 @@ export async function GET(request: Request) {
|
|||||||
let query = `
|
let query = `
|
||||||
SELECT r.*, rm.name as room_name,
|
SELECT r.*, rm.name as room_name,
|
||||||
u.username, u.first_name, u.last_name, u.email, u.phone
|
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
|
JOIN rooms rm ON r.room_id = rm.id
|
||||||
LEFT JOIN users u ON r.user_id = u.id
|
LEFT JOIN users u ON r.user_id = u.id
|
||||||
`;
|
`;
|
||||||
|
|||||||
+6
-6
@@ -316,7 +316,7 @@ export async function initSchema() {
|
|||||||
`);
|
`);
|
||||||
|
|
||||||
await db.query(`
|
await db.query(`
|
||||||
CREATE TABLE IF NOT EXISTS reservations (
|
CREATE TABLE IF NOT EXISTS room_reservations (
|
||||||
id SERIAL PRIMARY KEY,
|
id SERIAL PRIMARY KEY,
|
||||||
room_id INTEGER NOT NULL REFERENCES rooms(id),
|
room_id INTEGER NOT NULL REFERENCES rooms(id),
|
||||||
user_id INTEGER REFERENCES users(id),
|
user_id INTEGER REFERENCES users(id),
|
||||||
@@ -360,11 +360,11 @@ export async function initSchema() {
|
|||||||
|
|
||||||
await db.query(`ALTER TABLE room_comments ADD COLUMN IF NOT EXISTS status VARCHAR(20) DEFAULT 'approved'`);
|
await db.query(`ALTER TABLE room_comments ADD COLUMN IF NOT EXISTS status VARCHAR(20) DEFAULT 'approved'`);
|
||||||
|
|
||||||
// Add guest columns to reservations
|
// Add guest columns to room_reservations
|
||||||
await db.query(`ALTER TABLE reservations ADD COLUMN IF NOT EXISTS guest_name VARCHAR(100)`);
|
await db.query(`ALTER TABLE room_reservations ADD COLUMN IF NOT EXISTS guest_name VARCHAR(100)`);
|
||||||
await db.query(`ALTER TABLE reservations ADD COLUMN IF NOT EXISTS guest_contact_method VARCHAR(20)`);
|
await db.query(`ALTER TABLE room_reservations ADD COLUMN IF NOT EXISTS guest_contact_method VARCHAR(20)`);
|
||||||
await db.query(`ALTER TABLE reservations ADD COLUMN IF NOT EXISTS guest_contact VARCHAR(255)`);
|
await db.query(`ALTER TABLE room_reservations ADD COLUMN IF NOT EXISTS guest_contact VARCHAR(255)`);
|
||||||
await db.query(`ALTER TABLE reservations ALTER COLUMN user_id DROP NOT NULL`);
|
await db.query(`ALTER TABLE room_reservations ALTER COLUMN user_id DROP NOT NULL`);
|
||||||
|
|
||||||
// Add guest columns to messages
|
// Add guest columns to messages
|
||||||
await db.query(`ALTER TABLE messages ADD COLUMN IF NOT EXISTS guest_name VARCHAR(100)`);
|
await db.query(`ALTER TABLE messages ADD COLUMN IF NOT EXISTS guest_name VARCHAR(100)`);
|
||||||
|
|||||||
Reference in New Issue
Block a user