Ctrl K
ComunidadGuías…

read_replicate/schema_replicate.sql

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
BEGIN;

DROP TABLE IF EXISTS public.version_files, public.delta_files, public.delta_sessions, public.channel_devices, public.manifest, public.onboarding_demo_data, public.app_versions, public.channels, public.apps, public.notifications, public.org_users, public.orgs, public.stripe_info CASCADE;
DROP SEQUENCE IF EXISTS public.app_versions_id_seq, public.channel_devices_id_seq, public.channel_id_seq, public.manifest_id_seq, public.org_users_id_seq, public.stripe_info_id_seq CASCADE;
DROP FUNCTION IF EXISTS public.one_month_ahead();
DROP TYPE IF EXISTS public.channel_update_package, public.manifest_entry, public.disable_update, public.stripe_status;

--
--


--
-- Name: channel_update_package; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE public.channel_update_package AS ENUM (
    'all',
    'zip',
    'delta',
    'zip_from_builtin',
    'delta_from_builtin'
);


--
-- Name: disable_update; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE public.disable_update AS ENUM (
    'major',
    'minor',
    'patch',
    'version_number',
    'none'
);


--
-- Name: manifest_entry; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE public.manifest_entry AS (
	file_name character varying,
	s3_path character varying,
	file_hash character varying
);


--
-- Name: stripe_status; Type: TYPE; Schema: public; Owner: -
--

CREATE TYPE public.stripe_status AS ENUM (
    'created',
    'succeeded',
    'updated',
    'failed',
    'deleted',
    'canceled'
);


--
-- Name: one_month_ahead(); Type: FUNCTION; Schema: public; Owner: -
--

CREATE FUNCTION public.one_month_ahead() RETURNS timestamp without time zone
    LANGUAGE plpgsql
    SET search_path TO ''
    AS $$
BEGIN
   RETURN NOW() + INTERVAL '1 month';
END;
$$;


--
--


--
--


--
-- Name: apps; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.apps (
    created_at timestamp with time zone DEFAULT now(),
    app_id character varying NOT NULL,
    icon_url character varying NOT NULL,
    user_id uuid,
    name character varying,
    last_version character varying,
    updated_at timestamp with time zone,
    id uuid DEFAULT gen_random_uuid(),
    retention bigint DEFAULT '2592000'::bigint NOT NULL,
    owner_org uuid NOT NULL,
    default_upload_channel character varying DEFAULT 'production'::character varying NOT NULL,
    transfer_history jsonb[] DEFAULT '{}'::jsonb[],
    channel_device_count bigint DEFAULT 0 NOT NULL,
    manifest_bundle_count bigint DEFAULT 0 NOT NULL,
    expose_metadata boolean DEFAULT false NOT NULL,
    allow_preview boolean DEFAULT false NOT NULL,
    allow_device_custom_id boolean DEFAULT true NOT NULL,
    need_onboarding boolean DEFAULT false NOT NULL,
    existing_app boolean DEFAULT false NOT NULL,
    ios_store_url text,
    android_store_url text,
    build_timeout_seconds bigint DEFAULT 900 NOT NULL,
    build_timeout_updated_at timestamp with time zone DEFAULT now() NOT NULL,
    block_provider_infra_requests boolean DEFAULT true NOT NULL,
    rollout_channel_count bigint DEFAULT 0 NOT NULL,
    rollout_paused_version_names character varying[] DEFAULT '{}'::character varying[] NOT NULL,
    created_from_onboarding boolean DEFAULT false NOT NULL,
    onboarding_completed_at timestamp with time zone,
    onboarding jsonb DEFAULT '{}'::jsonb NOT NULL,
    device_data_collection jsonb DEFAULT '{"country": true, "is_prod": true, "platform": true, "os_version": true, "is_emulator": true, "version_build": true, "install_source": true, "plugin_version": true}'::jsonb NOT NULL,
    CONSTRAINT apps_build_timeout_seconds_check CHECK (((build_timeout_seconds >= 300) AND (build_timeout_seconds <= 21600)))
);

ALTER TABLE ONLY public.apps REPLICA IDENTITY FULL;


