#!/bin/bash # Database initialization script for La Huasca # This script creates the necessary tables and seeds initial data set -e # Exit on any error echo "Initializing La Huasca database..." # Get the postgres pod name POSTGRES_POD=$(kubectl get pods -n lahuasca | grep postgres | awk '{print $1}') if [ -z "$POSTGRES_POD" ]; then echo "Error: Could not find postgres pod" exit 1 fi echo "Found postgres pod: $POSTGRES_POD" # Create the SQL file with schema definitions cat > /tmp/schema.sql << '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), 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 VARCHAR(500), 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 ); 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() ); -- Add missing columns if they don't exist 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); -- Insert initial data -- Default admin user (password: admin) INSERT INTO users (username, password_hash, role) VALUES ('admin', '$2a$10$8K1p/a0dhrxiowP.dnkgNORTWgdEDHn5L2/xjpEWuC.QQv4rKO9jO', 'admin') ON CONFLICT (username) DO NOTHING; -- Default config values INSERT INTO config (key, value) VALUES ('wifi_password', 'LaHuascaGuest2026'), ('tagline', 'Hotel · Restaurant · Andean Highlands') ON CONFLICT (key) DO NOTHING; -- Sample offers INSERT INTO offers (title, description, active, sort_order) VALUES ('Summer Wine Weekend', 'Complimentary wine tasting with every two-night stay.', true, 1), ('Sunset Dinner', 'Three-course menu on the terrace every Friday.', true, 2) ON CONFLICT DO NOTHING; -- Sample benefits 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 # Copy the schema file to the postgres pod echo "Copying schema to postgres pod..." kubectl cp /tmp/schema.sql lahuasca/$POSTGRES_POD:/tmp/schema.sql # Execute the schema echo "Executing database schema..." kubectl exec -n lahuasca $POSTGRES_POD -- psql -U lahuasca -d lahuasca -f /tmp/schema.sql # Verify that the tables were created echo "Verifying database tables..." kubectl exec -n lahuasca deploy/postgres -- psql -U lahuasca -d lahuasca -c "\dt" echo "Database initialization completed successfully!"