Merge upstream main into feat/500-api-key-ip-whitelist

This commit is contained in:
RWDai
2026-05-20 10:26:56 +08:00
501 changed files with 47013 additions and 3667 deletions

View File

@@ -131,6 +131,7 @@ CREATE TABLE IF NOT EXISTS public.announcements (
author_id character varying(36),
is_active boolean DEFAULT true,
is_pinned boolean DEFAULT false,
requires_ack boolean DEFAULT false NOT NULL,
start_time timestamp with time zone,
end_time timestamp with time zone,
created_at timestamp with time zone DEFAULT now() NOT NULL,
@@ -168,7 +169,7 @@ CREATE TABLE IF NOT EXISTS public.api_keys (
name character varying(100),
key_prefix character varying(64),
status character varying(64) DEFAULT 'active'::character varying NOT NULL,
total_requests integer DEFAULT 0,
total_requests bigint DEFAULT 0,
total_tokens bigint DEFAULT '0'::bigint NOT NULL,
total_cost_usd numeric(20,8) DEFAULT '0'::double precision,
is_standalone boolean DEFAULT false NOT NULL,
@@ -289,7 +290,7 @@ CREATE TABLE IF NOT EXISTS public.global_models (
default_tiered_pricing json,
supported_capabilities json,
is_active boolean DEFAULT true NOT NULL,
usage_count integer DEFAULT 0 NOT NULL,
usage_count bigint DEFAULT 0 NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL,
config jsonb,
@@ -360,7 +361,7 @@ CREATE TABLE IF NOT EXISTS public.management_tokens (
expires_at timestamp with time zone,
last_used_at timestamp with time zone,
last_used_ip character varying(45),
usage_count integer DEFAULT 0 NOT NULL,
usage_count bigint DEFAULT 0 NOT NULL,
is_active boolean DEFAULT true NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL,
@@ -416,6 +417,7 @@ CREATE TABLE IF NOT EXISTS public.oauth_providers (
frontend_callback_url character varying(500) NOT NULL,
attribute_mapping json,
extra_config json,
icon_url character varying(500),
is_enabled boolean DEFAULT false NOT NULL,
created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL
@@ -586,10 +588,10 @@ CREATE TABLE IF NOT EXISTS public.provider_api_keys (
last_probe_increase_at timestamp with time zone,
cache_ttl_minutes integer DEFAULT 5 NOT NULL,
max_probe_interval_minutes integer DEFAULT 32 NOT NULL,
request_count integer DEFAULT 0,
success_count integer DEFAULT 0,
error_count integer DEFAULT 0,
total_response_time_ms integer DEFAULT 0,
request_count bigint DEFAULT 0,
success_count bigint DEFAULT 0,
error_count bigint DEFAULT 0,
total_response_time_ms bigint DEFAULT 0,
last_used_at timestamp with time zone,
last_error_at timestamp with time zone,
last_error_msg text,
@@ -857,7 +859,7 @@ CREATE TABLE IF NOT EXISTS public.refund_requests (
CREATE TABLE IF NOT EXISTS public.request_candidates (
id character varying(36) NOT NULL,
request_id character varying(100) NOT NULL,
request_id character varying(128) NOT NULL,
user_id character varying(36),
api_key_id character varying(36),
candidate_index integer NOT NULL,
@@ -1264,6 +1266,39 @@ CREATE TABLE IF NOT EXISTS public.usage (
--
-- Name: usage_counter_deltas; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE IF NOT EXISTS public.usage_counter_deltas (
id character varying(36) NOT NULL,
request_id character varying(128) NOT NULL,
kind character varying(64) NOT NULL,
target_id text NOT NULL,
request_count_delta bigint DEFAULT 0 NOT NULL,
total_requests_delta bigint DEFAULT 0 NOT NULL,
success_count_delta bigint DEFAULT 0 NOT NULL,
error_count_delta bigint DEFAULT 0 NOT NULL,
dns_failures_delta bigint DEFAULT 0 NOT NULL,
stream_errors_delta bigint DEFAULT 0 NOT NULL,
total_tokens_delta bigint DEFAULT 0 NOT NULL,
total_cost_usd_delta double precision DEFAULT 0 NOT NULL,
total_response_time_ms_delta bigint DEFAULT 0 NOT NULL,
last_used_at_unix_secs bigint,
last_used_ip text,
candidate_last_used_at_unix_secs bigint,
removed_last_used_at_unix_secs bigint,
usage_created_at_unix_secs bigint,
created_at timestamp with time zone DEFAULT now() NOT NULL,
processed_at timestamp with time zone,
CONSTRAINT usage_counter_deltas_pkey PRIMARY KEY (id),
CONSTRAINT usage_counter_deltas_kind_check CHECK (
kind IN ('api_key', 'provider_api_key', 'model', 'provider_monthly', 'proxy_node', 'management_token', 'api_key_last_used')
)
);
--
-- Name: user_model_usage_counts; Type: TABLE; Schema: public; Owner: -
--
@@ -1380,11 +1415,72 @@ CREATE TABLE IF NOT EXISTS public.users (
email_verified boolean NOT NULL,
rate_limit integer,
rate_limit_mode text DEFAULT 'system'::text NOT NULL,
privacy_policy_accepted_version character varying(64),
privacy_policy_accepted_at timestamp with time zone,
metadata json
);
--
-- Name: user_invite_codes; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE IF NOT EXISTS public.user_invite_codes (
user_id character varying(64) NOT NULL,
invite_code character varying(64) NOT NULL,
active boolean DEFAULT true NOT NULL,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL
);
--
-- Name: user_referrals; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE IF NOT EXISTS public.user_referrals (
id character varying(64) NOT NULL,
inviter_user_id character varying(64) NOT NULL,
invitee_user_id character varying(64) NOT NULL,
invite_code_snapshot character varying(64) NOT NULL,
source_json jsonb,
first_paid_order_id character varying(64),
first_paid_at timestamp with time zone,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL
);
--
-- Name: referral_rewards; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE IF NOT EXISTS public.referral_rewards (
id character varying(64) NOT NULL,
referral_id character varying(64) NOT NULL,
inviter_user_id character varying(64) NOT NULL,
invitee_user_id character varying(64) NOT NULL,
reward_type character varying(32) NOT NULL,
trigger_point character varying(64) NOT NULL,
source_order_id character varying(64),
idempotency_key character varying(128) NOT NULL,
amount_usd numeric(20,8) NOT NULL,
status character varying(32) DEFAULT 'pending'::character varying NOT NULL,
wallet_transaction_id character varying(64),
reversed_amount_usd numeric(20,8) DEFAULT 0 NOT NULL,
pending_reversal_amount_usd numeric(20,8) DEFAULT 0 NOT NULL,
failure_reason text,
admin_operator_id character varying(64),
admin_note text,
created_at timestamp with time zone DEFAULT now() NOT NULL,
updated_at timestamp with time zone DEFAULT now() NOT NULL
);
--
-- Name: user_groups; Type: TABLE; Schema: public; Owner: -
--

View File

@@ -1227,6 +1227,96 @@ END $mig$;
--
-- Name: user_invite_codes user_invite_codes_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.user_invite_codes
ADD CONSTRAINT user_invite_codes_pkey PRIMARY KEY (user_id);
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: user_invite_codes user_invite_codes_invite_code_key; Type: CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.user_invite_codes
ADD CONSTRAINT user_invite_codes_invite_code_key UNIQUE (invite_code);
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: user_referrals user_referrals_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.user_referrals
ADD CONSTRAINT user_referrals_pkey PRIMARY KEY (id);
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: user_referrals user_referrals_invitee_user_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.user_referrals
ADD CONSTRAINT user_referrals_invitee_user_id_key UNIQUE (invitee_user_id);
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: referral_rewards referral_rewards_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.referral_rewards
ADD CONSTRAINT referral_rewards_pkey PRIMARY KEY (id);
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: referral_rewards referral_rewards_idempotency_key_key; Type: CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.referral_rewards
ADD CONSTRAINT referral_rewards_idempotency_key_key UNIQUE (idempotency_key);
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: user_plan_entitlements user_plan_entitlements_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

View File

@@ -173,6 +173,14 @@ CREATE INDEX IF NOT EXISTS idx_entitlement_usage_user_date ON public.entitlement
--
-- Name: idx_entitlement_usage_entitlement_date; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_entitlement_usage_entitlement_date ON public.entitlement_usage_ledgers USING btree (user_entitlement_id, usage_date);
--
-- Name: idx_provider_api_keys_provider_active; Type: INDEX; Schema: public; Owner: -
--
@@ -181,6 +189,14 @@ CREATE INDEX IF NOT EXISTS idx_provider_api_keys_provider_active ON public.provi
--
-- Name: idx_provider_api_keys_provider_default_sort; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_provider_api_keys_provider_default_sort ON public.provider_api_keys USING btree (provider_id, internal_priority, name, id);
--
-- Name: idx_provider_api_keys_provider_created_at_desc; Type: INDEX; Schema: public; Owner: -
--
@@ -549,6 +565,30 @@ CREATE INDEX IF NOT EXISTS idx_usage_wallet_finalized ON public.usage USING btre
--
-- Name: ix_usage_counter_deltas_request_kind; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_request_kind ON public.usage_counter_deltas USING btree (request_id, kind, target_id);
--
-- Name: ix_usage_counter_deltas_processed; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_processed ON public.usage_counter_deltas USING btree (processed_at, created_at, id) WHERE processed_at IS NOT NULL;
--
-- Name: ix_usage_counter_deltas_unprocessed; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_unprocessed ON public.usage_counter_deltas USING btree (created_at, id) WHERE processed_at IS NULL;
--
-- Name: idx_user_model_usage_model; Type: INDEX; Schema: public; Owner: -
--
@@ -581,6 +621,62 @@ CREATE INDEX IF NOT EXISTS idx_user_sessions_user_device ON public.user_sessions
--
-- Name: idx_user_referrals_inviter; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_user_referrals_inviter ON public.user_referrals USING btree (inviter_user_id, created_at DESC);
--
-- Name: idx_user_referrals_created; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_user_referrals_created ON public.user_referrals USING btree (created_at DESC);
--
-- Name: idx_user_referrals_invite_code; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_user_referrals_invite_code ON public.user_referrals USING btree (invite_code_snapshot);
--
-- Name: idx_referral_rewards_inviter_status; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_referral_rewards_inviter_status ON public.referral_rewards USING btree (inviter_user_id, status, created_at DESC);
--
-- Name: idx_referral_rewards_inviter_created; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_referral_rewards_inviter_created ON public.referral_rewards USING btree (inviter_user_id, created_at DESC);
--
-- Name: idx_referral_rewards_created; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_referral_rewards_created ON public.referral_rewards USING btree (created_at DESC);
--
-- Name: idx_referral_rewards_source_order; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_referral_rewards_source_order ON public.referral_rewards USING btree (source_order_id);
--
-- Name: idx_video_tasks_external_id; Type: INDEX; Schema: public; Owner: -
--
@@ -597,6 +693,14 @@ CREATE INDEX IF NOT EXISTS idx_video_tasks_next_poll ON public.video_tasks USING
--
-- Name: idx_video_tasks_due_poll; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_video_tasks_due_poll ON public.video_tasks USING btree (status, next_poll_at, updated_at) WHERE next_poll_at IS NOT NULL;
--
-- Name: idx_video_tasks_request_id; Type: INDEX; Schema: public; Owner: -
--

View File

@@ -792,6 +792,126 @@ END $mig$;
--
-- Name: user_invite_codes user_invite_codes_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.user_invite_codes
ADD CONSTRAINT user_invite_codes_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: user_referrals user_referrals_inviter_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.user_referrals
ADD CONSTRAINT user_referrals_inviter_user_id_fkey FOREIGN KEY (inviter_user_id) REFERENCES public.users(id) ON DELETE CASCADE;
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: user_referrals user_referrals_invitee_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.user_referrals
ADD CONSTRAINT user_referrals_invitee_user_id_fkey FOREIGN KEY (invitee_user_id) REFERENCES public.users(id) ON DELETE CASCADE;
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: user_referrals user_referrals_first_paid_order_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.user_referrals
ADD CONSTRAINT user_referrals_first_paid_order_id_fkey FOREIGN KEY (first_paid_order_id) REFERENCES public.payment_orders(id) ON DELETE SET NULL;
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: referral_rewards referral_rewards_referral_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.referral_rewards
ADD CONSTRAINT referral_rewards_referral_id_fkey FOREIGN KEY (referral_id) REFERENCES public.user_referrals(id) ON DELETE CASCADE;
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: referral_rewards referral_rewards_inviter_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.referral_rewards
ADD CONSTRAINT referral_rewards_inviter_user_id_fkey FOREIGN KEY (inviter_user_id) REFERENCES public.users(id) ON DELETE CASCADE;
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: referral_rewards referral_rewards_invitee_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.referral_rewards
ADD CONSTRAINT referral_rewards_invitee_user_id_fkey FOREIGN KEY (invitee_user_id) REFERENCES public.users(id) ON DELETE CASCADE;
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: referral_rewards referral_rewards_source_order_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--
DO $mig$ BEGIN
ALTER TABLE ONLY public.referral_rewards
ADD CONSTRAINT referral_rewards_source_order_id_fkey FOREIGN KEY (source_order_id) REFERENCES public.payment_orders(id) ON DELETE SET NULL;
EXCEPTION
WHEN duplicate_object THEN NULL;
WHEN duplicate_table THEN NULL;
WHEN invalid_table_definition THEN NULL;
END $mig$;
--
-- Name: video_tasks video_tasks_api_key_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: -
--

View File

@@ -124,7 +124,8 @@ CREATE TABLE IF NOT EXISTS provider_api_keys (
metadata TEXT,
created_at BIGINT NOT NULL,
updated_at BIGINT NOT NULL,
KEY provider_api_keys_provider_id_idx (provider_id)
KEY provider_api_keys_provider_id_idx (provider_id),
KEY idx_provider_api_keys_provider_default_sort (provider_id, internal_priority, name, id)
);
CREATE TABLE IF NOT EXISTS pool_member_scores (

View File

@@ -125,6 +125,14 @@ CREATE INDEX IF NOT EXISTS idx_provider_api_keys_provider_active ON public.provi
--
-- Name: idx_provider_api_keys_provider_default_sort; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX IF NOT EXISTS idx_provider_api_keys_provider_default_sort ON public.provider_api_keys USING btree (provider_id, internal_priority, name, id);
--
-- Name: idx_provider_api_keys_provider_created_at_desc; Type: INDEX; Schema: public; Owner: -
--

View File

@@ -133,6 +133,7 @@ CREATE TABLE IF NOT EXISTS provider_api_keys (
updated_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS provider_api_keys_provider_id_idx ON provider_api_keys (provider_id);
CREATE INDEX IF NOT EXISTS idx_provider_api_keys_provider_default_sort ON provider_api_keys (provider_id, internal_priority, name, id);
CREATE TABLE IF NOT EXISTS pool_member_scores (
id TEXT PRIMARY KEY,

View File

@@ -22,6 +22,8 @@ CREATE TABLE IF NOT EXISTS users (
`feature_settings` JSON,
`rate_limit` INT,
`rate_limit_mode` VARCHAR(32) NOT NULL DEFAULT 'system',
`privacy_policy_accepted_version` VARCHAR(64),
`privacy_policy_accepted_at` BIGINT,
`metadata` JSON,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
@@ -124,6 +126,7 @@ CREATE TABLE IF NOT EXISTS announcements (
`author_id` VARCHAR(64),
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
`is_pinned` TINYINT(1) NOT NULL DEFAULT 0,
`requires_ack` TINYINT(1) NOT NULL DEFAULT 0,
`start_time` BIGINT,
`end_time` BIGINT,
`created_at` BIGINT NOT NULL,

View File

@@ -127,7 +127,8 @@ CREATE TABLE IF NOT EXISTS provider_api_keys (
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
KEY provider_api_keys_provider_id_idx (`provider_id`)
KEY provider_api_keys_provider_id_idx (`provider_id`),
KEY idx_provider_api_keys_provider_default_sort (`provider_id`, `internal_priority`, `name`, `id`)
);
CREATE TABLE IF NOT EXISTS pool_member_scores (
@@ -286,6 +287,7 @@ CREATE TABLE IF NOT EXISTS video_tasks (
UNIQUE KEY video_tasks_request_id_key (`request_id`),
KEY video_tasks_external_id_idx (`external_task_id`),
KEY video_tasks_next_poll_idx (`next_poll_at`),
KEY video_tasks_due_poll_idx (`status`, `next_poll_at`, `updated_at`),
KEY video_tasks_user_status_idx (`user_id`, `status`),
KEY video_tasks_api_key_id_idx (`api_key_id`),
KEY video_tasks_provider_id_idx (`provider_id`),

View File

@@ -36,6 +36,7 @@ CREATE TABLE IF NOT EXISTS oauth_providers (
`frontend_callback_url` VARCHAR(500) NOT NULL,
`attribute_mapping` JSON,
`extra_config` JSON,
`icon_url` VARCHAR(500),
`is_enabled` TINYINT(1) NOT NULL DEFAULT 0,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,

View File

@@ -104,6 +104,68 @@ CREATE TABLE IF NOT EXISTS payment_orders (
KEY idx_payment_orders_product (`product_id`)
);
CREATE TABLE IF NOT EXISTS user_invite_codes (
`user_id` VARCHAR(64) NOT NULL,
`invite_code` VARCHAR(64) NOT NULL,
`active` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`user_id`),
UNIQUE KEY user_invite_codes_invite_code_key (`invite_code`),
CONSTRAINT user_invite_codes_user_id_fkey FOREIGN KEY (`user_id`) REFERENCES users (`id`) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS user_referrals (
`id` VARCHAR(64) NOT NULL,
`inviter_user_id` VARCHAR(64) NOT NULL,
`invitee_user_id` VARCHAR(64) NOT NULL,
`invite_code_snapshot` VARCHAR(64) NOT NULL,
`source_json` JSON,
`first_paid_order_id` VARCHAR(64),
`first_paid_at` BIGINT,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY user_referrals_invitee_user_id_key (`invitee_user_id`),
KEY idx_user_referrals_inviter (`inviter_user_id`, `created_at`),
KEY idx_user_referrals_created (`created_at`),
KEY idx_user_referrals_invite_code (`invite_code_snapshot`),
CONSTRAINT user_referrals_inviter_user_id_fkey FOREIGN KEY (`inviter_user_id`) REFERENCES users (`id`) ON DELETE CASCADE,
CONSTRAINT user_referrals_invitee_user_id_fkey FOREIGN KEY (`invitee_user_id`) REFERENCES users (`id`) ON DELETE CASCADE,
CONSTRAINT user_referrals_first_paid_order_fkey FOREIGN KEY (`first_paid_order_id`) REFERENCES payment_orders (`id`) ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS referral_rewards (
`id` VARCHAR(64) NOT NULL,
`referral_id` VARCHAR(64) NOT NULL,
`inviter_user_id` VARCHAR(64) NOT NULL,
`invitee_user_id` VARCHAR(64) NOT NULL,
`reward_type` VARCHAR(32) NOT NULL,
`trigger_point` VARCHAR(64) NOT NULL,
`source_order_id` VARCHAR(64),
`idempotency_key` VARCHAR(128) NOT NULL,
`amount_usd` DOUBLE NOT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'pending',
`wallet_transaction_id` VARCHAR(64),
`reversed_amount_usd` DOUBLE NOT NULL DEFAULT 0,
`pending_reversal_amount_usd` DOUBLE NOT NULL DEFAULT 0,
`failure_reason` LONGTEXT,
`admin_operator_id` VARCHAR(64),
`admin_note` LONGTEXT,
`created_at` BIGINT NOT NULL,
`updated_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY referral_rewards_idempotency_key_key (`idempotency_key`),
KEY idx_referral_rewards_inviter_status (`inviter_user_id`, `status`, `created_at`),
KEY idx_referral_rewards_inviter_created (`inviter_user_id`, `created_at`),
KEY idx_referral_rewards_created (`created_at`),
KEY idx_referral_rewards_source_order (`source_order_id`),
CONSTRAINT referral_rewards_referral_id_fkey FOREIGN KEY (`referral_id`) REFERENCES user_referrals (`id`) ON DELETE CASCADE,
CONSTRAINT referral_rewards_inviter_user_id_fkey FOREIGN KEY (`inviter_user_id`) REFERENCES users (`id`) ON DELETE CASCADE,
CONSTRAINT referral_rewards_invitee_user_id_fkey FOREIGN KEY (`invitee_user_id`) REFERENCES users (`id`) ON DELETE CASCADE,
CONSTRAINT referral_rewards_source_order_fkey FOREIGN KEY (`source_order_id`) REFERENCES payment_orders (`id`) ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS payment_gateway_configs (
`provider` VARCHAR(64) NOT NULL,
`enabled` TINYINT(1) NOT NULL DEFAULT 0,
@@ -189,7 +251,8 @@ CREATE TABLE IF NOT EXISTS entitlement_usage_ledgers (
`created_at` BIGINT NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY uq_entitlement_usage_request (`user_entitlement_id`, `request_id`),
KEY idx_entitlement_usage_user_date (`user_id`, `usage_date`)
KEY idx_entitlement_usage_user_date (`user_id`, `usage_date`),
KEY idx_entitlement_usage_entitlement_date (`user_entitlement_id`, `usage_date`)
);
CREATE TABLE IF NOT EXISTS refund_requests (

View File

@@ -111,6 +111,33 @@ CREATE TABLE IF NOT EXISTS `usage` (
KEY usage_wallet_id_idx (`wallet_id`)
);
CREATE TABLE IF NOT EXISTS usage_counter_deltas (
`id` VARCHAR(36) NOT NULL,
`request_id` VARCHAR(128) NOT NULL,
`kind` VARCHAR(64) NOT NULL,
`target_id` TEXT NOT NULL,
`request_count_delta` BIGINT NOT NULL DEFAULT 0,
`total_requests_delta` BIGINT NOT NULL DEFAULT 0,
`success_count_delta` BIGINT NOT NULL DEFAULT 0,
`error_count_delta` BIGINT NOT NULL DEFAULT 0,
`dns_failures_delta` BIGINT NOT NULL DEFAULT 0,
`stream_errors_delta` BIGINT NOT NULL DEFAULT 0,
`total_tokens_delta` BIGINT NOT NULL DEFAULT 0,
`total_cost_usd_delta` DOUBLE NOT NULL DEFAULT 0,
`total_response_time_ms_delta` BIGINT NOT NULL DEFAULT 0,
`last_used_at_unix_secs` BIGINT,
`last_used_ip` TEXT,
`candidate_last_used_at_unix_secs` BIGINT,
`removed_last_used_at_unix_secs` BIGINT,
`usage_created_at_unix_secs` BIGINT,
`created_at` BIGINT NOT NULL,
`processed_at` BIGINT,
PRIMARY KEY (`id`),
KEY ix_usage_counter_deltas_unprocessed (`created_at`, `id`),
KEY ix_usage_counter_deltas_processed (`processed_at`, `created_at`, `id`),
KEY ix_usage_counter_deltas_request_kind (`request_id`, `kind`, `target_id`)
);
CREATE TABLE IF NOT EXISTS usage_settlement_snapshots (
`request_id` VARCHAR(128) NOT NULL,
`billing_status` VARCHAR(64) NOT NULL,

View File

@@ -22,6 +22,8 @@ CREATE TABLE IF NOT EXISTS public.users (
feature_settings jsonb,
rate_limit integer,
rate_limit_mode character varying(32) DEFAULT 'system' NOT NULL,
privacy_policy_accepted_version character varying(64),
privacy_policy_accepted_at timestamp with time zone,
metadata jsonb,
created_at bigint NOT NULL,
updated_at bigint NOT NULL,
@@ -129,6 +131,7 @@ CREATE TABLE IF NOT EXISTS public.announcements (
author_id character varying(64),
is_active boolean DEFAULT true NOT NULL,
is_pinned boolean DEFAULT false NOT NULL,
requires_ack boolean DEFAULT false NOT NULL,
start_time bigint,
end_time bigint,
created_at bigint NOT NULL,

View File

@@ -133,6 +133,7 @@ CREATE TABLE IF NOT EXISTS public.provider_api_keys (
ALTER TABLE ONLY public.provider_api_keys ADD CONSTRAINT provider_api_keys_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS provider_api_keys_provider_id_idx ON public.provider_api_keys USING btree (provider_id);
CREATE INDEX IF NOT EXISTS idx_provider_api_keys_provider_default_sort ON public.provider_api_keys USING btree (provider_id, internal_priority, name, id);
CREATE TABLE IF NOT EXISTS public.pool_member_scores (
id character varying(192) NOT NULL,
@@ -296,6 +297,7 @@ ALTER TABLE ONLY public.video_tasks ADD CONSTRAINT video_tasks_short_id_key UNIQ
ALTER TABLE ONLY public.video_tasks ADD CONSTRAINT video_tasks_request_id_key UNIQUE (request_id);
CREATE INDEX IF NOT EXISTS video_tasks_external_id_idx ON public.video_tasks USING btree (external_task_id);
CREATE INDEX IF NOT EXISTS video_tasks_next_poll_idx ON public.video_tasks USING btree (next_poll_at);
CREATE INDEX IF NOT EXISTS video_tasks_due_poll_idx ON public.video_tasks USING btree (status, next_poll_at, updated_at);
CREATE INDEX IF NOT EXISTS video_tasks_user_status_idx ON public.video_tasks USING btree (user_id, status);
CREATE INDEX IF NOT EXISTS video_tasks_api_key_id_idx ON public.video_tasks USING btree (api_key_id);
CREATE INDEX IF NOT EXISTS video_tasks_provider_id_idx ON public.video_tasks USING btree (provider_id);

View File

@@ -38,6 +38,7 @@ CREATE TABLE IF NOT EXISTS public.oauth_providers (
frontend_callback_url character varying(500) NOT NULL,
attribute_mapping jsonb,
extra_config jsonb,
icon_url character varying(500),
is_enabled boolean DEFAULT false NOT NULL,
created_at bigint NOT NULL,
updated_at bigint NOT NULL

View File

@@ -108,6 +108,71 @@ CREATE INDEX IF NOT EXISTS idx_payment_orders_gateway_order_id ON public.payment
CREATE INDEX IF NOT EXISTS idx_payment_orders_kind_status ON public.payment_orders USING btree (order_kind, status);
CREATE INDEX IF NOT EXISTS idx_payment_orders_product ON public.payment_orders USING btree (product_id);
CREATE TABLE IF NOT EXISTS public.user_invite_codes (
user_id character varying(64) NOT NULL,
invite_code character varying(64) NOT NULL,
active boolean DEFAULT true NOT NULL,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL
);
ALTER TABLE ONLY public.user_invite_codes ADD CONSTRAINT user_invite_codes_pkey PRIMARY KEY (user_id);
ALTER TABLE ONLY public.user_invite_codes ADD CONSTRAINT user_invite_codes_invite_code_key UNIQUE (invite_code);
ALTER TABLE ONLY public.user_invite_codes ADD CONSTRAINT user_invite_codes_user_id_fkey FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
CREATE TABLE IF NOT EXISTS public.user_referrals (
id character varying(64) NOT NULL,
inviter_user_id character varying(64) NOT NULL,
invitee_user_id character varying(64) NOT NULL,
invite_code_snapshot character varying(64) NOT NULL,
source_json jsonb,
first_paid_order_id character varying(64),
first_paid_at timestamp with time zone,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL
);
ALTER TABLE ONLY public.user_referrals ADD CONSTRAINT user_referrals_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.user_referrals ADD CONSTRAINT user_referrals_invitee_user_id_key UNIQUE (invitee_user_id);
CREATE INDEX IF NOT EXISTS idx_user_referrals_inviter ON public.user_referrals USING btree (inviter_user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_user_referrals_created ON public.user_referrals USING btree (created_at);
CREATE INDEX IF NOT EXISTS idx_user_referrals_invite_code ON public.user_referrals USING btree (invite_code_snapshot);
ALTER TABLE ONLY public.user_referrals ADD CONSTRAINT user_referrals_inviter_user_id_fkey FOREIGN KEY (inviter_user_id) REFERENCES public.users(id) ON DELETE CASCADE;
ALTER TABLE ONLY public.user_referrals ADD CONSTRAINT user_referrals_invitee_user_id_fkey FOREIGN KEY (invitee_user_id) REFERENCES public.users(id) ON DELETE CASCADE;
ALTER TABLE ONLY public.user_referrals ADD CONSTRAINT user_referrals_first_paid_order_fkey FOREIGN KEY (first_paid_order_id) REFERENCES public.payment_orders(id) ON DELETE SET NULL;
CREATE TABLE IF NOT EXISTS public.referral_rewards (
id character varying(64) NOT NULL,
referral_id character varying(64) NOT NULL,
inviter_user_id character varying(64) NOT NULL,
invitee_user_id character varying(64) NOT NULL,
reward_type character varying(32) NOT NULL,
trigger_point character varying(64) NOT NULL,
source_order_id character varying(64),
idempotency_key character varying(128) NOT NULL,
amount_usd double precision NOT NULL,
status character varying(32) DEFAULT 'pending' NOT NULL,
wallet_transaction_id character varying(64),
reversed_amount_usd double precision DEFAULT 0 NOT NULL,
pending_reversal_amount_usd double precision DEFAULT 0 NOT NULL,
failure_reason text,
admin_operator_id character varying(64),
admin_note text,
created_at timestamp with time zone NOT NULL,
updated_at timestamp with time zone NOT NULL
);
ALTER TABLE ONLY public.referral_rewards ADD CONSTRAINT referral_rewards_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.referral_rewards ADD CONSTRAINT referral_rewards_idempotency_key_key UNIQUE (idempotency_key);
CREATE INDEX IF NOT EXISTS idx_referral_rewards_inviter_status ON public.referral_rewards USING btree (inviter_user_id, status, created_at);
CREATE INDEX IF NOT EXISTS idx_referral_rewards_inviter_created ON public.referral_rewards USING btree (inviter_user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_referral_rewards_created ON public.referral_rewards USING btree (created_at);
CREATE INDEX IF NOT EXISTS idx_referral_rewards_source_order ON public.referral_rewards USING btree (source_order_id);
ALTER TABLE ONLY public.referral_rewards ADD CONSTRAINT referral_rewards_referral_id_fkey FOREIGN KEY (referral_id) REFERENCES public.user_referrals(id) ON DELETE CASCADE;
ALTER TABLE ONLY public.referral_rewards ADD CONSTRAINT referral_rewards_inviter_user_id_fkey FOREIGN KEY (inviter_user_id) REFERENCES public.users(id) ON DELETE CASCADE;
ALTER TABLE ONLY public.referral_rewards ADD CONSTRAINT referral_rewards_invitee_user_id_fkey FOREIGN KEY (invitee_user_id) REFERENCES public.users(id) ON DELETE CASCADE;
ALTER TABLE ONLY public.referral_rewards ADD CONSTRAINT referral_rewards_source_order_fkey FOREIGN KEY (source_order_id) REFERENCES public.payment_orders(id) ON DELETE SET NULL;
CREATE TABLE IF NOT EXISTS public.payment_gateway_configs (
provider character varying(64) NOT NULL,
enabled boolean DEFAULT false NOT NULL,
@@ -200,6 +265,7 @@ CREATE TABLE IF NOT EXISTS public.entitlement_usage_ledgers (
ALTER TABLE ONLY public.entitlement_usage_ledgers ADD CONSTRAINT entitlement_usage_ledgers_pkey PRIMARY KEY (id);
ALTER TABLE ONLY public.entitlement_usage_ledgers ADD CONSTRAINT uq_entitlement_usage_request UNIQUE (user_entitlement_id, request_id);
CREATE INDEX IF NOT EXISTS idx_entitlement_usage_user_date ON public.entitlement_usage_ledgers USING btree (user_id, usage_date);
CREATE INDEX IF NOT EXISTS idx_entitlement_usage_entitlement_date ON public.entitlement_usage_ledgers USING btree (user_entitlement_id, usage_date);
CREATE TABLE IF NOT EXISTS public.refund_requests (
id character varying(64) NOT NULL,

View File

@@ -112,6 +112,34 @@ CREATE INDEX IF NOT EXISTS usage_request_id_idx ON public.usage USING btree (req
CREATE INDEX IF NOT EXISTS usage_user_id_idx ON public.usage USING btree (user_id);
CREATE INDEX IF NOT EXISTS usage_wallet_id_idx ON public.usage USING btree (wallet_id);
CREATE TABLE IF NOT EXISTS public.usage_counter_deltas (
id character varying(36) NOT NULL,
request_id character varying(128) NOT NULL,
kind character varying(64) NOT NULL,
target_id text NOT NULL,
request_count_delta bigint DEFAULT 0 NOT NULL,
total_requests_delta bigint DEFAULT 0 NOT NULL,
success_count_delta bigint DEFAULT 0 NOT NULL,
error_count_delta bigint DEFAULT 0 NOT NULL,
dns_failures_delta bigint DEFAULT 0 NOT NULL,
stream_errors_delta bigint DEFAULT 0 NOT NULL,
total_tokens_delta bigint DEFAULT 0 NOT NULL,
total_cost_usd_delta double precision DEFAULT 0 NOT NULL,
total_response_time_ms_delta bigint DEFAULT 0 NOT NULL,
last_used_at_unix_secs bigint,
last_used_ip text,
candidate_last_used_at_unix_secs bigint,
removed_last_used_at_unix_secs bigint,
usage_created_at_unix_secs bigint,
created_at timestamp with time zone NOT NULL,
processed_at timestamp with time zone
);
ALTER TABLE ONLY public.usage_counter_deltas ADD CONSTRAINT usage_counter_deltas_pkey PRIMARY KEY (id);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_unprocessed ON public.usage_counter_deltas USING btree (created_at, id);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_processed ON public.usage_counter_deltas USING btree (processed_at, created_at, id);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_request_kind ON public.usage_counter_deltas USING btree (request_id, kind, target_id);
CREATE TABLE IF NOT EXISTS public.usage_settlement_snapshots (
request_id character varying(128) NOT NULL,
billing_status character varying(64) NOT NULL,

View File

@@ -22,6 +22,8 @@ CREATE TABLE IF NOT EXISTS users (
feature_settings TEXT,
rate_limit INTEGER,
rate_limit_mode TEXT NOT NULL DEFAULT 'system',
privacy_policy_accepted_version TEXT,
privacy_policy_accepted_at INTEGER,
metadata TEXT,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
@@ -120,6 +122,7 @@ CREATE TABLE IF NOT EXISTS announcements (
author_id TEXT,
is_active INTEGER NOT NULL DEFAULT 1,
is_pinned INTEGER NOT NULL DEFAULT 0,
requires_ack INTEGER NOT NULL DEFAULT 0,
start_time INTEGER,
end_time INTEGER,
created_at INTEGER NOT NULL,

View File

@@ -125,6 +125,7 @@ CREATE TABLE IF NOT EXISTS provider_api_keys (
updated_at INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS provider_api_keys_provider_id_idx ON provider_api_keys (provider_id);
CREATE INDEX IF NOT EXISTS idx_provider_api_keys_provider_default_sort ON provider_api_keys (provider_id, internal_priority, name, id);
CREATE TABLE IF NOT EXISTS pool_member_scores (
id TEXT PRIMARY KEY NOT NULL,
@@ -278,6 +279,7 @@ CREATE TABLE IF NOT EXISTS video_tasks (
);
CREATE INDEX IF NOT EXISTS video_tasks_external_id_idx ON video_tasks (external_task_id);
CREATE INDEX IF NOT EXISTS video_tasks_next_poll_idx ON video_tasks (next_poll_at);
CREATE INDEX IF NOT EXISTS video_tasks_due_poll_idx ON video_tasks (status, next_poll_at, updated_at);
CREATE INDEX IF NOT EXISTS video_tasks_user_status_idx ON video_tasks (user_id, status);
CREATE INDEX IF NOT EXISTS video_tasks_api_key_id_idx ON video_tasks (api_key_id);
CREATE INDEX IF NOT EXISTS video_tasks_provider_id_idx ON video_tasks (provider_id);

View File

@@ -34,6 +34,7 @@ CREATE TABLE IF NOT EXISTS oauth_providers (
frontend_callback_url TEXT NOT NULL,
attribute_mapping TEXT,
extra_config TEXT,
icon_url TEXT,
is_enabled INTEGER NOT NULL DEFAULT 0,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL

View File

@@ -100,6 +100,65 @@ CREATE INDEX IF NOT EXISTS idx_payment_orders_gateway_order_id ON payment_orders
CREATE INDEX IF NOT EXISTS idx_payment_orders_kind_status ON payment_orders (order_kind, status);
CREATE INDEX IF NOT EXISTS idx_payment_orders_product ON payment_orders (product_id);
CREATE TABLE IF NOT EXISTS user_invite_codes (
user_id TEXT PRIMARY KEY NOT NULL,
invite_code TEXT NOT NULL,
active INTEGER NOT NULL DEFAULT 1,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE (invite_code),
CONSTRAINT user_invite_codes_user_id_fkey FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS user_referrals (
id TEXT PRIMARY KEY NOT NULL,
inviter_user_id TEXT NOT NULL,
invitee_user_id TEXT NOT NULL,
invite_code_snapshot TEXT NOT NULL,
source_json TEXT,
first_paid_order_id TEXT,
first_paid_at INTEGER,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE (invitee_user_id),
CONSTRAINT user_referrals_inviter_user_id_fkey FOREIGN KEY (inviter_user_id) REFERENCES users (id) ON DELETE CASCADE,
CONSTRAINT user_referrals_invitee_user_id_fkey FOREIGN KEY (invitee_user_id) REFERENCES users (id) ON DELETE CASCADE,
CONSTRAINT user_referrals_first_paid_order_fkey FOREIGN KEY (first_paid_order_id) REFERENCES payment_orders (id) ON DELETE SET NULL
);
CREATE INDEX IF NOT EXISTS idx_user_referrals_inviter ON user_referrals (inviter_user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_user_referrals_created ON user_referrals (created_at);
CREATE INDEX IF NOT EXISTS idx_user_referrals_invite_code ON user_referrals (invite_code_snapshot);
CREATE TABLE IF NOT EXISTS referral_rewards (
id TEXT PRIMARY KEY NOT NULL,
referral_id TEXT NOT NULL,
inviter_user_id TEXT NOT NULL,
invitee_user_id TEXT NOT NULL,
reward_type TEXT NOT NULL,
trigger_point TEXT NOT NULL,
source_order_id TEXT,
idempotency_key TEXT NOT NULL,
amount_usd REAL NOT NULL,
status TEXT NOT NULL DEFAULT 'pending',
wallet_transaction_id TEXT,
reversed_amount_usd REAL NOT NULL DEFAULT 0,
pending_reversal_amount_usd REAL NOT NULL DEFAULT 0,
failure_reason TEXT,
admin_operator_id TEXT,
admin_note TEXT,
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE (idempotency_key),
CONSTRAINT referral_rewards_referral_id_fkey FOREIGN KEY (referral_id) REFERENCES user_referrals (id) ON DELETE CASCADE,
CONSTRAINT referral_rewards_inviter_user_id_fkey FOREIGN KEY (inviter_user_id) REFERENCES users (id) ON DELETE CASCADE,
CONSTRAINT referral_rewards_invitee_user_id_fkey FOREIGN KEY (invitee_user_id) REFERENCES users (id) ON DELETE CASCADE,
CONSTRAINT referral_rewards_source_order_fkey FOREIGN KEY (source_order_id) REFERENCES payment_orders (id) ON DELETE SET NULL
);
CREATE INDEX IF NOT EXISTS idx_referral_rewards_inviter_status ON referral_rewards (inviter_user_id, status, created_at);
CREATE INDEX IF NOT EXISTS idx_referral_rewards_inviter_created ON referral_rewards (inviter_user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_referral_rewards_created ON referral_rewards (created_at);
CREATE INDEX IF NOT EXISTS idx_referral_rewards_source_order ON referral_rewards (source_order_id);
CREATE TABLE IF NOT EXISTS payment_gateway_configs (
provider TEXT PRIMARY KEY NOT NULL,
enabled INTEGER NOT NULL DEFAULT 0,
@@ -182,6 +241,7 @@ CREATE TABLE IF NOT EXISTS entitlement_usage_ledgers (
UNIQUE (user_entitlement_id, request_id)
);
CREATE INDEX IF NOT EXISTS idx_entitlement_usage_user_date ON entitlement_usage_ledgers (user_id, usage_date);
CREATE INDEX IF NOT EXISTS idx_entitlement_usage_entitlement_date ON entitlement_usage_ledgers (user_entitlement_id, usage_date);
CREATE TABLE IF NOT EXISTS refund_requests (
id TEXT PRIMARY KEY NOT NULL,

View File

@@ -110,6 +110,32 @@ CREATE INDEX IF NOT EXISTS usage_request_id_idx ON "usage" (request_id);
CREATE INDEX IF NOT EXISTS usage_user_id_idx ON "usage" (user_id);
CREATE INDEX IF NOT EXISTS usage_wallet_id_idx ON "usage" (wallet_id);
CREATE TABLE IF NOT EXISTS usage_counter_deltas (
id TEXT PRIMARY KEY NOT NULL,
request_id TEXT NOT NULL,
kind TEXT NOT NULL,
target_id TEXT NOT NULL,
request_count_delta INTEGER NOT NULL DEFAULT 0,
total_requests_delta INTEGER NOT NULL DEFAULT 0,
success_count_delta INTEGER NOT NULL DEFAULT 0,
error_count_delta INTEGER NOT NULL DEFAULT 0,
dns_failures_delta INTEGER NOT NULL DEFAULT 0,
stream_errors_delta INTEGER NOT NULL DEFAULT 0,
total_tokens_delta INTEGER NOT NULL DEFAULT 0,
total_cost_usd_delta REAL NOT NULL DEFAULT 0,
total_response_time_ms_delta INTEGER NOT NULL DEFAULT 0,
last_used_at_unix_secs INTEGER,
last_used_ip TEXT,
candidate_last_used_at_unix_secs INTEGER,
removed_last_used_at_unix_secs INTEGER,
usage_created_at_unix_secs INTEGER,
created_at INTEGER NOT NULL,
processed_at INTEGER
);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_unprocessed ON usage_counter_deltas (created_at, id);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_processed ON usage_counter_deltas (processed_at, created_at, id);
CREATE INDEX IF NOT EXISTS ix_usage_counter_deltas_request_kind ON usage_counter_deltas (request_id, kind, target_id);
CREATE TABLE IF NOT EXISTS usage_settlement_snapshots (
request_id TEXT PRIMARY KEY NOT NULL,
billing_status TEXT NOT NULL,

View File

@@ -113,6 +113,17 @@ type = "text"
length = 32
default = "system"
[[table.users.columns]]
name = "privacy_policy_accepted_version"
type = "text"
length = 64
nullable = true
[[table.users.columns]]
name = "privacy_policy_accepted_at"
type = "timestamp"
nullable = true
[[table.users.columns]]
name = "metadata"
type = "json"
@@ -544,6 +555,11 @@ name = "is_pinned"
type = "bool"
default = false
[[table.announcements.columns]]
name = "requires_ack"
type = "bool"
default = false
[[table.announcements.columns]]
name = "start_time"
type = "unix_seconds"

View File

@@ -579,6 +579,10 @@ type = "unix_seconds"
name = "provider_api_keys_provider_id_idx"
columns = ["provider_id"]
[[table.provider_api_keys.indexes]]
name = "idx_provider_api_keys_provider_default_sort"
columns = ["provider_id", "internal_priority", "name", "id"]
[table.pool_member_scores]
domain = "provider_catalog"
order = 44
@@ -1296,6 +1300,10 @@ columns = ["external_task_id"]
name = "video_tasks_next_poll_idx"
columns = ["next_poll_at"]
[[table.video_tasks.indexes]]
name = "video_tasks_due_poll_idx"
columns = ["status", "next_poll_at", "updated_at"]
[[table.video_tasks.indexes]]
name = "video_tasks_user_status_idx"
columns = ["user_id", "status"]

View File

@@ -137,6 +137,12 @@ name = "extra_config"
type = "json"
nullable = true
[[table.oauth_providers.columns]]
name = "icon_url"
type = "text"
length = 500
nullable = true
[[table.oauth_providers.columns]]
name = "is_enabled"
type = "bool"

View File

@@ -438,6 +438,275 @@ columns = ["order_kind", "status"]
name = "idx_payment_orders_product"
columns = ["product_id"]
[table.user_invite_codes]
domain = "wallet_billing"
order = 42
primary_key = ["user_id"]
[[table.user_invite_codes.columns]]
name = "user_id"
type = "text_id"
length = 64
[[table.user_invite_codes.columns]]
name = "invite_code"
type = "text"
length = 64
[[table.user_invite_codes.columns]]
name = "active"
type = "bool"
default = true
[[table.user_invite_codes.columns]]
name = "created_at"
type = "timestamp"
[[table.user_invite_codes.columns]]
name = "updated_at"
type = "timestamp"
[[table.user_invite_codes.uniques]]
name = "user_invite_codes_invite_code_key"
columns = ["invite_code"]
[[table.user_invite_codes.foreign_keys]]
name = "user_invite_codes_user_id_fkey"
columns = ["user_id"]
references_table = "users"
references_columns = ["id"]
on_delete = "cascade"
[table.user_referrals]
domain = "wallet_billing"
order = 43
primary_key = ["id"]
[[table.user_referrals.columns]]
name = "id"
type = "text_id"
length = 64
[[table.user_referrals.columns]]
name = "inviter_user_id"
type = "text_id"
length = 64
[[table.user_referrals.columns]]
name = "invitee_user_id"
type = "text_id"
length = 64
[[table.user_referrals.columns]]
name = "invite_code_snapshot"
type = "text"
length = 64
[[table.user_referrals.columns]]
name = "source_json"
type = "json"
nullable = true
[[table.user_referrals.columns]]
name = "first_paid_order_id"
type = "text_id"
length = 64
nullable = true
[[table.user_referrals.columns]]
name = "first_paid_at"
type = "timestamp"
nullable = true
[[table.user_referrals.columns]]
name = "created_at"
type = "timestamp"
[[table.user_referrals.columns]]
name = "updated_at"
type = "timestamp"
[[table.user_referrals.uniques]]
name = "user_referrals_invitee_user_id_key"
columns = ["invitee_user_id"]
[[table.user_referrals.indexes]]
name = "idx_user_referrals_inviter"
columns = ["inviter_user_id", "created_at"]
[[table.user_referrals.indexes]]
name = "idx_user_referrals_created"
columns = ["created_at"]
[[table.user_referrals.indexes]]
name = "idx_user_referrals_invite_code"
columns = ["invite_code_snapshot"]
[[table.user_referrals.foreign_keys]]
name = "user_referrals_inviter_user_id_fkey"
columns = ["inviter_user_id"]
references_table = "users"
references_columns = ["id"]
on_delete = "cascade"
[[table.user_referrals.foreign_keys]]
name = "user_referrals_invitee_user_id_fkey"
columns = ["invitee_user_id"]
references_table = "users"
references_columns = ["id"]
on_delete = "cascade"
[[table.user_referrals.foreign_keys]]
name = "user_referrals_first_paid_order_fkey"
columns = ["first_paid_order_id"]
references_table = "payment_orders"
references_columns = ["id"]
on_delete = "set_null"
[table.referral_rewards]
domain = "wallet_billing"
order = 44
primary_key = ["id"]
[[table.referral_rewards.columns]]
name = "id"
type = "text_id"
length = 64
[[table.referral_rewards.columns]]
name = "referral_id"
type = "text_id"
length = 64
[[table.referral_rewards.columns]]
name = "inviter_user_id"
type = "text_id"
length = 64
[[table.referral_rewards.columns]]
name = "invitee_user_id"
type = "text_id"
length = 64
[[table.referral_rewards.columns]]
name = "reward_type"
type = "text"
length = 32
[[table.referral_rewards.columns]]
name = "trigger_point"
type = "text"
length = 64
[[table.referral_rewards.columns]]
name = "source_order_id"
type = "text_id"
length = 64
nullable = true
[[table.referral_rewards.columns]]
name = "idempotency_key"
type = "text"
length = 128
[[table.referral_rewards.columns]]
name = "amount_usd"
type = "float64"
[[table.referral_rewards.columns]]
name = "status"
type = "text"
length = 32
default = "pending"
[[table.referral_rewards.columns]]
name = "wallet_transaction_id"
type = "text_id"
length = 64
nullable = true
[[table.referral_rewards.columns]]
name = "reversed_amount_usd"
type = "float64"
default = 0
[[table.referral_rewards.columns]]
name = "pending_reversal_amount_usd"
type = "float64"
default = 0
[[table.referral_rewards.columns]]
name = "failure_reason"
type = "long_text"
nullable = true
[[table.referral_rewards.columns]]
name = "admin_operator_id"
type = "text_id"
length = 64
nullable = true
[[table.referral_rewards.columns]]
name = "admin_note"
type = "long_text"
nullable = true
[[table.referral_rewards.columns]]
name = "created_at"
type = "timestamp"
[[table.referral_rewards.columns]]
name = "updated_at"
type = "timestamp"
[[table.referral_rewards.uniques]]
name = "referral_rewards_idempotency_key_key"
columns = ["idempotency_key"]
[[table.referral_rewards.indexes]]
name = "idx_referral_rewards_inviter_status"
columns = ["inviter_user_id", "status", "created_at"]
[[table.referral_rewards.indexes]]
name = "idx_referral_rewards_inviter_created"
columns = ["inviter_user_id", "created_at"]
[[table.referral_rewards.indexes]]
name = "idx_referral_rewards_created"
columns = ["created_at"]
[[table.referral_rewards.indexes]]
name = "idx_referral_rewards_source_order"
columns = ["source_order_id"]
[[table.referral_rewards.foreign_keys]]
name = "referral_rewards_referral_id_fkey"
columns = ["referral_id"]
references_table = "user_referrals"
references_columns = ["id"]
on_delete = "cascade"
[[table.referral_rewards.foreign_keys]]
name = "referral_rewards_inviter_user_id_fkey"
columns = ["inviter_user_id"]
references_table = "users"
references_columns = ["id"]
on_delete = "cascade"
[[table.referral_rewards.foreign_keys]]
name = "referral_rewards_invitee_user_id_fkey"
columns = ["invitee_user_id"]
references_table = "users"
references_columns = ["id"]
on_delete = "cascade"
[[table.referral_rewards.foreign_keys]]
name = "referral_rewards_source_order_fkey"
columns = ["source_order_id"]
references_table = "payment_orders"
references_columns = ["id"]
on_delete = "set_null"
[table.payment_gateway_configs]
domain = "wallet_billing"
order = 45
@@ -770,6 +1039,10 @@ columns = ["user_entitlement_id", "request_id"]
name = "idx_entitlement_usage_user_date"
columns = ["user_id", "usage_date"]
[[table.entitlement_usage_ledgers.indexes]]
name = "idx_entitlement_usage_entitlement_date"
columns = ["user_entitlement_id", "usage_date"]
[[table.payment_callbacks.indexes]]
name = "idx_payment_callbacks_order"
columns = ["order_no"]

View File

@@ -554,6 +554,121 @@ columns = ["user_id"]
name = "usage_wallet_id_idx"
columns = ["wallet_id"]
[table.usage_counter_deltas]
domain = "usage"
order = 15
primary_key = ["id"]
[[table.usage_counter_deltas.columns]]
name = "id"
type = "text"
length = 36
[[table.usage_counter_deltas.columns]]
name = "request_id"
type = "text"
length = 128
[[table.usage_counter_deltas.columns]]
name = "kind"
type = "text"
length = 64
[[table.usage_counter_deltas.columns]]
name = "target_id"
type = "text"
[[table.usage_counter_deltas.columns]]
name = "request_count_delta"
type = "int64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "total_requests_delta"
type = "int64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "success_count_delta"
type = "int64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "error_count_delta"
type = "int64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "dns_failures_delta"
type = "int64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "stream_errors_delta"
type = "int64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "total_tokens_delta"
type = "int64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "total_cost_usd_delta"
type = "float64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "total_response_time_ms_delta"
type = "int64"
default = 0
[[table.usage_counter_deltas.columns]]
name = "last_used_at_unix_secs"
type = "unix_seconds"
nullable = true
[[table.usage_counter_deltas.columns]]
name = "last_used_ip"
type = "text"
nullable = true
[[table.usage_counter_deltas.columns]]
name = "candidate_last_used_at_unix_secs"
type = "unix_seconds"
nullable = true
[[table.usage_counter_deltas.columns]]
name = "removed_last_used_at_unix_secs"
type = "unix_seconds"
nullable = true
[[table.usage_counter_deltas.columns]]
name = "usage_created_at_unix_secs"
type = "unix_seconds"
nullable = true
[[table.usage_counter_deltas.columns]]
name = "created_at"
type = "timestamp"
[[table.usage_counter_deltas.columns]]
name = "processed_at"
type = "timestamp"
nullable = true
[[table.usage_counter_deltas.indexes]]
name = "ix_usage_counter_deltas_unprocessed"
columns = ["created_at", "id"]
[[table.usage_counter_deltas.indexes]]
name = "ix_usage_counter_deltas_processed"
columns = ["processed_at", "created_at", "id"]
[[table.usage_counter_deltas.indexes]]
name = "ix_usage_counter_deltas_request_kind"
columns = ["request_id", "kind", "target_id"]
[table.usage_settlement_snapshots]
domain = "usage"
order = 20