--
-- Name: app_versions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.app_versions (
    id bigint NOT NULL,
    created_at timestamp with time zone DEFAULT now(),
    app_id character varying NOT NULL,
    name character varying NOT NULL,
    updated_at timestamp with time zone DEFAULT now(),
    deleted boolean DEFAULT false NOT NULL,
    external_url character varying,
    checksum character varying,
    session_key character varying,
    storage_provider text DEFAULT 'r2'::text NOT NULL,
    min_update_version character varying,
    native_packages jsonb[],
    owner_org uuid NOT NULL,
    user_id uuid,
    r2_path character varying,
    manifest public.manifest_entry[],
    link text,
    comment text,
    manifest_count integer DEFAULT 0 NOT NULL,
    key_id character varying(20),
    cli_version character varying,
    deleted_at timestamp with time zone,
    created_by_apikey_rbac_id uuid
)
WITH (autovacuum_vacuum_scale_factor='0.05', autovacuum_analyze_scale_factor='0.02');

ALTER TABLE ONLY public.app_versions REPLICA IDENTITY FULL;


--
-- Name: app_versions_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

ALTER TABLE public.app_versions ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
    SEQUENCE NAME public.app_versions_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- Name: channel_devices; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.channel_devices (
    created_at timestamp with time zone DEFAULT now(),
    channel_id bigint NOT NULL,
    app_id character varying NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    device_id text NOT NULL,
    id bigint NOT NULL,
    owner_org uuid NOT NULL,
    is_self_set boolean DEFAULT false NOT NULL
);

ALTER TABLE ONLY public.channel_devices REPLICA IDENTITY FULL;


--
-- Name: channel_devices_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

ALTER TABLE public.channel_devices ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
    SEQUENCE NAME public.channel_devices_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- Name: channels; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.channels (
    id bigint NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    name character varying NOT NULL,
    app_id character varying NOT NULL,
    version bigint,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    public boolean DEFAULT false NOT NULL,
    disable_auto_update_under_native boolean DEFAULT true NOT NULL,
    ios boolean DEFAULT true NOT NULL,
    android boolean DEFAULT true NOT NULL,
    allow_device_self_set boolean DEFAULT false NOT NULL,
    allow_emulator boolean DEFAULT true NOT NULL,
    allow_dev boolean DEFAULT true NOT NULL,
    disable_auto_update public.disable_update DEFAULT 'major'::public.disable_update NOT NULL,
    owner_org uuid NOT NULL,
    created_by uuid NOT NULL,
    allow_device boolean DEFAULT true NOT NULL,
    allow_prod boolean DEFAULT true NOT NULL,
    electron boolean DEFAULT true NOT NULL,
    rbac_id uuid DEFAULT gen_random_uuid() NOT NULL,
    rollout_version bigint,
    rollout_percentage_bps integer DEFAULT 0 NOT NULL,
    rollout_enabled boolean DEFAULT false NOT NULL,
    rollout_id uuid DEFAULT gen_random_uuid() NOT NULL,
    rollout_paused_at timestamp with time zone,
    rollout_pause_reason text,
    rollout_cache_ttl_seconds integer DEFAULT 2592000 NOT NULL,
    auto_pause_enabled boolean DEFAULT false NOT NULL,
    auto_pause_window_minutes integer DEFAULT 60 NOT NULL,
    auto_pause_failure_rate_bps integer,
    auto_pause_confidence numeric(5,4) DEFAULT 0.9500 NOT NULL,
    auto_pause_min_attempts integer,
    auto_pause_min_failures integer,
    auto_pause_action text DEFAULT 'pause'::text NOT NULL,
    auto_pause_cooldown_minutes integer DEFAULT 60 NOT NULL,
    auto_pause_last_triggered_at timestamp with time zone,
    auto_pause_last_checked_at timestamp with time zone,
    update_package public.channel_update_package DEFAULT 'all'::public.channel_update_package NOT NULL,
    paused_at timestamp with time zone,
    CONSTRAINT channels_auto_pause_action_check CHECK ((auto_pause_action = ANY (ARRAY['pause'::text, 'rollback'::text, 'notify'::text]))),
    CONSTRAINT channels_auto_pause_confidence_check CHECK (((auto_pause_confidence > (0)::numeric) AND (auto_pause_confidence < (1)::numeric))),
    CONSTRAINT channels_auto_pause_cooldown_minutes_check CHECK (((auto_pause_cooldown_minutes >= 0) AND (auto_pause_cooldown_minutes <= 10080))),
    CONSTRAINT channels_auto_pause_failure_rate_bps_check CHECK (((auto_pause_failure_rate_bps IS NULL) OR ((auto_pause_failure_rate_bps >= 0) AND (auto_pause_failure_rate_bps <= 10000)))),
    CONSTRAINT channels_auto_pause_min_attempts_check CHECK (((auto_pause_min_attempts IS NULL) OR (auto_pause_min_attempts >= 0))),
    CONSTRAINT channels_auto_pause_min_failures_check CHECK (((auto_pause_min_failures IS NULL) OR (auto_pause_min_failures >= 0))),
    CONSTRAINT channels_auto_pause_window_minutes_check CHECK (((auto_pause_window_minutes > 0) AND (auto_pause_window_minutes <= 10080))),
    CONSTRAINT channels_rollout_cache_ttl_seconds_check CHECK (((rollout_cache_ttl_seconds >= 60) AND (rollout_cache_ttl_seconds <= 31536000))),
    CONSTRAINT channels_rollout_percentage_bps_check CHECK (((rollout_percentage_bps >= 0) AND (rollout_percentage_bps <= 10000)))
);

