-- users_bot_telegram table CREATE TABLE IF NOT EXISTS public.users_bot_telegram ( id SERIAL PRIMARY KEY, -- Auto-incrementing primary key telegram_id BIGINT NOT NULL, -- Telegram user ID (not unique) username VARCHAR(255), -- Telegram username first_name VARCHAR(255), -- User's first name last_name VARCHAR(255), -- User's last name email VARCHAR(255) UNIQUE NOT NULL, -- User's email address password_hash VARCHAR(255) NOT NULL, -- Hashed password for authentication language VARCHAR(10) NOT NULL DEFAULT 'en', -- User's preferred language role VARCHAR(10) NOT NULL DEFAULT 'user', -- User role (user/admin/etc.) balance DECIMAL(10, 2) NOT NULL DEFAULT 0, -- User's account balance is_banned BOOLEAN NOT NULL DEFAULT false, -- Whether the user is banned last_login TIMESTAMPTZ, -- Timestamp of last login bot_id UUID REFERENCES public.bots(id) ON DELETE SET NULL, -- Reference to associated bot created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- Timestamp when record was created updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- Timestamp when record was last updated UNIQUE(telegram_id, bot_id) -- Composite unique constraint ); COMMENT ON TABLE public.users_bot_telegram IS 'Stores Telegram user accounts and their associated data.'; -- Enable Row Level Security ALTER TABLE public.users_bot_telegram ENABLE ROW LEVEL SECURITY; -- Policies CREATE POLICY "Users can manage their own data." ON public.users_bot_telegram FOR ALL USING (true); -- Trigger for updating timestamps CREATE TRIGGER update_users_bot_telegram_timestamp BEFORE UPDATE ON public.users_bot_telegram FOR EACH ROW EXECUTE FUNCTION update_timestamp(); -- Transactions table CREATE TABLE IF NOT EXISTS public.transactions ( id SERIAL PRIMARY KEY, -- Auto-incrementing primary key user_id INTEGER NOT NULL REFERENCES public.users_bot_telegram(id) ON DELETE CASCADE, -- Reference to user agent_id INTEGER REFERENCES public.users_bot_telegram(id) ON DELETE SET NULL, -- Reference to agent who processed transaction type VARCHAR(20) NOT NULL, -- Type of transaction (deposit/withdrawal/etc.) amount DECIMAL(10, 2) NOT NULL, -- Transaction amount reference_id VARCHAR(255), -- External reference ID description TEXT, -- Transaction description created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -- Timestamp when transaction was created ); COMMENT ON TABLE public.transactions IS 'Stores financial transactions for users.'; -- Recharge cards table CREATE TABLE IF NOT EXISTS public.recharge_cards ( id SERIAL PRIMARY KEY, -- Auto-incrementing primary key code VARCHAR(50) UNIQUE NOT NULL, -- Unique card code amount DECIMAL(10, 2) NOT NULL, -- Card value amount is_used BOOLEAN NOT NULL DEFAULT false, -- Whether card has been used is_reusable BOOLEAN NOT NULL DEFAULT false, -- Whether card can be reused created_by INTEGER NOT NULL REFERENCES public.users_bot_telegram(id) ON DELETE CASCADE, -- Who created the card used_by INTEGER REFERENCES public.users_bot_telegram(id) ON DELETE SET NULL, -- Who used the card used_at TIMESTAMPTZ, -- When card was used created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- When card was created expires_at TIMESTAMPTZ -- When card expires ); COMMENT ON TABLE public.recharge_cards IS 'Stores recharge cards for user balance top-ups.'; -- Phone numbers table CREATE TABLE IF NOT EXISTS public.phone_numbers ( id SERIAL PRIMARY KEY, -- Auto-incrementing primary key user_id INTEGER NOT NULL REFERENCES public.users_bot_telegram(id) ON DELETE CASCADE, -- Owner of the number country_code VARCHAR(10) NOT NULL, -- Country code for number service VARCHAR(50) NOT NULL, -- Service the number is for number VARCHAR(50) NOT NULL, -- Phone number price DECIMAL(10, 2) NOT NULL, -- Cost of the number status VARCHAR(20) NOT NULL DEFAULT 'pending', -- Current status of number fivesim_id VARCHAR(50) NOT NULL, -- Reference to 5sim.net ID created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- When number was acquired updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- When number was last updated expires_at TIMESTAMPTZ -- When number expires ); COMMENT ON TABLE public.phone_numbers IS 'Stores phone numbers acquired for verification services.'; -- Trigger for updating timestamps CREATE TRIGGER update_phone_numbers_timestamp BEFORE UPDATE ON public.phone_numbers FOR EACH ROW EXECUTE FUNCTION update_timestamp(); -- SMS messages table CREATE TABLE IF NOT EXISTS public.sms_messages ( id SERIAL PRIMARY KEY, -- Auto-incrementing primary key phone_number_id INTEGER NOT NULL REFERENCES public.phone_numbers(id) ON DELETE CASCADE, -- Associated phone number code VARCHAR(50) NOT NULL, -- Verification code from SMS text TEXT NOT NULL, -- Full SMS text received_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- When SMS was received is_delivered BOOLEAN NOT NULL DEFAULT false, -- Whether SMS was delivered to user delivered_at TIMESTAMPTZ -- When SMS was delivered to user ); COMMENT ON TABLE public.sms_messages IS 'Stores SMS messages received for verification services.'; -- Settings table CREATE TABLE IF NOT EXISTS public.settings ( id SERIAL PRIMARY KEY, -- Auto-incrementing primary key key VARCHAR(50) UNIQUE NOT NULL, -- Setting key value TEXT NOT NULL, -- Setting value created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- When setting was created updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -- When setting was last updated ); COMMENT ON TABLE public.settings IS 'Stores system configuration settings.'; -- Trigger for updating timestamps CREATE TRIGGER update_settings_timestamp BEFORE UPDATE ON public.settings FOR EACH ROW EXECUTE FUNCTION update_timestamp(); -- Add bots table if it doesn't exist CREATE TABLE IF NOT EXISTS public.bots ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(255) NOT NULL, user_id UUID NOT NULL, bot_token VARCHAR(255) NOT NULL UNIQUE, is_active BOOLEAN NOT NULL DEFAULT true, currency VARCHAR(10) NOT NULL DEFAULT 'USD', profit_type VARCHAR(10) NOT NULL DEFAULT 'percentage', profit_value_percentage DECIMAL(5,2) DEFAULT 0, profit_value_fix DECIMAL(10,2) DEFAULT 0, last_activity TIMESTAMPTZ, version VARCHAR(20) NOT NULL DEFAULT '1.0.0', -- API Keys and External Service Configuration fivesim_api_key VARCHAR(255), paypal_client_id VARCHAR(255), paypal_client_secret VARCHAR(255), crypto_wallet_address VARCHAR(255), admin_contact VARCHAR(255), -- Group Join Settings join_group_required BOOLEAN DEFAULT false, group_channel_username VARCHAR(255), settings JSONB DEFAULT '{}', state JSONB DEFAULT '{}', suffix_email VARCHAR(255) DEFAULT 'saerosms.com', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); COMMENT ON TABLE public.bots IS 'Stores bot configurations and settings'; -- Enable Row Level Security ALTER TABLE public.bots ENABLE ROW LEVEL SECURITY; -- Trigger for updating timestamps CREATE TRIGGER update_bots_timestamp BEFORE UPDATE ON public.bots FOR EACH ROW EXECUTE FUNCTION update_timestamp();