#!/bin/bash set -e echo "Initializing La Huasca database (local version)..." sudo -u postgres psql -d lahuasca << 'EOF' -- Create all tables CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, role VARCHAR(20) NOT NULL CHECK (role IN ('admin', 'user')), comments_disabled BOOLEAN DEFAULT FALSE, first_name VARCHAR(100), last_name VARCHAR(100), email VARCHAR(255), phone VARCHAR(50), country VARCHAR(100), preferred_language VARCHAR(10) DEFAULT 'es', terms_accepted_at TIMESTAMP, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS images ( id SERIAL PRIMARY KEY, filename VARCHAR(255) NOT NULL, data TEXT NOT NULL, category VARCHAR(100) DEFAULT 'other', room_id INTEGER REFERENCES rooms(id) ON DELETE SET NULL, location_target VARCHAR(100) DEFAULT 'gallery', uploaded_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS reservations ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, date DATE NOT NULL, time TIME NOT NULL, guests INTEGER NOT NULL, table_name VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS coupons ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, code VARCHAR(50) NOT NULL, discount VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS offers ( id SERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL, description TEXT NOT NULL, active BOOLEAN DEFAULT TRUE, sort_order INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS benefits ( id SERIAL PRIMARY KEY, text VARCHAR(500) NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS config ( key VARCHAR(100) PRIMARY KEY, value TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS rooms ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT NOT NULL, price NUMERIC(10,2) NOT NULL, photos TEXT[] DEFAULT '{}', featured_photo VARCHAR(500), active BOOLEAN DEFAULT TRUE, sort_order INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS menu_items ( id SERIAL PRIMARY KEY, category VARCHAR(100) NOT NULL, name VARCHAR(255) NOT NULL, description TEXT, price NUMERIC(10,2) NOT NULL, is_daily_special BOOLEAN DEFAULT FALSE, active BOOLEAN DEFAULT TRUE, sort_order INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS places ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT NOT NULL, photos TEXT[] DEFAULT '{}', featured_photo VARCHAR(500), distance_km NUMERIC(8,2), visit_time VARCHAR(100), suggestion TEXT, active BOOLEAN DEFAULT TRUE, sort_order INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS reviews ( id SERIAL PRIMARY KEY, author_name VARCHAR(255) NOT NULL, rating INTEGER NOT NULL CHECK (rating BETWEEN 1 AND 5), text TEXT NOT NULL, approved BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS slides ( id SERIAL PRIMARY KEY, title VARCHAR(255), subtitle TEXT, image_id INTEGER REFERENCES images(id) ON DELETE SET NULL, image_url TEXT, active BOOLEAN DEFAULT TRUE, sort_order INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS room_comments ( id SERIAL PRIMARY KEY, room_id INTEGER REFERENCES rooms(id) ON DELETE CASCADE, photo_url VARCHAR(500), user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, first_name VARCHAR(100) NOT NULL, last_initial VARCHAR(10), text TEXT NOT NULL, created_at TIMESTAMP DEFAULT NOW(), deleted_by_admin BOOLEAN DEFAULT FALSE ); CREATE TABLE IF NOT EXISTS social_events ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, description TEXT, price VARCHAR(50), date DATE, photos TEXT[] DEFAULT '{}', featured_photo VARCHAR(500), active BOOLEAN DEFAULT TRUE, sort_order INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS social_event_reservations ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, social_event_id INTEGER REFERENCES social_events(id) ON DELETE CASCADE, guests INTEGER NOT NULL, notes TEXT, status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'confirmed', 'cancelled')), created_at TIMESTAMP DEFAULT NOW(), UNIQUE(user_id, social_event_id) ); CREATE TABLE IF NOT EXISTS calendar_events ( id SERIAL PRIMARY KEY, date DATE NOT NULL UNIQUE, title VARCHAR(255) NOT NULL, type VARCHAR(100) NOT NULL, description TEXT, color VARCHAR(20) NOT NULL, active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS terms_of_service ( id SERIAL PRIMARY KEY, language VARCHAR(10) NOT NULL UNIQUE, title VARCHAR(255) NOT NULL, content TEXT NOT NULL, version VARCHAR(20) DEFAULT '1.0', created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS user_sessions ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, token TEXT NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS availability ( id SERIAL PRIMARY KEY, room_id INTEGER REFERENCES rooms(id) ON DELETE CASCADE, date DATE NOT NULL, status VARCHAR(20) NOT NULL DEFAULT 'available' CHECK (status IN ('available', 'booked', 'maintenance')), price NUMERIC(10,2), created_at TIMESTAMP DEFAULT NOW(), UNIQUE(room_id, date) ); -- Add missing columns ALTER TABLE rooms ADD COLUMN IF NOT EXISTS featured_photo VARCHAR(500); ALTER TABLE users ADD COLUMN IF NOT EXISTS comments_disabled BOOLEAN DEFAULT FALSE; ALTER TABLE users ADD COLUMN IF NOT EXISTS first_name VARCHAR(100); ALTER TABLE users ADD COLUMN IF NOT EXISTS last_name VARCHAR(100); ALTER TABLE users ADD COLUMN IF NOT EXISTS email VARCHAR(255); ALTER TABLE users ADD COLUMN IF NOT EXISTS phone VARCHAR(50); ALTER TABLE users ADD COLUMN IF NOT EXISTS country VARCHAR(100); ALTER TABLE users ADD COLUMN IF NOT EXISTS preferred_language VARCHAR(10) DEFAULT 'es'; ALTER TABLE users ADD COLUMN IF NOT EXISTS terms_accepted_at TIMESTAMP; -- Fix slides.image_url to TEXT (was VARCHAR(500), too short for base64) ALTER TABLE slides ALTER COLUMN image_url TYPE TEXT; -- Seed initial data INSERT INTO users (username, password_hash, role) VALUES ('admin', '$2a$10$8K1p/a0dhrxiowP.dnkgNORTWgdEDHn5L2/xjpEWuC.QQv4rKO9jO', 'admin') ON CONFLICT (username) DO NOTHING; INSERT INTO config (key, value) VALUES ('wifi_password', 'LaHuascaGuest2026'), ('tagline', 'Hotel · Restaurant · Andean Highlands') ON CONFLICT (key) DO NOTHING; INSERT INTO offers (title, description) VALUES ('Summer Wine Weekend', 'Complimentary wine tasting with every two-night stay.'), ('Sunset Dinner', 'Three-course menu on the terrace every Friday.') ON CONFLICT DO NOTHING; INSERT INTO benefits (text) VALUES ('Priority booking for peak weekends'), ('Late checkout on availability'), ('Free welcome cocktail'), ('Member-only events and tastings') ON CONFLICT DO NOTHING; EOF echo "Verifying database tables..." sudo -u postgres psql -d lahuasca -c "\dt" echo "Database initialization completed successfully!"