ALTER TABLE ONLY public.channels REPLICA IDENTITY FULL;


--
-- Name: channel_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

ALTER TABLE public.channels ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
    SEQUENCE NAME public.channel_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- Name: delta_files; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.delta_files (
    id bigint NOT NULL,
    app_id character varying NOT NULL,
    s3_path character varying NOT NULL,
    file_name character varying NOT NULL,
    file_hash character varying NOT NULL,
    file_size bigint DEFAULT 0 NOT NULL,
    path_key bytea NOT NULL,
    entry_key bytea NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    path_org uuid,
    path_session bytea,
    path_sha bytea,
    file_hash_bin bytea,
    path_session_id integer
);


--
-- Name: delta_files_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

ALTER TABLE public.delta_files ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
    SEQUENCE NAME public.delta_files_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- Name: delta_sessions; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.delta_sessions (
    id integer NOT NULL,
    app_id character varying NOT NULL,
    session bytea NOT NULL
);


--
-- Name: delta_sessions_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

ALTER TABLE public.delta_sessions ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
    SEQUENCE NAME public.delta_sessions_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- Name: version_files; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.version_files (
    app_version_id bigint NOT NULL,
    file_ids bigint[] NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL
);


--
-- Name: notifications; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.notifications (
    created_at timestamp with time zone DEFAULT now(),
    updated_at timestamp with time zone DEFAULT now(),
    last_send_at timestamp with time zone DEFAULT now() NOT NULL,
    total_send bigint DEFAULT '1'::bigint NOT NULL,
    owner_org uuid NOT NULL,
    event character varying(255) NOT NULL,
    uniq_id character varying(255) NOT NULL
);


--
-- Name: onboarding_demo_data; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.onboarding_demo_data (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    app_id character varying NOT NULL,
    owner_org uuid NOT NULL,
    relation_name text NOT NULL,
    row_key text NOT NULL,
    seed_id uuid NOT NULL,
    CONSTRAINT onboarding_demo_data_relation_name_check CHECK ((relation_name = ANY (ARRAY['app_versions'::text, 'app_versions_meta'::text, 'manifest'::text, 'channels'::text, 'channel_devices'::text, 'deploy_history'::text, 'devices'::text, 'build_requests'::text])))
);


--
-- Name: org_users; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.org_users (
    id bigint NOT NULL,
    created_at timestamp with time zone DEFAULT now(),
    updated_at timestamp with time zone DEFAULT now(),
    user_id uuid NOT NULL,
    org_id uuid NOT NULL,
    app_id character varying,
    channel_id bigint,
    rbac_role_name text DEFAULT 'org_member'::text,
    is_invite boolean DEFAULT false NOT NULL
);


--
-- Name: org_users_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

ALTER TABLE public.org_users ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
    SEQUENCE NAME public.org_users_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1
);


