-- DROP SCHEMA public; CREATE SCHEMA public AUTHORIZATION pg_database_owner; COMMENT ON SCHEMA public IS 'standard public schema'; -- public.ad_templates definition -- Drop table -- DROP TABLE public.ad_templates; CREATE TABLE public.ad_templates ( id uuid NOT NULL, user_id uuid NOT NULL, "name" text NOT NULL, description text NULL, vast_tag_url text NOT NULL, ad_format varchar(50) DEFAULT 'pre-roll'::character varying NOT NULL, duration int8 NULL, is_active bool DEFAULT true NOT NULL, created_at timestamptz NULL, updated_at timestamptz NULL, is_default bool DEFAULT false NOT NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT ad_templates_pkey PRIMARY KEY (id) ); CREATE INDEX idx_ad_templates_user_id ON public.ad_templates USING btree (user_id); -- public.domains definition -- Drop table -- DROP TABLE public.domains; CREATE TABLE public.domains ( id uuid NOT NULL, user_id uuid NOT NULL, "name" text NOT NULL, created_at timestamptz NULL, updated_at timestamptz NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT domains_pkey PRIMARY KEY (id) ); CREATE INDEX idx_domains_user_id ON public.domains USING btree (user_id); -- public.jobs definition -- Drop table -- DROP TABLE public.jobs; CREATE TABLE public.jobs ( id uuid DEFAULT gen_random_uuid() NOT NULL, status text NULL, priority int8 DEFAULT 0 NULL, input_url text NULL, output_url text NULL, total_duration int8 NULL, current_time int8 NULL, progress numeric NULL, agent_id int8 NULL, logs text NULL, config text NULL, cancelled bool DEFAULT false NULL, retry_count int8 DEFAULT 0 NULL, max_retries int8 DEFAULT 3 NULL, created_at timestamptz NULL, updated_at timestamptz NULL, "version" int8 NULL, video_id uuid NULL, user_id uuid NULL, time_limit int8 DEFAULT 3600000 NULL, CONSTRAINT jobs_pkey PRIMARY KEY (id) ); CREATE INDEX idx_jobs_priority ON public.jobs USING btree (priority); -- public.notifications definition -- Drop table -- DROP TABLE public.notifications; CREATE TABLE public.notifications ( id uuid NOT NULL, user_id uuid NOT NULL, "type" varchar(50) NOT NULL, title text NOT NULL, message text NOT NULL, metadata text NULL, action_url text NULL, action_label text NULL, is_read bool DEFAULT false NOT NULL, created_at timestamptz NULL, updated_at timestamptz NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT notifications_pkey PRIMARY KEY (id) ); CREATE INDEX idx_notifications_user_id ON public.notifications USING btree (user_id); -- public."plan" definition -- Drop table -- DROP TABLE public."plan"; CREATE TABLE public."plan" ( id uuid DEFAULT gen_random_uuid() NOT NULL, "name" text NOT NULL, description text NULL, price numeric(65, 30) NOT NULL, "cycle" varchar(20) NOT NULL, storage_limit int8 NOT NULL, upload_limit int4 NOT NULL, duration_limit int4 NOT NULL, quality_limit text NOT NULL, features _text NULL, is_active bool DEFAULT true NOT NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT plan_pkey PRIMARY KEY (id) ); -- public.plan_subscriptions definition -- Drop table -- DROP TABLE public.plan_subscriptions; CREATE TABLE public.plan_subscriptions ( id uuid NOT NULL, user_id uuid NOT NULL, payment_id uuid NOT NULL, plan_id uuid NOT NULL, term_months int4 NOT NULL, payment_method varchar(20) NOT NULL, wallet_amount numeric(65, 30) NOT NULL, topup_amount numeric(65, 30) NOT NULL, started_at timestamptz NOT NULL, expires_at timestamptz NOT NULL, reminder_7d_sent_at timestamptz NULL, reminder_3d_sent_at timestamptz NULL, reminder_1d_sent_at timestamptz NULL, created_at timestamptz NULL, updated_at timestamptz NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT plan_subscriptions_pkey PRIMARY KEY (id) ); CREATE INDEX idx_plan_subscriptions_expires_at ON public.plan_subscriptions USING btree (expires_at); CREATE INDEX idx_plan_subscriptions_payment_id ON public.plan_subscriptions USING btree (payment_id); CREATE INDEX idx_plan_subscriptions_plan_id ON public.plan_subscriptions USING btree (plan_id); CREATE INDEX idx_plan_subscriptions_user_id ON public.plan_subscriptions USING btree (user_id); -- public.user_preferences definition -- Drop table -- DROP TABLE public.user_preferences; CREATE TABLE public.user_preferences ( user_id uuid NOT NULL, "language" text DEFAULT 'en'::text NOT NULL, locale text DEFAULT 'en'::text NOT NULL, email_notifications bool DEFAULT true NOT NULL, push_notifications bool DEFAULT true NOT NULL, marketing_notifications bool DEFAULT false NOT NULL, telegram_notifications bool DEFAULT false NOT NULL, created_at timestamptz NULL, updated_at timestamptz NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT user_preferences_pkey PRIMARY KEY (user_id) ); -- public.wallet_transactions definition -- Drop table -- DROP TABLE public.wallet_transactions; CREATE TABLE public.wallet_transactions ( id uuid NOT NULL, user_id uuid NOT NULL, "type" varchar(50) NOT NULL, amount numeric(65, 30) NOT NULL, currency text DEFAULT 'USD'::text NOT NULL, note text NULL, created_at timestamptz NULL, updated_at timestamptz NULL, payment_id uuid NULL, plan_id uuid NULL, term_months int4 NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT wallet_transactions_pkey PRIMARY KEY (id) ); CREATE INDEX idx_wallet_transactions_payment_id ON public.wallet_transactions USING btree (payment_id); CREATE INDEX idx_wallet_transactions_plan_id ON public.wallet_transactions USING btree (plan_id); CREATE INDEX idx_wallet_transactions_user_id ON public.wallet_transactions USING btree (user_id); -- public."user" definition -- Drop table -- DROP TABLE public."user"; CREATE TABLE public."user" ( id uuid DEFAULT gen_random_uuid() NOT NULL, email text NOT NULL, "password" text NULL, username text NULL, avatar text NULL, "role" varchar(20) DEFAULT 'USER'::character varying NOT NULL, google_id text NULL, storage_used int8 DEFAULT 0 NOT NULL, plan_id uuid NULL, created_at timestamp(3) DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_at timestamp(3) NOT NULL, "version" int8 DEFAULT 1 NOT NULL, telegram_id varchar NULL, referred_by_user_id uuid NULL, referral_eligible bool DEFAULT true NOT NULL, referral_reward_bps int4 NULL, referral_reward_granted_at timestamptz NULL, referral_reward_payment_id uuid NULL, referral_reward_amount numeric(65, 30) NULL, CONSTRAINT user_pkey PRIMARY KEY (id), CONSTRAINT user_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public."plan"(id) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT user_referred_by_user_id_fkey FOREIGN KEY (referred_by_user_id) REFERENCES public."user"(id) ON DELETE SET NULL ); CREATE INDEX idx_user_referred_by_user_id ON public."user" USING btree (referred_by_user_id); CREATE UNIQUE INDEX user_email_key ON public."user" USING btree (email); CREATE UNIQUE INDEX user_google_id_key ON public."user" USING btree (google_id); -- public.video definition -- Drop table -- DROP TABLE public.video; CREATE TABLE public.video ( id uuid DEFAULT gen_random_uuid() NOT NULL, "name" text NOT NULL, title text NOT NULL, description text NULL, url text NOT NULL, thumbnail text NULL, hls_token text NULL, hls_path text NULL, duration int4 NOT NULL, "size" int8 NOT NULL, storage_type varchar(20) DEFAULT 'tiktok_avatar'::character varying NOT NULL, format text NOT NULL, status varchar(20) DEFAULT 'PUBLIC'::character varying NOT NULL, processing_status varchar(20) DEFAULT 'PENDING'::character varying NOT NULL, "views" int4 DEFAULT 0 NOT NULL, user_id uuid NOT NULL, created_at timestamp(3) DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_at timestamp(3) NOT NULL, "version" int8 DEFAULT 1 NOT NULL, ad_id uuid NULL, metadata jsonb NULL, CONSTRAINT video_pkey PRIMARY KEY (id), CONSTRAINT video_user_id_fkey FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE RESTRICT ON UPDATE CASCADE ); -- public.payment definition -- Drop table -- DROP TABLE public.payment; CREATE TABLE public.payment ( id uuid DEFAULT gen_random_uuid() NOT NULL, user_id uuid NOT NULL, plan_id uuid NULL, amount numeric(65, 30) NOT NULL, currency text DEFAULT 'USD'::text NOT NULL, status varchar(20) DEFAULT 'PENDING'::character varying NOT NULL, provider varchar(20) DEFAULT 'STRIPE'::character varying NOT NULL, transaction_id text NULL, created_at timestamp(3) DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_at timestamp(3) NOT NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT payment_pkey PRIMARY KEY (id), CONSTRAINT payment_plan_id_fkey FOREIGN KEY (plan_id) REFERENCES public."plan"(id) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT payment_user_id_fkey FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE RESTRICT ON UPDATE CASCADE ); -- public.player_configs definition -- Drop table -- DROP TABLE public.player_configs; CREATE TABLE public.player_configs ( id uuid DEFAULT gen_random_uuid() NOT NULL, user_id uuid NOT NULL, "name" text NOT NULL, description text NULL, autoplay bool DEFAULT false NOT NULL, "loop" bool DEFAULT false NOT NULL, muted bool DEFAULT false NOT NULL, show_controls bool DEFAULT true NOT NULL, pip bool DEFAULT true NOT NULL, airplay bool DEFAULT true NOT NULL, chromecast bool DEFAULT true NOT NULL, is_active bool DEFAULT true NOT NULL, is_default bool DEFAULT false NOT NULL, created_at timestamp(3) DEFAULT CURRENT_TIMESTAMP NOT NULL, updated_at timestamp(3) NOT NULL, "version" int8 DEFAULT 1 NOT NULL, encrytion_m3u8 bool DEFAULT true NOT NULL, logo_url varchar(500) NULL, CONSTRAINT player_configs_pkey PRIMARY KEY (id), CONSTRAINT player_configs_url_check CHECK (((logo_url)::text ~* '^https?://'::text)), CONSTRAINT player_configs_user_id_fkey FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE ); CREATE INDEX idx_player_configs_is_default ON public.player_configs USING btree (is_default); CREATE UNIQUE INDEX idx_player_configs_one_default_per_user ON public.player_configs USING btree (user_id) WHERE (is_default = true); CREATE INDEX idx_player_configs_user_default ON public.player_configs USING btree (user_id, is_default); CREATE INDEX idx_player_configs_user_id ON public.player_configs USING btree (user_id); -- Table Triggers create trigger trg_update_player_configs before update on public.player_configs for each row execute function update_player_configs_updated_at(); -- public.popup_ads definition -- Drop table -- DROP TABLE public.popup_ads; CREATE TABLE public.popup_ads ( id uuid NOT NULL, user_id uuid NOT NULL, "type" varchar(20) NOT NULL, "label" text NOT NULL, value text NOT NULL, is_active bool DEFAULT true NOT NULL, max_triggers_per_session int4 DEFAULT 3 NOT NULL, created_at timestamptz DEFAULT CURRENT_TIMESTAMP NULL, updated_at timestamptz NULL, "version" int8 DEFAULT 1 NOT NULL, CONSTRAINT popup_ads_pkey PRIMARY KEY (id), CONSTRAINT popup_ads_user_id_fkey FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE ); CREATE INDEX idx_popup_ads_user_active ON public.popup_ads USING btree (user_id, is_active); CREATE INDEX idx_popup_ads_user_id ON public.popup_ads USING btree (user_id); -- DROP FUNCTION public.update_player_configs_updated_at(); CREATE OR REPLACE FUNCTION public.update_player_configs_updated_at() RETURNS trigger LANGUAGE plpgsql AS $function$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; NEW.version = OLD.version + 1; RETURN NEW; END; $function$ ;