-- Create Users table CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(120) UNIQUE NOT NULL, age INTEGER NOT NULL, location VARCHAR(100) NOT NULL, gender VARCHAR(10) NOT NULL, password_hash VARCHAR(128) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create Messages table CREATE TABLE IF NOT EXISTS messages ( id SERIAL PRIMARY KEY, sender_id INTEGER NOT NULL REFERENCES users(id), receiver_id INTEGER NOT NULL REFERENCES users(id), content VARCHAR(500) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Create index for faster queries on location CREATE INDEX IF NOT EXISTS idx_users_location ON users(location); -- Create indexes for faster message retrieval CREATE INDEX IF NOT EXISTS idx_messages_sender ON messages(sender_id); CREATE INDEX IF NOT EXISTS idx_messages_receiver ON messages(receiver_id); -- Function to update the updated_at column CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ language 'plpgsql'; -- Drop the trigger if it already exists to avoid conflicts DROP TRIGGER IF EXISTS update_users_updated_at ON users; -- Create trigger to automatically update the updated_at column CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- Grant necessary permissions to workout_user GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO workout_user; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO workout_user;