--
-- Name: orgs; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.orgs (
    id uuid DEFAULT gen_random_uuid() NOT NULL,
    created_by uuid NOT NULL,
    created_at timestamp with time zone DEFAULT now(),
    updated_at timestamp with time zone DEFAULT now(),
    logo text,
    name text NOT NULL,
    management_email text NOT NULL,
    customer_id character varying,
    stats_updated_at timestamp without time zone,
    last_stats_updated_at timestamp without time zone,
    enforcing_2fa boolean DEFAULT false NOT NULL,
    email_preferences jsonb DEFAULT '{"onboarding": true, "usage_limit": true, "credit_usage": true, "device_error": true, "weekly_stats": true, "monthly_stats": true, "bundle_created": true, "bundle_deployed": true, "deploy_stats_24h": true, "billing_period_stats": true, "channel_self_rejected": true}'::jsonb NOT NULL,
    password_policy_config jsonb,
    enforce_hashed_api_keys boolean DEFAULT false NOT NULL,
    require_apikey_expiration boolean DEFAULT false NOT NULL,
    max_apikey_expiration_days integer,
    enforce_encrypted_bundles boolean DEFAULT false NOT NULL,
    required_encryption_key character varying(21) DEFAULT NULL::character varying,
    has_usage_credits boolean DEFAULT false NOT NULL,
    website text,
    stats_refresh_requested_at timestamp without time zone,
    onboarding jsonb DEFAULT '{"intent": "unknown"}'::jsonb NOT NULL,
    auto_top_up_enabled boolean DEFAULT false NOT NULL,
    auto_top_up_threshold numeric(18,6) DEFAULT 10 NOT NULL,
    auto_top_up_last_attempt_at timestamp with time zone,
    support_channel_type text,
    support_channel_url text,
    support_channel_set_at timestamp with time zone,
    auto_top_up_monthly_limit numeric(18,6) DEFAULT 0 NOT NULL,
    signup_plugin text,
    CONSTRAINT orgs_max_apikey_expiration_days_valid CHECK (((max_apikey_expiration_days IS NULL) OR ((max_apikey_expiration_days >= 1) AND (max_apikey_expiration_days <= 365)))),
    CONSTRAINT orgs_password_policy_config_min_length_check CHECK (((password_policy_config IS NULL) OR ((jsonb_typeof(password_policy_config) = 'object'::text) AND ((NOT (password_policy_config ? 'min_length'::text)) OR ((jsonb_typeof((password_policy_config -> 'min_length'::text)) = 'number'::text) AND (((password_policy_config ->> 'min_length'::text))::numeric = trunc(((password_policy_config ->> 'min_length'::text))::numeric)) AND ((((password_policy_config ->> 'min_length'::text))::numeric >= (6)::numeric) AND (((password_policy_config ->> 'min_length'::text))::numeric <= (72)::numeric))))))),
    CONSTRAINT orgs_required_encryption_key_valid CHECK (((required_encryption_key IS NULL) OR (length((required_encryption_key)::text) = ANY (ARRAY[20, 21])))),
    CONSTRAINT orgs_support_channel_type_check CHECK (((support_channel_type IS NULL) OR (support_channel_type = ANY (ARRAY['slack'::text, 'discord'::text, 'teams'::text])))),
    CONSTRAINT orgs_support_channel_url_check CHECK ((((support_channel_type IS NULL) AND (support_channel_url IS NULL)) OR ((support_channel_type IS NOT NULL) AND (support_channel_url IS NOT NULL) AND (char_length(support_channel_url) <= 2048) AND (support_channel_url ~ '^https://[^/\s]+\S*$'::text))))
);

ALTER TABLE ONLY public.orgs REPLICA IDENTITY FULL;


--
-- Name: stripe_info; Type: TABLE; Schema: public; Owner: -
--

CREATE TABLE public.stripe_info (
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    subscription_id character varying,
    customer_id character varying NOT NULL,
    status public.stripe_status,
    product_id character varying NOT NULL,
    trial_at timestamp with time zone DEFAULT now() NOT NULL,
    price_id character varying,
    is_good_plan boolean DEFAULT true,
    plan_usage bigint DEFAULT '0'::bigint,
    subscription_anchor_start timestamp with time zone DEFAULT now() NOT NULL,
    subscription_anchor_end timestamp with time zone DEFAULT public.one_month_ahead() NOT NULL,
    canceled_at timestamp with time zone,
    mau_exceeded boolean DEFAULT false,
    storage_exceeded boolean DEFAULT false,
    bandwidth_exceeded boolean DEFAULT false,
    id integer NOT NULL,
    plan_calculated_at timestamp with time zone,
    build_time_exceeded boolean DEFAULT false,
    upgraded_at timestamp with time zone,
    paid_at timestamp with time zone,
    customer_country character varying(2),
    last_stripe_event_at timestamp with time zone,
    past_due_at timestamp with time zone,
    churn_reason text,
    is_above_plan boolean,
    extra_mau bigint DEFAULT 0 NOT NULL,
    billing_account text DEFAULT 'ee'::text NOT NULL,
    CONSTRAINT stripe_info_billing_account_check CHECK ((billing_account = ANY (ARRAY['ee'::text, 'us'::text])))
);

ALTER TABLE ONLY public.stripe_info REPLICA IDENTITY FULL;


--
-- Name: stripe_info_id_seq; Type: SEQUENCE; Schema: public; Owner: -
--

CREATE SEQUENCE public.stripe_info_id_seq
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


--
-- Name: stripe_info_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
--

ALTER SEQUENCE public.stripe_info_id_seq OWNED BY public.stripe_info.id;


--
-- Name: stripe_info id; Type: DEFAULT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.stripe_info ALTER COLUMN id SET DEFAULT nextval('public.stripe_info_id_seq'::regclass);


--
-- Name: app_versions app_versions_name_app_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.app_versions
    ADD CONSTRAINT app_versions_name_app_id_key UNIQUE (name, app_id);


--
-- Name: app_versions app_versions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.app_versions
    ADD CONSTRAINT app_versions_pkey PRIMARY KEY (id);


--
-- Name: apps apps_id_unique; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.apps
    ADD CONSTRAINT apps_id_unique UNIQUE (id);


--
-- Name: apps apps_onboarding_valid; Type: CHECK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE public.apps
    ADD CONSTRAINT apps_onboarding_valid CHECK (((jsonb_typeof(onboarding) = 'object'::text) AND ((NOT (onboarding ? 'features'::text)) OR (jsonb_typeof((onboarding -> 'features'::text)) = 'object'::text)) AND ((NOT (onboarding ? 'setup'::text)) OR ((jsonb_typeof((onboarding -> 'setup'::text)) = 'object'::text) AND ((NOT ((onboarding -> 'setup'::text) ? 'source'::text)) OR (((onboarding -> 'setup'::text) ->> 'source'::text) = ANY (ARRAY['manual'::text, 'cli'::text, 'mcp'::text, 'ai'::text]))) AND ((NOT ((onboarding -> 'setup'::text) ? 'outcome'::text)) OR (((onboarding -> 'setup'::text) ->> 'outcome'::text) = ANY (ARRAY['in_progress'::text, 'completed'::text, 'skipped'::text, 'switched_to_manual'::text]))))) AND ((NOT (onboarding ? 'source'::text)) OR ((onboarding ->> 'source'::text) = ANY (ARRAY['manual'::text, 'cli'::text, 'mcp'::text, 'ai'::text]))) AND ((NOT (onboarding ? 'outcome'::text)) OR ((onboarding ->> 'outcome'::text) = ANY (ARRAY['in_progress'::text, 'completed'::text, 'skipped'::text, 'switched_to_manual'::text]))))) NOT VALID;


--
-- Name: apps apps_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.apps
    ADD CONSTRAINT apps_pkey PRIMARY KEY (app_id);


--
-- Name: channel_devices channel_devices_app_id_device_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.channel_devices
    ADD CONSTRAINT channel_devices_app_id_device_id_key UNIQUE (app_id, device_id);


--
-- Name: channel_devices channel_devices_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.channel_devices
    ADD CONSTRAINT channel_devices_pkey PRIMARY KEY (id);


--
-- Name: channels channel_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.channels
    ADD CONSTRAINT channel_pkey PRIMARY KEY (id);


--
-- Name: channels channels_rbac_id_key; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.channels
    ADD CONSTRAINT channels_rbac_id_key UNIQUE (rbac_id);


--
-- Name: delta_files delta_files_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.delta_files
    ADD CONSTRAINT delta_files_pkey PRIMARY KEY (id);


--
-- Name: delta_sessions delta_sessions_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.delta_sessions
    ADD CONSTRAINT delta_sessions_pkey PRIMARY KEY (id);


--
-- Name: notifications notifications_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.notifications
    ADD CONSTRAINT notifications_pkey PRIMARY KEY (owner_org, event, uniq_id);


--
-- Name: onboarding_demo_data onboarding_demo_data_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.onboarding_demo_data
    ADD CONSTRAINT onboarding_demo_data_pkey PRIMARY KEY (id);


--
-- Name: org_users org_users_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.org_users
    ADD CONSTRAINT org_users_pkey PRIMARY KEY (id);


--
-- Name: orgs orgs_auto_top_up_monthly_limit_valid; Type: CHECK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE public.orgs
    ADD CONSTRAINT orgs_auto_top_up_monthly_limit_valid CHECK (((auto_top_up_monthly_limit >= (0)::numeric) AND (auto_top_up_monthly_limit = trunc(auto_top_up_monthly_limit)) AND (auto_top_up_monthly_limit < 'Infinity'::numeric) AND ((auto_top_up_monthly_limit = (0)::numeric) OR (auto_top_up_monthly_limit >= auto_top_up_threshold)))) NOT VALID;


--
-- Name: orgs orgs_auto_top_up_threshold_min; Type: CHECK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE public.orgs
    ADD CONSTRAINT orgs_auto_top_up_threshold_min CHECK (((auto_top_up_threshold >= (10)::numeric) AND (auto_top_up_threshold = trunc(auto_top_up_threshold)) AND (auto_top_up_threshold < 'Infinity'::numeric) AND (auto_top_up_threshold > '-Infinity'::numeric))) NOT VALID;


--
-- Name: orgs orgs_onboarding_valid; Type: CHECK CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE public.orgs
    ADD CONSTRAINT orgs_onboarding_valid CHECK (((jsonb_typeof(onboarding) = 'object'::text) AND ((NOT (onboarding ? 'intent'::text)) OR ((onboarding ->> 'intent'::text) = ANY (ARRAY['unknown'::text, 'ota'::text, 'builder'::text, 'both'::text, 'exploring'::text, 'publish'::text]))) AND ((NOT (onboarding ? 'development_environment'::text)) OR ((jsonb_typeof((onboarding -> 'development_environment'::text)) = 'string'::text) AND ((onboarding ->> 'development_environment'::text) = ANY (ARRAY['hosted_builder'::text, 'ai_assistant'::text, 'hand_coded'::text, 'other'::text, 'local_project'::text, 'exploring'::text, 'skipped'::text])))))) NOT VALID;


--
-- Name: orgs orgs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.orgs
    ADD CONSTRAINT orgs_pkey PRIMARY KEY (id);


--
-- Name: stripe_info stripe_info_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.stripe_info
    ADD CONSTRAINT stripe_info_pkey PRIMARY KEY (customer_id);


--
-- Name: orgs unique customer_id on orgs; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.orgs
    ADD CONSTRAINT "unique customer_id on orgs" UNIQUE (customer_id);


--
-- Name: channels unique_name_app_id; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.channels
    ADD CONSTRAINT unique_name_app_id UNIQUE (name, app_id);


--
-- Name: orgs unique_name_created_by; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.orgs
    ADD CONSTRAINT unique_name_created_by UNIQUE (name, created_by);


--
-- Name: version_files version_files_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--

ALTER TABLE ONLY public.version_files
    ADD CONSTRAINT version_files_pkey PRIMARY KEY (app_version_id);


--
-- Name: app_versions_cli_version_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX app_versions_cli_version_idx ON public.app_versions USING btree (cli_version);


--
-- Name: app_versions_r2_path_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX app_versions_r2_path_idx ON public.app_versions USING btree (r2_path);


--
-- Name: apps_created_at_onboarding_setup_source_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX apps_created_at_onboarding_setup_source_idx ON public.apps USING btree (created_at, (((onboarding -> 'setup'::text) ->> 'source'::text)));


--
-- Name: channel_devices_device_id_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX channel_devices_device_id_idx ON public.channel_devices USING btree (device_id);


--
-- Name: channels_one_public_android_per_app_key; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX channels_one_public_android_per_app_key ON public.channels USING btree (app_id) WHERE ((public = true) AND (android = true));


--
-- Name: channels_one_public_electron_per_app_key; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX channels_one_public_electron_per_app_key ON public.channels USING btree (app_id) WHERE ((public = true) AND (electron = true));


--
-- Name: channels_one_public_ios_per_app_key; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX channels_one_public_ios_per_app_key ON public.channels USING btree (app_id) WHERE ((public = true) AND (ios = true));


--
-- Name: finx_app_versions_owner_org; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_app_versions_owner_org ON public.app_versions USING btree (owner_org);


--
-- Name: finx_apps_owner_org; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_apps_owner_org ON public.apps USING btree (owner_org);


--
-- Name: finx_apps_user_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_apps_user_id ON public.apps USING btree (user_id);


--
-- Name: finx_channel_devices_channel_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_channel_devices_channel_id ON public.channel_devices USING btree (channel_id);


--
-- Name: finx_channels_app_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_channels_app_id ON public.channels USING btree (app_id);


--
-- Name: finx_channels_owner_org; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_channels_owner_org ON public.channels USING btree (owner_org);


--
-- Name: finx_channels_version; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_channels_version ON public.channels USING btree (version);


--
-- Name: finx_org_users_channel_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_org_users_channel_id ON public.org_users USING btree (channel_id);


--
-- Name: finx_org_users_org_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_org_users_org_id ON public.org_users USING btree (org_id);


--
-- Name: finx_org_users_user_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_org_users_user_id ON public.org_users USING btree (user_id);


--
-- Name: finx_orgs_created_by; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_orgs_created_by ON public.orgs USING btree (created_by);


--
-- Name: finx_orgs_stripe_info; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX finx_orgs_stripe_info ON public.stripe_info USING btree (product_id);


--
-- Name: idx_app_id_app_versions; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_id_app_versions ON public.app_versions USING btree (app_id);


--
-- Name: idx_app_id_name_app_versions; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_id_name_app_versions ON public.app_versions USING btree (app_id, name);


--
-- Name: idx_app_versions_app_deleted_created_at; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_app_deleted_created_at ON public.app_versions USING btree (app_id, deleted, created_at DESC);


--
-- Name: idx_app_versions_created_at; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_created_at ON public.app_versions USING btree (created_at);


--
-- Name: idx_app_versions_created_at_app_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_created_at_app_id ON public.app_versions USING btree (created_at, app_id);


--
-- Name: idx_app_versions_deleted; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_deleted ON public.app_versions USING btree (deleted);


--
-- Name: idx_app_versions_deleted_at; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_deleted_at ON public.app_versions USING btree (deleted_at) WHERE (deleted_at IS NOT NULL);


--
-- Name: idx_app_versions_deleted_at_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_deleted_at_id ON public.app_versions USING btree (deleted_at, id) WHERE (deleted = true);


--
-- Name: idx_app_versions_deleted_manifest_pending; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_deleted_manifest_pending ON public.app_versions USING btree (updated_at NULLS FIRST, id) WHERE ((deleted = true) AND ((manifest_count > 0) OR (manifest IS NOT NULL)));


--
-- Name: idx_app_versions_deleted_with_manifest; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_deleted_with_manifest ON public.app_versions USING btree (id) WHERE ((deleted = true) AND (manifest_count > 0));


--
-- Name: idx_app_versions_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_id ON public.app_versions USING btree (id);


--
-- Name: idx_app_versions_name; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_name ON public.app_versions USING btree (name);


--
-- Name: idx_app_versions_owner_org_not_deleted; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_owner_org_not_deleted ON public.app_versions USING btree (owner_org) WHERE (deleted = false);


--
-- Name: idx_app_versions_retention_cleanup; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_app_versions_retention_cleanup ON public.app_versions USING btree (deleted, created_at, app_id) WHERE (deleted = false);


--
-- Name: idx_apps_created_at; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_apps_created_at ON public.apps USING btree (created_at);


--
-- Name: idx_apps_default_upload_channel; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_apps_default_upload_channel ON public.apps USING btree (default_upload_channel);


--
-- Name: idx_apps_onboarding_login_creator; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_apps_onboarding_login_creator ON public.apps USING btree (((onboarding ->> 'created_by_user_id'::text))) WHERE ((onboarding #>> '{setup,todo_list_version}'::text[]) = ANY (ARRAY['2'::text, '3'::text, '4'::text]));


--
-- Name: idx_apps_onboarding_ota_stage; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_apps_onboarding_ota_stage ON public.apps USING btree (((((onboarding -> 'features'::text) -> 'ota'::text) ->> 'stage'::text)));


--
-- Name: idx_apps_owner_org_app_id; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX idx_apps_owner_org_app_id ON public.apps USING btree (owner_org, app_id);


--
-- Name: idx_channels_app_id_name; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_channels_app_id_name ON public.channels USING btree (app_id, name);


--
-- Name: idx_channels_app_id_version; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_channels_app_id_version ON public.channels USING btree (app_id, version);


--
-- Name: idx_channels_public_app_id_android; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_channels_public_app_id_android ON public.channels USING btree (public, app_id, android);


--
-- Name: idx_channels_public_app_id_ios; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_channels_public_app_id_ios ON public.channels USING btree (public, app_id, ios);


--
-- Name: idx_channels_rollout_targets; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_channels_rollout_targets ON public.channels USING btree (app_id, rollout_version) WHERE (rollout_version IS NOT NULL);


--
-- Name: idx_channels_rollout_version; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_channels_rollout_version ON public.channels USING btree (rollout_version) WHERE (rollout_version IS NOT NULL);


--
-- Name: idx_orgs_customer_id; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_orgs_customer_id ON public.orgs USING btree (customer_id);


--
-- Name: idx_orgs_email_preferences; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_orgs_email_preferences ON public.orgs USING gin (email_preferences);


--
-- Name: idx_stripe_info_customer_covering; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_stripe_info_customer_covering ON public.stripe_info USING btree (customer_id) INCLUDE (product_id, subscription_anchor_start, subscription_anchor_end);


--
-- Name: idx_stripe_info_past_due_at; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_stripe_info_past_due_at ON public.stripe_info USING btree (past_due_at) WHERE (past_due_at IS NOT NULL);


--
-- Name: idx_stripe_info_trial; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX idx_stripe_info_trial ON public.stripe_info USING btree (trial_at) WHERE (trial_at IS NOT NULL);


--
-- Name: notifications_uniq_id_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX notifications_uniq_id_idx ON public.notifications USING btree (uniq_id);


--
-- Name: onboarding_demo_data_app_relation_row_key_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX onboarding_demo_data_app_relation_row_key_idx ON public.onboarding_demo_data USING btree (app_id, relation_name, row_key);


--
-- Name: onboarding_demo_data_seed_id_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX onboarding_demo_data_seed_id_idx ON public.onboarding_demo_data USING btree (seed_id);


--
-- Name: org_users_app_id_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX org_users_app_id_idx ON public.org_users USING btree (app_id);


--
-- Name: orgs_enforce_hashed_api_keys_true_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX orgs_enforce_hashed_api_keys_true_idx ON public.orgs USING btree (id) WHERE (enforce_hashed_api_keys = true);


--
-- Name: si_customer_cover_uidx; Type: INDEX; Schema: public; Owner: -
--

CREATE UNIQUE INDEX si_customer_cover_uidx ON public.stripe_info USING btree (customer_id) INCLUDE (status, trial_at, mau_exceeded, storage_exceeded, bandwidth_exceeded);


--
-- Name: si_customer_status_trial_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX si_customer_status_trial_idx ON public.stripe_info USING btree (customer_id, status, trial_at) INCLUDE (mau_exceeded, storage_exceeded, bandwidth_exceeded);


--
-- Name: stripe_info_paid_at_idx; Type: INDEX; Schema: public; Owner: -
--

CREATE INDEX stripe_info_paid_at_idx ON public.stripe_info USING btree (paid_at) WHERE (paid_at IS NOT NULL);


--
--



COMMIT;