--
-- PostgreSQL database dump
--

-- \restrict UmtWjVupPXEG8xu4MNItn9BufwfwMNLVelpizcRKVG9oupl8Ui3cSVHqhEZtw15

-- Dumped from database version 17.6
-- Dumped by pg_dump version 17.6

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
-- SET transaction_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: pg_cron; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "pg_cron" WITH SCHEMA "pg_catalog";


--
-- Name: EXTENSION "pg_cron"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "pg_cron" IS 'Job scheduler for PostgreSQL';


--
-- Name: pgsodium; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "pgsodium";


--
-- Name: EXTENSION "pgsodium"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "pgsodium" IS 'Pgsodium is a modern cryptography library for Postgres.';


--
-- Name: SCHEMA "public"; Type: COMMENT; Schema: -; Owner: pg_database_owner
--

COMMENT ON SCHEMA "public" IS 'standard public schema';


--
-- Name: moddatetime; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "moddatetime" WITH SCHEMA "extensions";


--
-- Name: EXTENSION "moddatetime"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "moddatetime" IS 'functions for tracking last modification time';


--
-- Name: pg_graphql; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "pg_graphql" WITH SCHEMA "graphql";


--
-- Name: EXTENSION "pg_graphql"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "pg_graphql" IS 'pg_graphql: GraphQL support';


--
-- Name: pg_stat_statements; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "pg_stat_statements" WITH SCHEMA "extensions";


--
-- Name: EXTENSION "pg_stat_statements"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "pg_stat_statements" IS 'track planning and execution statistics of all SQL statements executed';


--
-- Name: pg_trgm; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "pg_trgm" WITH SCHEMA "extensions";


--
-- Name: EXTENSION "pg_trgm"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "pg_trgm" IS 'text similarity measurement and index searching based on trigrams';


--
-- Name: pgcrypto; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "pgcrypto" WITH SCHEMA "extensions";


--
-- Name: EXTENSION "pgcrypto"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "pgcrypto" IS 'cryptographic functions';


--
-- Name: pgmq; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "pgmq";


--
-- Name: EXTENSION "pgmq"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "pgmq" IS 'A lightweight message queue. Like AWS SQS and RSMQ but on Postgres.';


--
-- Name: supabase_vault; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "supabase_vault" WITH SCHEMA "vault";


--
-- Name: EXTENSION "supabase_vault"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "supabase_vault" IS 'Supabase Vault Extension';


--
-- Name: uuid-ossp; Type: EXTENSION; Schema: -; Owner: -
--

CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA "extensions";


--
-- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner: 
--

-- COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)';


--
-- Name: feed_visibility; Type: TYPE; Schema: public; Owner: postgres
--

CREATE TYPE "public"."feed_visibility" AS ENUM (
    'public',
    'authenticated'
);


ALTER TYPE "public"."feed_visibility" OWNER TO "postgres";

--
-- Name: subscription_tier; Type: TYPE; Schema: public; Owner: postgres
--

CREATE TYPE "public"."subscription_tier" AS ENUM (
    'free',
    'pro',
    'developer'
);


ALTER TYPE "public"."subscription_tier" OWNER TO "postgres";

--
-- Name: add_feed_credentials("uuid", "text", "text"); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."add_feed_credentials"("p_subscription_id" "uuid", "p_auth_type" "text", "p_credential" "text") RETURNS "void"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  v_old_feed_id uuid;
  v_feed_url text;
  v_new_feed_id uuid;
  v_vault_secret_id uuid;
begin
  if p_auth_type not in ('bearer', 'basic', 'query_param') then
    raise exception 'Invalid authentication type: %. Must be bearer, basic, or query_param', p_auth_type;
  end if;

  select s.feed_id into v_old_feed_id
  from public.subscriptions s
  where s.id = p_subscription_id and s.user_id = auth.uid();

  if v_old_feed_id is null then
    raise exception 'Subscription not found';
  end if;

  select f.url into v_feed_url
  from public.feeds f
  where f.id = v_old_feed_id;

  insert into public.feeds (url, visibility, fetch_interval_seconds)
  values (v_feed_url, 'authenticated', 300)
  returning id into v_new_feed_id;

  v_vault_secret_id := vault.create_secret(
    jsonb_build_object(
      'authenticationType', p_auth_type,
      'authenticationValue', p_credential
    )::text,
    'feed_credential_' || v_new_feed_id::text,
    'Credential for authenticated feed'
  );

  update public.subscriptions
  set feed_id = v_new_feed_id, vault_secret_id = v_vault_secret_id
  where id = p_subscription_id;

  update public.feeds
  set subscriber_count = subscriber_count + 1
  where id = v_new_feed_id;

  update public.feeds
  set subscriber_count = greatest(subscriber_count - 1, 0)
  where id = v_old_feed_id;
end;
$$;


ALTER FUNCTION "public"."add_feed_credentials"("p_subscription_id" "uuid", "p_auth_type" "text", "p_credential" "text") OWNER TO "postgres";

--
-- Name: check_custom_feed_limit(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."check_custom_feed_limit"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  current_tier public.subscription_tier;
  current_count int;
  maximum_allowed int;
begin
  select tier, custom_feed_count into current_tier, current_count
  from public.user_profiles where id = new.user_id;

  maximum_allowed := case current_tier when 'free' then 1 when 'pro' then 1000 when 'developer' then 1000 else 1 end;

  if current_count >= maximum_allowed then
    raise exception 'You have reached the maximum number of custom feeds for your plan (% on % tier)', maximum_allowed, current_tier;
  end if;

  update public.user_profiles set custom_feed_count = custom_feed_count + 1 where id = new.user_id;

  return new;
end;
$$;


ALTER FUNCTION "public"."check_custom_feed_limit"() OWNER TO "postgres";

--
-- Name: check_folder_limit(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."check_folder_limit"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  current_tier public.subscription_tier;
  current_count int;
  maximum_allowed int;
begin
  select tier, folder_count into current_tier, current_count
  from public.user_profiles where id = new.user_id;

  maximum_allowed := case current_tier when 'free' then 3 when 'pro' then 10000 when 'developer' then 10000 else 3 end;

  if current_count >= maximum_allowed then
    raise exception 'You have reached the maximum number of folders for your plan (% on % tier)', maximum_allowed, current_tier;
  end if;

  update public.user_profiles set folder_count = folder_count + 1 where id = new.user_id;

  return new;
end;
$$;


ALTER FUNCTION "public"."check_folder_limit"() OWNER TO "postgres";

--
-- Name: check_highlight_limit(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."check_highlight_limit"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  current_tier public.subscription_tier;
  current_count int;
  maximum_allowed int;
begin
  select tier, highlight_count into current_tier, current_count
  from public.user_profiles where id = new.user_id;

  maximum_allowed := case current_tier when 'free' then 50 when 'pro' then 100000 when 'developer' then 100000 else 50 end;

  if current_count >= maximum_allowed then
    raise exception 'You have reached the maximum number of highlights for your plan (% on % tier)', maximum_allowed, current_tier;
  end if;

  update public.user_profiles set highlight_count = highlight_count + 1 where id = new.user_id;

  return new;
end;
$$;


ALTER FUNCTION "public"."check_highlight_limit"() OWNER TO "postgres";

--
-- Name: check_muted_keyword_limit(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."check_muted_keyword_limit"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  current_tier public.subscription_tier;
  current_count int;
  maximum_allowed int;
begin
  select tier, muted_keyword_count into current_tier, current_count
  from public.user_profiles where id = new.user_id;

  maximum_allowed := case current_tier when 'free' then 5 when 'pro' then 10000 when 'developer' then 10000 else 5 end;

  if current_count >= maximum_allowed then
    raise exception 'You have reached the maximum number of muted keywords for your plan (% on % tier)', maximum_allowed, current_tier;
  end if;

  update public.user_profiles set muted_keyword_count = muted_keyword_count + 1 where id = new.user_id;

  return new;
end;
$$;


ALTER FUNCTION "public"."check_muted_keyword_limit"() OWNER TO "postgres";

--
-- Name: check_rate_limit("text", integer, integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."check_rate_limit"("p_identifier" "text", "p_limit" integer, "p_window_seconds" integer) RETURNS "jsonb"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO 'public'
    AS $$
DECLARE
  v_window_start timestamptz;
  v_current_count integer;
BEGIN
  v_window_start := to_timestamp(
    floor(extract(epoch from now()) / p_window_seconds) * p_window_seconds
  );

  INSERT INTO public.rate_limits (identifier, window_start, request_count)
  VALUES (p_identifier, v_window_start, 1)
  ON CONFLICT (identifier, window_start)
  DO UPDATE SET request_count = rate_limits.request_count + 1
  RETURNING request_count INTO v_current_count;

  RETURN jsonb_build_object(
    'success', v_current_count <= p_limit,
    'remaining', greatest(p_limit - v_current_count, 0)
  );
END;
$$;


ALTER FUNCTION "public"."check_rate_limit"("p_identifier" "text", "p_limit" integer, "p_window_seconds" integer) OWNER TO "postgres";

--
-- Name: check_subscription_limit(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."check_subscription_limit"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  current_tier public.subscription_tier;
  current_count int;
  maximum_allowed int;
  feed_visibility public.feed_visibility;
begin
  select tier, feed_count into current_tier, current_count
  from public.user_profiles where id = new.user_id;

  maximum_allowed := case current_tier when 'free' then 10 when 'pro' then 200 when 'developer' then 500 else 10 end;

  if current_count >= maximum_allowed then
    raise exception 'You have reached the maximum number of feeds for your plan (% on % tier)', maximum_allowed, current_tier;
  end if;

  select visibility into feed_visibility from public.feeds where id = new.feed_id;

  if current_tier = 'free' and feed_visibility = 'authenticated' then
    raise exception 'Authenticated feeds require a Pro subscription';
  end if;

  update public.user_profiles set feed_count = feed_count + 1 where id = new.user_id;

  update public.feeds
  set subscriber_count = subscriber_count + 1
  where id = new.feed_id;

  return new;
end;
$$;


ALTER FUNCTION "public"."check_subscription_limit"() OWNER TO "postgres";

--
-- Name: cleanup_stale_entries(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."cleanup_stale_entries"() RETURNS integer
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO 'public'
    AS $$
DECLARE
  deleted_count integer;
BEGIN
  DELETE FROM public.entries
  WHERE published_at < NOW() - INTERVAL '90 days'
    AND id NOT IN (
      SELECT entry_id FROM public.user_entry_states WHERE saved = true OR read = true
    )
    AND feed_id NOT IN (
      SELECT id FROM public.feeds WHERE subscriber_count > 0
    );
  GET DIAGNOSTICS deleted_count = ROW_COUNT;
  RETURN deleted_count;
END;
$$;


ALTER FUNCTION "public"."cleanup_stale_entries"() OWNER TO "postgres";

--
-- Name: cleanup_stale_rate_limits(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."cleanup_stale_rate_limits"() RETURNS integer
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO 'public'
    AS $$
DECLARE
  deleted_count integer;
BEGIN
  DELETE FROM public.rate_limits
  WHERE window_start < now() - interval '1 hour'
  RETURNING 1;

  GET DIAGNOSTICS deleted_count = ROW_COUNT;
  RETURN deleted_count;
END;
$$;


ALTER FUNCTION "public"."cleanup_stale_rate_limits"() OWNER TO "postgres";

--
-- Name: decrement_custom_feed_count(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."decrement_custom_feed_count"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
begin
  update public.user_profiles
  set custom_feed_count = greatest(custom_feed_count - 1, 0)
  where id = old.user_id;

  return old;
end;
$$;


ALTER FUNCTION "public"."decrement_custom_feed_count"() OWNER TO "postgres";

--
-- Name: decrement_folder_count(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."decrement_folder_count"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
begin
  update public.user_profiles
  set folder_count = greatest(folder_count - 1, 0)
  where id = old.user_id;

  return old;
end;
$$;


ALTER FUNCTION "public"."decrement_folder_count"() OWNER TO "postgres";

--
-- Name: decrement_highlight_count(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."decrement_highlight_count"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
begin
  update public.user_profiles
  set highlight_count = greatest(highlight_count - 1, 0)
  where id = old.user_id;

  return old;
end;
$$;


ALTER FUNCTION "public"."decrement_highlight_count"() OWNER TO "postgres";

--
-- Name: decrement_muted_keyword_count(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."decrement_muted_keyword_count"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
begin
  update public.user_profiles
  set muted_keyword_count = greatest(muted_keyword_count - 1, 0)
  where id = old.user_id;

  return old;
end;
$$;


ALTER FUNCTION "public"."decrement_muted_keyword_count"() OWNER TO "postgres";

--
-- Name: decrement_subscription_count(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."decrement_subscription_count"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  feed_vis public.feed_visibility;
begin
  update public.user_profiles
  set feed_count = greatest(feed_count - 1, 0)
  where id = old.user_id;

  update public.feeds
  set subscriber_count = greatest(subscriber_count - 1, 0)
  where id = old.feed_id;

  select visibility into feed_vis from public.feeds where id = old.feed_id;

  if feed_vis = 'authenticated' then
    delete from public.entries where feed_id = old.feed_id and owner_id = old.user_id;
    if old.vault_secret_id is not null then
      delete from vault.secrets where id = old.vault_secret_id;
    end if;
    delete from public.feeds where id = old.feed_id;
  end if;

  return old;
end;
$$;


ALTER FUNCTION "public"."decrement_subscription_count"() OWNER TO "postgres";

--
-- Name: enqueue_feed_refresh_on_subscribe(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."enqueue_feed_refresh_on_subscribe"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
BEGIN
  PERFORM pgmq.send('feed_refresh', jsonb_build_object('feed_id', NEW.feed_id));
  RETURN NEW;
END;
$$;


ALTER FUNCTION "public"."enqueue_feed_refresh_on_subscribe"() OWNER TO "postgres";

--
-- Name: get_custom_feed("uuid", integer, timestamp with time zone); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."get_custom_feed"("target_custom_feed_id" "uuid", "result_limit" integer DEFAULT 50, "pagination_cursor" timestamp with time zone DEFAULT NULL::timestamp with time zone) RETURNS TABLE("entry_id" "uuid", "feed_id" "uuid", "feed_title" "text", "entry_title" "text", "entry_url" "text", "author" "text", "summary" "text", "published_at" timestamp with time zone, "is_read" boolean, "is_saved" boolean)
    LANGUAGE "sql" STABLE SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
  select
    e.id, e.feed_id, f.title, e.title, e.url, e.author, e.summary,
    e.published_at,
    coalesce(ues.read, false),
    coalesce(ues.saved, false)
  from public.entries e
  inner join public.subscriptions s
    on s.feed_id = e.feed_id and s.user_id = auth.uid()
  inner join public.feeds f on f.id = e.feed_id
  inner join public.custom_feeds cf on cf.id = target_custom_feed_id and cf.user_id = auth.uid()
  left join public.user_entry_states ues
    on ues.entry_id = e.id and ues.user_id = auth.uid()
  where
    (e.owner_id is null or e.owner_id = auth.uid())
    and (pagination_cursor is null or e.published_at < pagination_cursor)
    and (
      e.title ilike '%' || cf.query || '%'
      or e.summary ilike '%' || cf.query || '%'
      or e.content_text ilike '%' || cf.query || '%'
    )
  order by e.published_at desc nulls last
  limit result_limit;
$$;


ALTER FUNCTION "public"."get_custom_feed"("target_custom_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone) OWNER TO "postgres";

--
-- Name: get_custom_feed_timeline("uuid", integer, timestamp with time zone); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."get_custom_feed_timeline"("p_custom_feed_id" "uuid", "p_result_limit" integer DEFAULT 50, "p_pagination_cursor" timestamp with time zone DEFAULT NULL::timestamp with time zone) RETURNS TABLE("entry_id" "uuid", "feed_id" "uuid", "feed_title" "text", "custom_title" "text", "entry_title" "text", "entry_url" "text", "author" "text", "summary" "text", "image_url" "text", "published_at" timestamp with time zone, "is_read" boolean, "is_saved" boolean, "enclosure_url" "text", "enclosure_type" "text")
    LANGUAGE "plpgsql" STABLE SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
DECLARE
  v_query TEXT;
  v_match_mode TEXT;
  v_source_folder_id UUID;
  v_keywords TEXT[];
  v_user_id UUID := auth.uid();
  v_user_tier public.subscription_tier;
BEGIN
  SELECT cf.query, cf.match_mode, cf.source_folder_id
  INTO v_query, v_match_mode, v_source_folder_id
  FROM public.custom_feeds cf
  WHERE cf.id = p_custom_feed_id AND cf.user_id = v_user_id;

  IF NOT FOUND THEN
    RETURN;
  END IF;

  SELECT tier INTO v_user_tier FROM public.user_profiles WHERE id = v_user_id;

  v_keywords := string_to_array(lower(v_query), ' ');

  RETURN QUERY
  SELECT
    e.id AS entry_id,
    e.feed_id,
    f.title AS feed_title,
    s.custom_title,
    e.title AS entry_title,
    e.url AS entry_url,
    e.author,
    e.summary,
    e.image_url,
    e.published_at,
    COALESCE(ues.read, false) AS is_read,
    COALESCE(ues.saved, false) AS is_saved,
    e.enclosure_url,
    e.enclosure_type
  FROM public.entries e
  INNER JOIN public.subscriptions s
    ON s.feed_id = e.feed_id AND s.user_id = v_user_id
  INNER JOIN public.feeds f ON f.id = e.feed_id
  LEFT JOIN public.user_entry_states ues
    ON ues.entry_id = e.id AND ues.user_id = v_user_id
  WHERE
    (e.owner_id IS NULL OR e.owner_id = v_user_id)
    AND (v_source_folder_id IS NULL OR s.folder_id = v_source_folder_id)
    AND (p_pagination_cursor IS NULL OR e.published_at < p_pagination_cursor)
    AND (
      CASE WHEN v_match_mode = 'and' THEN
        (SELECT bool_and(
          lower(COALESCE(e.title, '') || ' ' || COALESCE(e.summary, ''))
            LIKE '%' || replace(replace(replace(kw, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\'
        ) FROM unnest(v_keywords) AS kw)
      ELSE
        (SELECT bool_or(
          lower(COALESCE(e.title, '') || ' ' || COALESCE(e.summary, ''))
            LIKE '%' || replace(replace(replace(kw, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\'
        ) FROM unnest(v_keywords) AS kw)
      END
    )
    AND NOT EXISTS (
      SELECT 1 FROM public.muted_keywords mk
      WHERE mk.user_id = v_user_id
      AND (
        e.title ILIKE '%' || replace(replace(replace(mk.keyword, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\'
        OR e.summary ILIKE '%' || replace(replace(replace(mk.keyword, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\'
      )
    )
    AND (
      v_user_tier IN ('pro', 'developer')
      OR e.published_at >= now() - interval '14 days'
    )
  ORDER BY e.published_at DESC NULLS LAST
  LIMIT p_result_limit;
END;
$$;


ALTER FUNCTION "public"."get_custom_feed_timeline"("p_custom_feed_id" "uuid", "p_result_limit" integer, "p_pagination_cursor" timestamp with time zone) OWNER TO "postgres";

--
-- Name: get_timeline("uuid", "uuid", integer, timestamp with time zone, boolean, boolean, boolean); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."get_timeline"("target_folder_id" "uuid" DEFAULT NULL::"uuid", "target_feed_id" "uuid" DEFAULT NULL::"uuid", "result_limit" integer DEFAULT 50, "pagination_cursor" timestamp with time zone DEFAULT NULL::timestamp with time zone, "unread_only" boolean DEFAULT false, "prioritise_unread" boolean DEFAULT false, "cursor_is_read" boolean DEFAULT NULL) RETURNS TABLE("entry_id" "uuid", "feed_id" "uuid", "feed_title" "text", "custom_title" "text", "entry_title" "text", "entry_url" "text", "author" "text", "summary" "text", "image_url" "text", "published_at" timestamp with time zone, "is_read" boolean, "is_saved" boolean, "enclosure_url" "text", "enclosure_type" "text")
    LANGUAGE "sql" STABLE SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
  SELECT
    e.id AS entry_id,
    e.feed_id,
    f.title AS feed_title,
    s.custom_title,
    e.title AS entry_title,
    e.url AS entry_url,
    e.author,
    e.summary,
    e.image_url,
    e.published_at,
    COALESCE(ues.read, false) AS is_read,
    COALESCE(ues.saved, false) AS is_saved,
    e.enclosure_url,
    e.enclosure_type
  FROM public.entries e
  INNER JOIN public.subscriptions s
    ON s.feed_id = e.feed_id AND s.user_id = auth.uid()
  INNER JOIN public.feeds f ON f.id = e.feed_id
  LEFT JOIN public.user_entry_states ues
    ON ues.entry_id = e.id AND ues.user_id = auth.uid()
  WHERE
    (e.owner_id IS NULL OR e.owner_id = auth.uid())
    AND (target_folder_id IS NULL OR s.folder_id = target_folder_id)
    AND (target_feed_id IS NULL OR e.feed_id = target_feed_id)
    AND (target_feed_id IS NOT NULL OR s.hidden_from_timeline = false)
    AND (NOT unread_only OR COALESCE(ues.read, false) = false)
    AND NOT EXISTS (
      SELECT 1 FROM public.muted_keywords mk
      WHERE mk.user_id = auth.uid()
      AND (
        e.title ILIKE '%' || mk.keyword || '%'
        OR e.summary ILIKE '%' || mk.keyword || '%'
      )
    )
    AND (
      (SELECT tier FROM public.user_profiles WHERE id = auth.uid()) IN ('pro', 'developer')
      OR e.published_at >= now() - interval '14 days'
    )
    AND (
      NOT prioritise_unread
      OR pagination_cursor IS NULL
      OR (
        cursor_is_read = false AND COALESCE(ues.read, false) = false AND e.published_at < pagination_cursor
      )
      OR (
        cursor_is_read = true AND COALESCE(ues.read, false) = true AND e.published_at < pagination_cursor
      )
      OR (
        cursor_is_read = false AND COALESCE(ues.read, false) = true
      )
    )
    AND (
      prioritise_unread
      OR pagination_cursor IS NULL
      OR e.published_at < pagination_cursor
    )
  ORDER BY
    CASE WHEN prioritise_unread THEN COALESCE(ues.read, false)::int ELSE 0 END ASC,
    e.published_at DESC NULLS LAST
  LIMIT result_limit;
$$;


ALTER FUNCTION "public"."get_timeline"("target_folder_id" "uuid", "target_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone, "unread_only" boolean, "prioritise_unread" boolean, "cursor_is_read" boolean) OWNER TO "postgres";

--
-- Name: get_unread_counts(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."get_unread_counts"() RETURNS TABLE("feed_id" "uuid", "unread_count" bigint)
    LANGUAGE "sql" STABLE SECURITY DEFINER
    SET "search_path" TO 'public'
    AS $$
  SELECT e.feed_id, COUNT(*) AS unread_count
  FROM entries e
  INNER JOIN subscriptions s ON s.feed_id = e.feed_id AND s.user_id = auth.uid()
  WHERE NOT EXISTS (
    SELECT 1 FROM user_entry_states ues
    WHERE ues.entry_id = e.id
      AND ues.user_id = auth.uid()
      AND ues.read = true
  )
  AND (e.owner_id IS NULL OR e.owner_id = auth.uid())
  AND (
    (SELECT tier FROM user_profiles WHERE id = auth.uid()) IN ('pro', 'developer')
    OR e.published_at >= now() - interval '14 days'
  )
  GROUP BY e.feed_id;
$$;


ALTER FUNCTION "public"."get_unread_counts"() OWNER TO "postgres";

--
-- Name: handle_new_user(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."handle_new_user"() RETURNS "trigger"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
begin
  insert into public.user_profiles (id)
  values (new.id);

  return new;
end;
$$;


ALTER FUNCTION "public"."handle_new_user"() OWNER TO "postgres";

--
-- Name: mark_all_as_read("uuid", "uuid", boolean, "uuid"[]); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."mark_all_as_read"("p_feed_id" "uuid" DEFAULT NULL::"uuid", "p_folder_id" "uuid" DEFAULT NULL::"uuid", "p_read_state" boolean DEFAULT true, "p_entry_ids" "uuid"[] DEFAULT NULL::"uuid"[]) RETURNS "uuid"[]
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO 'public'
    AS $$
DECLARE
  affected_ids uuid[];
BEGIN
  IF p_read_state THEN
    WITH affected AS (
      INSERT INTO user_entry_states (user_id, entry_id, read, saved)
      SELECT auth.uid(), e.id, true, false
      FROM entries e
      INNER JOIN subscriptions s ON s.feed_id = e.feed_id AND s.user_id = auth.uid()
      LEFT JOIN user_entry_states ues ON ues.entry_id = e.id AND ues.user_id = auth.uid()
      WHERE (ues.read IS NULL OR ues.read = false)
        AND (p_entry_ids IS NULL OR e.id = ANY(p_entry_ids))
        AND (p_feed_id IS NULL OR e.feed_id = p_feed_id)
        AND (p_folder_id IS NULL OR s.folder_id = p_folder_id)
      ON CONFLICT (user_id, entry_id)
      DO UPDATE SET read = true
      RETURNING entry_id
    )
    SELECT array_agg(entry_id) INTO affected_ids FROM affected;
  ELSE
    WITH affected AS (
      UPDATE user_entry_states
      SET read = false
      WHERE user_id = auth.uid()
        AND read = true
        AND (p_entry_ids IS NULL OR entry_id = ANY(p_entry_ids))
        AND entry_id IN (
          SELECT e.id
          FROM entries e
          INNER JOIN subscriptions s ON s.feed_id = e.feed_id AND s.user_id = auth.uid()
          WHERE (p_feed_id IS NULL OR e.feed_id = p_feed_id)
            AND (p_folder_id IS NULL OR s.folder_id = p_folder_id)
        )
      RETURNING entry_id
    )
    SELECT array_agg(entry_id) INTO affected_ids FROM affected;
  END IF;

  RETURN COALESCE(affected_ids, ARRAY[]::uuid[]);
END;
$$;


ALTER FUNCTION "public"."mark_all_as_read"("p_feed_id" "uuid", "p_folder_id" "uuid", "p_read_state" boolean, "p_entry_ids" "uuid"[]) OWNER TO "postgres";

--
-- Name: prevent_billing_column_modification(); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."prevent_billing_column_modification"() RETURNS "trigger"
    LANGUAGE "plpgsql"
    SET "search_path" TO 'public'
    AS $$
BEGIN
  IF coalesce(auth.role(), '') != 'service_role' THEN
    IF NEW.tier IS DISTINCT FROM OLD.tier
      OR NEW.stripe_customer_identifier IS DISTINCT FROM OLD.stripe_customer_identifier
      OR NEW.stripe_subscription_identifier IS DISTINCT FROM OLD.stripe_subscription_identifier
      OR NEW.stripe_subscription_status IS DISTINCT FROM OLD.stripe_subscription_status
      OR NEW.stripe_current_period_end IS DISTINCT FROM OLD.stripe_current_period_end
    THEN
      RAISE EXCEPTION 'Billing columns cannot be modified directly';
    END IF;
  END IF;
  RETURN NEW;
END;
$$;


ALTER FUNCTION "public"."prevent_billing_column_modification"() OWNER TO "postgres";

--
-- Name: request_feed_refresh("uuid"); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."request_feed_refresh"("target_subscription_id" "uuid") RETURNS "void"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  resolved_feed_id uuid;
  resolved_tier public.subscription_tier;
begin
  select s.feed_id into resolved_feed_id
  from public.subscriptions s
  where s.id = target_subscription_id and s.user_id = auth.uid();

  if resolved_feed_id is null then
    raise exception 'Subscription not found';
  end if;

  select tier into resolved_tier from public.user_profiles where id = auth.uid();

  if resolved_tier = 'free' then
    raise exception 'Manual feed refresh requires a Pro subscription';
  end if;

  perform pgmq.send(
    'feed_refresh',
    jsonb_build_object(
      'feed_id', resolved_feed_id,
      'user_id', auth.uid(),
      'requested_at', now()
    )
  );
end;
$$;


ALTER FUNCTION "public"."request_feed_refresh"("target_subscription_id" "uuid") OWNER TO "postgres";

--
-- Name: search_entries("text", integer); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."search_entries"("p_query" "text", "p_result_limit" integer DEFAULT 30) RETURNS TABLE("entry_id" "uuid", "feed_id" "uuid", "feed_title" "text", "custom_title" "text", "entry_title" "text", "entry_url" "text", "author" "text", "summary" "text", "image_url" "text", "published_at" timestamp with time zone, "is_read" boolean, "is_saved" boolean)
    LANGUAGE "plpgsql" STABLE SECURITY DEFINER
    SET "search_path" TO 'public', 'extensions'
    AS $$
BEGIN
  SET LOCAL pg_trgm.similarity_threshold = 0.1;

  RETURN QUERY
  SELECT
    e.id AS entry_id,
    e.feed_id,
    COALESCE(f.title, '') AS feed_title,
    s.custom_title,
    COALESCE(e.title, '') AS entry_title,
    COALESCE(e.url, '') AS entry_url,
    e.author,
    e.summary,
    e.image_url,
    e.published_at,
    COALESCE(ues.read, false) AS is_read,
    COALESCE(ues.saved, false) AS is_saved
  FROM public.entries e
  INNER JOIN public.subscriptions s ON s.feed_id = e.feed_id AND s.user_id = auth.uid()
  INNER JOIN public.feeds f ON f.id = e.feed_id
  LEFT JOIN public.user_entry_states ues ON ues.entry_id = e.id AND ues.user_id = auth.uid()
  WHERE (
    COALESCE(e.title, '') % p_query
    OR COALESCE(e.summary, '') % p_query
    OR e.author ILIKE '%' || replace(replace(replace(p_query, '\', '\\'), '%', '\%'), '_', '\_') || '%' ESCAPE '\'
  )
  AND s.hidden_from_timeline = false
  AND (e.owner_id IS NULL OR e.owner_id = auth.uid())
  AND (
    (SELECT tier FROM public.user_profiles WHERE id = auth.uid()) IN ('pro', 'developer')
    OR e.published_at >= now() - interval '14 days'
  )
  ORDER BY
    greatest(
      similarity(COALESCE(e.title, ''), p_query),
      similarity(COALESCE(e.summary, ''), p_query)
    ) DESC,
    e.published_at DESC
  LIMIT p_result_limit;
END;
$$;


ALTER FUNCTION "public"."search_entries"("p_query" "text", "p_result_limit" integer) OWNER TO "postgres";

--
-- Name: reorder_items("text", "uuid"[], integer[]); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."reorder_items"("target_table" "text", "item_ids" "uuid"[], "new_positions" integer[])
RETURNS void
LANGUAGE "plpgsql" SECURITY DEFINER
SET "search_path" TO ''
AS $$
DECLARE
  current_user_id uuid := auth.uid();
  i integer;
BEGIN
  IF current_user_id IS NULL THEN
    RAISE EXCEPTION 'Not authenticated';
  END IF;

  IF array_length(item_ids, 1) IS DISTINCT FROM array_length(new_positions, 1) THEN
    RAISE EXCEPTION 'item_ids and new_positions must have the same length';
  END IF;

  IF target_table NOT IN ('subscriptions', 'folders', 'custom_feeds') THEN
    RAISE EXCEPTION 'Invalid table: %', target_table;
  END IF;

  FOR i IN 1..array_length(item_ids, 1) LOOP
    IF target_table = 'subscriptions' THEN
      UPDATE public.subscriptions
      SET position = new_positions[i]
      WHERE id = item_ids[i] AND user_id = current_user_id;
    ELSIF target_table = 'folders' THEN
      UPDATE public.folders
      SET position = new_positions[i]
      WHERE id = item_ids[i] AND user_id = current_user_id;
    ELSIF target_table = 'custom_feeds' THEN
      UPDATE public.custom_feeds
      SET position = new_positions[i]
      WHERE id = item_ids[i] AND user_id = current_user_id;
    END IF;
  END LOOP;
END;
$$;

ALTER FUNCTION "public"."reorder_items"("target_table" "text", "item_ids" "uuid"[], "new_positions" integer[]) OWNER TO "postgres";

--
-- Name: subscribe_to_feed("text", "uuid", "text", "text", "text"); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."subscribe_to_feed"("feed_url" "text", "target_folder_id" "uuid" DEFAULT NULL::"uuid", "feed_custom_title" "text" DEFAULT NULL::"text", "feed_credential" "text" DEFAULT NULL::"text", "feed_auth_type" "text" DEFAULT 'bearer'::"text") RETURNS "uuid"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  resolved_feed_id uuid;
  new_subscription_id uuid;
  resolved_vault_id uuid;
  resolved_visibility public.feed_visibility;
  existing_subscription_id uuid;
begin
  if feed_credential is not null and feed_auth_type not in ('bearer', 'basic', 'query_param') then
    raise exception 'Invalid authentication type: %. Must be bearer, basic, or query_param', feed_auth_type;
  end if;

  if feed_credential is not null then
    resolved_visibility := 'authenticated';
  else
    resolved_visibility := 'public';
  end if;

  if resolved_visibility = 'public' then
    select id into resolved_feed_id
    from public.feeds
    where url = feed_url and visibility = 'public';

    if resolved_feed_id is null then
      insert into public.feeds (url, visibility)
      values (feed_url, 'public')
      returning id into resolved_feed_id;
    end if;

    select id into existing_subscription_id
    from public.subscriptions
    where user_id = auth.uid() and feed_id = resolved_feed_id;

    if existing_subscription_id is not null then
      raise exception 'You are already subscribed to this feed';
    end if;
  else
    insert into public.feeds (url, visibility, fetch_interval_seconds)
    values (feed_url, 'authenticated', 300)
    returning id into resolved_feed_id;

    resolved_vault_id := vault.create_secret(
      jsonb_build_object(
        'authenticationType', feed_auth_type,
        'authenticationValue', feed_credential
      )::text,
      'feed_credential_' || resolved_feed_id::text,
      'Credential for authenticated feed'
    );
  end if;

  insert into public.subscriptions (user_id, feed_id, folder_id, custom_title, vault_secret_id)
  values (auth.uid(), resolved_feed_id, target_folder_id, feed_custom_title, resolved_vault_id)
  returning id into new_subscription_id;

  return new_subscription_id;
end;
$$;


ALTER FUNCTION "public"."subscribe_to_feed"("feed_url" "text", "target_folder_id" "uuid", "feed_custom_title" "text", "feed_credential" "text", "feed_auth_type" "text") OWNER TO "postgres";

--
-- Name: update_feed_credentials("uuid", "text", "text"); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."update_feed_credentials"("p_feed_id" "uuid", "p_auth_type" "text", "p_credential" "text") RETURNS "void"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
declare
  v_vault_secret_id uuid;
begin
  if p_auth_type not in ('bearer', 'basic', 'query_param') then
    raise exception 'Invalid authentication type: %. Must be bearer, basic, or query_param', p_auth_type;
  end if;

  select s.vault_secret_id into v_vault_secret_id
  from public.subscriptions s
  where s.feed_id = p_feed_id and s.user_id = auth.uid();

  if v_vault_secret_id is null then
    raise exception 'No authenticated subscription found for this feed';
  end if;

  perform vault.update_secret(
    v_vault_secret_id,
    jsonb_build_object(
      'authenticationType', p_auth_type,
      'authenticationValue', p_credential
    )::text
  );
end;
$$;


ALTER FUNCTION "public"."update_feed_credentials"("p_feed_id" "uuid", "p_auth_type" "text", "p_credential" "text") OWNER TO "postgres";

--
-- Name: update_feed_url("uuid", "text"); Type: FUNCTION; Schema: public; Owner: postgres
--

CREATE OR REPLACE FUNCTION "public"."update_feed_url"("target_feed_id" "uuid", "new_url" "text") RETURNS "void"
    LANGUAGE "plpgsql" SECURITY DEFINER
    SET "search_path" TO ''
    AS $$
BEGIN
  IF NOT EXISTS (
    SELECT 1 FROM public.subscriptions
    WHERE feed_id = target_feed_id
    AND user_id = auth.uid()
  ) THEN
    RAISE EXCEPTION 'not subscribed to this feed';
  END IF;

  UPDATE public.feeds SET url = new_url WHERE id = target_feed_id;
END;
$$;


ALTER FUNCTION "public"."update_feed_url"("target_feed_id" "uuid", "new_url" "text") OWNER TO "postgres";

SET default_tablespace = '';

SET default_table_access_method = "heap";

--
-- Name: api_keys; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."api_keys" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "user_id" "uuid" NOT NULL,
    "key_hash" "text" NOT NULL,
    "key_prefix" character(8) NOT NULL,
    "label" "text",
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "last_used_at" timestamp with time zone,
    "revoked_at" timestamp with time zone
);


ALTER TABLE "public"."api_keys" OWNER TO "postgres";

--
-- Name: custom_feeds; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."custom_feeds" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "user_id" "uuid" NOT NULL,
    "name" "text" NOT NULL,
    "query" "text" NOT NULL,
    "position" integer DEFAULT 0 NOT NULL,
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "updated_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "source_folder_id" "uuid",
    "match_mode" "text" DEFAULT 'or'::"text" NOT NULL,
    "icon_url" "text",
    CONSTRAINT "custom_feeds_match_mode_check" CHECK (("match_mode" = ANY (ARRAY['and'::"text", 'or'::"text"])))
);


ALTER TABLE "public"."custom_feeds" OWNER TO "postgres";

--
-- Name: entries; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."entries" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "feed_id" "uuid" NOT NULL,
    "owner_id" "uuid",
    "guid" "text" NOT NULL,
    "url" "text",
    "title" "text",
    "author" "text",
    "summary" "text",
    "content_html" "text",
    "content_text" "text",
    "image_url" "text",
    "published_at" timestamp with time zone,
    "word_count" integer,
    "fetched_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "enclosure_url" "text",
    "enclosure_type" "text",
    "enclosure_length" bigint
);


ALTER TABLE "public"."entries" OWNER TO "postgres";

--
-- Name: feeds; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."feeds" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "url" "text" NOT NULL,
    "site_url" "text",
    "title" "text",
    "description" "text",
    "language" "text",
    "feed_type" "text",
    "image_url" "text",
    "visibility" "public"."feed_visibility" DEFAULT 'public'::"public"."feed_visibility" NOT NULL,
    "etag" "text",
    "last_modified" "text",
    "last_fetched_at" timestamp with time zone,
    "last_fetch_error" "text",
    "last_fetch_error_at" timestamp with time zone,
    "consecutive_failures" integer DEFAULT 0 NOT NULL,
    "next_fetch_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "fetch_interval_seconds" integer DEFAULT 1800 NOT NULL,
    "subscriber_count" integer DEFAULT 0 NOT NULL,
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "updated_at" timestamp with time zone DEFAULT "now"() NOT NULL
);


ALTER TABLE "public"."feeds" OWNER TO "postgres";

--
-- Name: folders; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."folders" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "user_id" "uuid" NOT NULL,
    "name" "text" NOT NULL,
    "position" integer DEFAULT 0 NOT NULL,
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "updated_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "icon_url" "text"
);


ALTER TABLE "public"."folders" OWNER TO "postgres";

--
-- Name: muted_keywords; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."muted_keywords" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "user_id" "uuid" NOT NULL,
    "keyword" "text" NOT NULL,
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL
);


ALTER TABLE "public"."muted_keywords" OWNER TO "postgres";

--
-- Name: rate_limits; Type: TABLE; Schema: public; Owner: postgres
--

CREATE UNLOGGED TABLE "public"."rate_limits" (
    "identifier" "text" NOT NULL,
    "window_start" timestamp with time zone NOT NULL,
    "request_count" integer DEFAULT 1 NOT NULL
);


ALTER TABLE "public"."rate_limits" OWNER TO "postgres";

--
-- Name: shared_entries; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."shared_entries" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "user_id" "uuid" NOT NULL,
    "entry_id" "uuid" NOT NULL,
    "share_token" "text" NOT NULL,
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "expires_at" timestamp with time zone,
    "note" "text",
    "highlight_text" "text",
    "highlighted_text" "text",
    "highlight_text_offset" integer,
    "highlight_text_length" integer,
    "highlight_text_prefix" "text" DEFAULT ''::"text",
    "highlight_text_suffix" "text" DEFAULT ''::"text",
    "note_is_public" boolean DEFAULT false NOT NULL,
    "view_count" integer DEFAULT 0 NOT NULL,
    "last_viewed_at" timestamp with time zone,
    "expiry_interval_days" integer DEFAULT 7 NOT NULL
);


ALTER TABLE "public"."shared_entries" OWNER TO "postgres";

--
-- Name: subscriptions; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."subscriptions" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "user_id" "uuid" NOT NULL,
    "feed_id" "uuid" NOT NULL,
    "folder_id" "uuid",
    "custom_title" "text",
    "position" integer DEFAULT 0 NOT NULL,
    "vault_secret_id" "uuid",
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "updated_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "hidden_from_timeline" boolean DEFAULT false NOT NULL
);


ALTER TABLE "public"."subscriptions" OWNER TO "postgres";

--
-- Name: user_entry_states; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."user_entry_states" (
    "user_id" "uuid" NOT NULL,
    "entry_id" "uuid" NOT NULL,
    "read" boolean DEFAULT false NOT NULL,
    "saved" boolean DEFAULT false NOT NULL,
    "read_at" timestamp with time zone,
    "saved_at" timestamp with time zone
);


ALTER TABLE "public"."user_entry_states" OWNER TO "postgres";

--
-- Name: user_highlights; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."user_highlights" (
    "id" "uuid" DEFAULT "gen_random_uuid"() NOT NULL,
    "user_id" "uuid" NOT NULL,
    "entry_id" "uuid" NOT NULL,
    "highlighted_text" "text" NOT NULL,
    "note" "text",
    "text_offset" integer NOT NULL,
    "text_length" integer NOT NULL,
    "text_prefix" "text" DEFAULT ''::"text" NOT NULL,
    "text_suffix" "text" DEFAULT ''::"text" NOT NULL,
    "color" "text" DEFAULT 'yellow'::"text" NOT NULL,
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL
);


ALTER TABLE "public"."user_highlights" OWNER TO "postgres";

--
-- Name: user_profiles; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE IF NOT EXISTS "public"."user_profiles" (
    "id" "uuid" NOT NULL,
    "tier" "public"."subscription_tier" DEFAULT 'free'::"public"."subscription_tier" NOT NULL,
    "feed_count" integer DEFAULT 0 NOT NULL,
    "folder_count" integer DEFAULT 0 NOT NULL,
    "muted_keyword_count" integer DEFAULT 0 NOT NULL,
    "custom_feed_count" integer DEFAULT 0 NOT NULL,
    "created_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "updated_at" timestamp with time zone DEFAULT "now"() NOT NULL,
    "stripe_customer_identifier" "text",
    "stripe_subscription_identifier" "text",
    "stripe_subscription_status" "text",
    "stripe_current_period_end" timestamp with time zone,
    "highlight_count" integer DEFAULT 0 NOT NULL,
    "webhook_url" "text",
    "webhook_secret" "text",
    "webhook_enabled" boolean DEFAULT false NOT NULL,
    "webhook_consecutive_failures" integer DEFAULT 0 NOT NULL
);


ALTER TABLE "public"."user_profiles" OWNER TO "postgres";

--
-- Name: api_keys [REDACTED] Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."api_keys"
    ADD CONSTRAINT "[REDACTED] UNIQUE ("key_hash");


--
-- Name: api_keys api_keys_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."api_keys"
    ADD CONSTRAINT "api_keys_pkey" PRIMARY KEY ("id");


--
-- Name: custom_feeds custom_feeds_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."custom_feeds"
    ADD CONSTRAINT "custom_feeds_pkey" PRIMARY KEY ("id");


--
-- Name: entries entries_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."entries"
    ADD CONSTRAINT "entries_pkey" PRIMARY KEY ("id");


--
-- Name: feeds feeds_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."feeds"
    ADD CONSTRAINT "feeds_pkey" PRIMARY KEY ("id");


--
-- Name: folders folders_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."folders"
    ADD CONSTRAINT "folders_pkey" PRIMARY KEY ("id");


--
-- Name: folders folders_user_id_name_key; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."folders"
    ADD CONSTRAINT "folders_user_id_name_key" UNIQUE ("user_id", "name");


--
-- Name: muted_keywords muted_keywords_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."muted_keywords"
    ADD CONSTRAINT "muted_keywords_pkey" PRIMARY KEY ("id");


--
-- Name: rate_limits rate_limits_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."rate_limits"
    ADD CONSTRAINT "rate_limits_pkey" PRIMARY KEY ("identifier", "window_start");


--
-- Name: shared_entries shared_entries_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."shared_entries"
    ADD CONSTRAINT "shared_entries_pkey" PRIMARY KEY ("id");


--
-- Name: shared_entries shared_entries_share_token_key; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."shared_entries"
    ADD CONSTRAINT "shared_entries_share_token_key" UNIQUE ("share_token");


--
-- Name: shared_entries shared_entries_user_id_entry_id_key; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."shared_entries"
    ADD CONSTRAINT "shared_entries_user_id_entry_id_key" UNIQUE ("user_id", "entry_id");


--
-- Name: subscriptions subscriptions_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."subscriptions"
    ADD CONSTRAINT "subscriptions_pkey" PRIMARY KEY ("id");


--
-- Name: subscriptions subscriptions_user_id_feed_id_key; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."subscriptions"
    ADD CONSTRAINT "subscriptions_user_id_feed_id_key" UNIQUE ("user_id", "feed_id");


--
-- Name: user_entry_states user_entry_states_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_entry_states"
    ADD CONSTRAINT "user_entry_states_pkey" PRIMARY KEY ("user_id", "entry_id");


--
-- Name: user_highlights user_highlights_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_highlights"
    ADD CONSTRAINT "user_highlights_pkey" PRIMARY KEY ("id");


--
-- Name: user_profiles user_profiles_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_profiles"
    ADD CONSTRAINT "user_profiles_pkey" PRIMARY KEY ("id");


--
-- Name: user_profiles user_profiles_stripe_customer_identifier_key; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_profiles"
    ADD CONSTRAINT "user_profiles_stripe_customer_identifier_key" UNIQUE ("stripe_customer_identifier");


--
-- Name: idx_api_keys_key_hash; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_api_keys_key_hash" ON "public"."api_keys" USING "btree" ("key_hash") WHERE ("revoked_at" IS NULL);


--
-- Name: idx_api_keys_user_id; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_api_keys_user_id" ON "public"."api_keys" USING "btree" ("user_id");


--
-- Name: idx_custom_feeds_source_folder; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_custom_feeds_source_folder" ON "public"."custom_feeds" USING "btree" ("source_folder_id");


--
-- Name: idx_custom_feeds_user; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_custom_feeds_user" ON "public"."custom_feeds" USING "btree" ("user_id");


--
-- Name: idx_entries_content_trigram; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_entries_content_trigram" ON "public"."entries" USING "gin" ("content_text" "extensions"."gin_trgm_ops");


--
-- Name: idx_entries_dedup_authenticated; Type: INDEX; Schema: public; Owner: postgres
--

CREATE UNIQUE INDEX "idx_entries_dedup_authenticated" ON "public"."entries" USING "btree" ("feed_id", "owner_id", "guid") WHERE ("owner_id" IS NOT NULL);


--
-- Name: idx_entries_dedup_public; Type: INDEX; Schema: public; Owner: postgres
--

CREATE UNIQUE INDEX "idx_entries_dedup_public" ON "public"."entries" USING "btree" ("feed_id", "guid") WHERE ("owner_id" IS NULL);


--
-- Name: idx_entries_feed_published; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_entries_feed_published" ON "public"."entries" USING "btree" ("feed_id", "published_at" DESC NULLS LAST);


--
-- Name: idx_entries_owner; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_entries_owner" ON "public"."entries" USING "btree" ("owner_id", "published_at" DESC NULLS LAST) WHERE ("owner_id" IS NOT NULL);


--
-- Name: idx_entries_published; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_entries_published" ON "public"."entries" USING "btree" ("published_at" DESC NULLS LAST);


--
-- Name: idx_entries_title_trigram; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_entries_title_trigram" ON "public"."entries" USING "gin" ("title" "extensions"."gin_trgm_ops");


--
-- Name: idx_feeds_next_fetch; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_feeds_next_fetch" ON "public"."feeds" USING "btree" ("next_fetch_at") WHERE ("consecutive_failures" < 10);


--
-- Name: idx_feeds_url_public; Type: INDEX; Schema: public; Owner: postgres
--

CREATE UNIQUE INDEX "idx_feeds_url_public" ON "public"."feeds" USING "btree" ("url") WHERE ("visibility" = 'public'::"public"."feed_visibility");


--
-- Name: idx_folders_user; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_folders_user" ON "public"."folders" USING "btree" ("user_id");


--
-- Name: idx_muted_keywords_user; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_muted_keywords_user" ON "public"."muted_keywords" USING "btree" ("user_id");


--
-- Name: idx_muted_keywords_user_keyword; Type: INDEX; Schema: public; Owner: postgres
--

CREATE UNIQUE INDEX "idx_muted_keywords_user_keyword" ON "public"."muted_keywords" USING "btree" ("user_id", "lower"("keyword"));


--
-- Name: idx_shared_entries_entry; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_shared_entries_entry" ON "public"."shared_entries" USING "btree" ("entry_id");


--
-- Name: idx_subscriptions_feed; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_subscriptions_feed" ON "public"."subscriptions" USING "btree" ("feed_id");


--
-- Name: idx_subscriptions_folder; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_subscriptions_folder" ON "public"."subscriptions" USING "btree" ("folder_id");


--
-- Name: idx_subscriptions_user; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_subscriptions_user" ON "public"."subscriptions" USING "btree" ("user_id");


--
-- Name: idx_user_entry_states_entry; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_user_entry_states_entry" ON "public"."user_entry_states" USING "btree" ("entry_id");


--
-- Name: idx_user_entry_states_read; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_user_entry_states_read" ON "public"."user_entry_states" USING "btree" ("user_id", "entry_id") WHERE ("read" = true);


--
-- Name: idx_user_entry_states_saved; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_user_entry_states_saved" ON "public"."user_entry_states" USING "btree" ("user_id", "saved_at" DESC) WHERE ("saved" = true);


--
-- Name: idx_user_highlights_entry; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_user_highlights_entry" ON "public"."user_highlights" USING "btree" ("entry_id");


--
-- Name: idx_user_profiles_stripe_customer; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "idx_user_profiles_stripe_customer" ON "public"."user_profiles" USING "btree" ("stripe_customer_identifier") WHERE ("stripe_customer_identifier" IS NOT NULL);


--
-- Name: user_highlights_user_created_idx; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "user_highlights_user_created_idx" ON "public"."user_highlights" USING "btree" ("user_id", "created_at" DESC);


--
-- Name: user_highlights_user_entry_idx; Type: INDEX; Schema: public; Owner: postgres
--

CREATE INDEX "user_highlights_user_entry_idx" ON "public"."user_highlights" USING "btree" ("user_id", "entry_id");


--
-- Name: custom_feeds check_custom_feed_limit_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "check_custom_feed_limit_trigger" BEFORE INSERT ON "public"."custom_feeds" FOR EACH ROW EXECUTE FUNCTION "public"."check_custom_feed_limit"();


--
-- Name: folders check_folder_limit_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "check_folder_limit_trigger" BEFORE INSERT ON "public"."folders" FOR EACH ROW EXECUTE FUNCTION "public"."check_folder_limit"();


--
-- Name: user_highlights check_highlight_limit_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "check_highlight_limit_trigger" BEFORE INSERT ON "public"."user_highlights" FOR EACH ROW EXECUTE FUNCTION "public"."check_highlight_limit"();


--
-- Name: muted_keywords check_muted_keyword_limit_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "check_muted_keyword_limit_trigger" BEFORE INSERT ON "public"."muted_keywords" FOR EACH ROW EXECUTE FUNCTION "public"."check_muted_keyword_limit"();


--
-- Name: subscriptions check_subscription_limit_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "check_subscription_limit_trigger" BEFORE INSERT ON "public"."subscriptions" FOR EACH ROW EXECUTE FUNCTION "public"."check_subscription_limit"();


--
-- Name: custom_feeds custom_feeds_updated_at; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "custom_feeds_updated_at" BEFORE UPDATE ON "public"."custom_feeds" FOR EACH ROW EXECUTE FUNCTION "extensions"."moddatetime"('updated_at');


--
-- Name: custom_feeds decrement_custom_feed_count_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "decrement_custom_feed_count_trigger" AFTER DELETE ON "public"."custom_feeds" FOR EACH ROW EXECUTE FUNCTION "public"."decrement_custom_feed_count"();


--
-- Name: folders decrement_folder_count_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "decrement_folder_count_trigger" AFTER DELETE ON "public"."folders" FOR EACH ROW EXECUTE FUNCTION "public"."decrement_folder_count"();


--
-- Name: user_highlights decrement_highlight_count_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "decrement_highlight_count_trigger" AFTER DELETE ON "public"."user_highlights" FOR EACH ROW EXECUTE FUNCTION "public"."decrement_highlight_count"();


--
-- Name: muted_keywords decrement_muted_keyword_count_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "decrement_muted_keyword_count_trigger" AFTER DELETE ON "public"."muted_keywords" FOR EACH ROW EXECUTE FUNCTION "public"."decrement_muted_keyword_count"();


--
-- Name: subscriptions decrement_subscription_count_trigger; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "decrement_subscription_count_trigger" AFTER DELETE ON "public"."subscriptions" FOR EACH ROW EXECUTE FUNCTION "public"."decrement_subscription_count"();


--
-- Name: feeds feeds_updated_at; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "feeds_updated_at" BEFORE UPDATE ON "public"."feeds" FOR EACH ROW EXECUTE FUNCTION "extensions"."moddatetime"('updated_at');


--
-- Name: folders folders_updated_at; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "folders_updated_at" BEFORE UPDATE ON "public"."folders" FOR EACH ROW EXECUTE FUNCTION "extensions"."moddatetime"('updated_at');


--
-- Name: user_profiles prevent_billing_modification; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "prevent_billing_modification" BEFORE UPDATE ON "public"."user_profiles" FOR EACH ROW EXECUTE FUNCTION "public"."prevent_billing_column_modification"();


--
-- Name: subscriptions subscriptions_updated_at; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "subscriptions_updated_at" BEFORE UPDATE ON "public"."subscriptions" FOR EACH ROW EXECUTE FUNCTION "extensions"."moddatetime"('updated_at');


--
-- Name: subscriptions trigger_enqueue_feed_refresh_after_subscribe; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "trigger_enqueue_feed_refresh_after_subscribe" AFTER INSERT ON "public"."subscriptions" FOR EACH ROW EXECUTE FUNCTION "public"."enqueue_feed_refresh_on_subscribe"();


--
-- Name: user_profiles user_profiles_updated_at; Type: TRIGGER; Schema: public; Owner: postgres
--

CREATE OR REPLACE TRIGGER "user_profiles_updated_at" BEFORE UPDATE ON "public"."user_profiles" FOR EACH ROW EXECUTE FUNCTION "extensions"."moddatetime"('updated_at');


--
-- Name: api_keys [REDACTED] Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."api_keys"
    ADD CONSTRAINT "[REDACTED] FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: custom_feeds custom_feeds_source_folder_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."custom_feeds"
    ADD CONSTRAINT "custom_feeds_source_folder_id_fkey" FOREIGN KEY ("source_folder_id") REFERENCES "public"."folders"("id") ON DELETE SET NULL;


--
-- Name: custom_feeds custom_feeds_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."custom_feeds"
    ADD CONSTRAINT "custom_feeds_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: entries entries_feed_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."entries"
    ADD CONSTRAINT "entries_feed_id_fkey" FOREIGN KEY ("feed_id") REFERENCES "public"."feeds"("id") ON DELETE CASCADE;


--
-- Name: entries entries_owner_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."entries"
    ADD CONSTRAINT "entries_owner_id_fkey" FOREIGN KEY ("owner_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: folders folders_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."folders"
    ADD CONSTRAINT "folders_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: muted_keywords muted_keywords_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."muted_keywords"
    ADD CONSTRAINT "muted_keywords_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: shared_entries shared_entries_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."shared_entries"
    ADD CONSTRAINT "shared_entries_entry_id_fkey" FOREIGN KEY ("entry_id") REFERENCES "public"."entries"("id") ON DELETE CASCADE;


--
-- Name: shared_entries shared_entries_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."shared_entries"
    ADD CONSTRAINT "shared_entries_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: subscriptions subscriptions_feed_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."subscriptions"
    ADD CONSTRAINT "subscriptions_feed_id_fkey" FOREIGN KEY ("feed_id") REFERENCES "public"."feeds"("id") ON DELETE CASCADE;


--
-- Name: subscriptions subscriptions_folder_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."subscriptions"
    ADD CONSTRAINT "subscriptions_folder_id_fkey" FOREIGN KEY ("folder_id") REFERENCES "public"."folders"("id") ON DELETE SET NULL;


--
-- Name: subscriptions subscriptions_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."subscriptions"
    ADD CONSTRAINT "subscriptions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: user_entry_states user_entry_states_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_entry_states"
    ADD CONSTRAINT "user_entry_states_entry_id_fkey" FOREIGN KEY ("entry_id") REFERENCES "public"."entries"("id") ON DELETE CASCADE;


--
-- Name: user_entry_states user_entry_states_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_entry_states"
    ADD CONSTRAINT "user_entry_states_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: user_highlights user_highlights_entry_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_highlights"
    ADD CONSTRAINT "user_highlights_entry_id_fkey" FOREIGN KEY ("entry_id") REFERENCES "public"."entries"("id") ON DELETE CASCADE;


--
-- Name: user_highlights user_highlights_user_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_highlights"
    ADD CONSTRAINT "user_highlights_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: user_profiles user_profiles_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY "public"."user_profiles"
    ADD CONSTRAINT "user_profiles_id_fkey" FOREIGN KEY ("id") REFERENCES "auth"."users"("id") ON DELETE CASCADE;


--
-- Name: api_keys Users can delete own API keys; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "Users can delete own API keys" ON "public"."api_keys" FOR DELETE USING ((( SELECT "auth"."uid"() AS "uid") = "user_id"));


--
-- Name: api_keys Users can insert own API keys; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "Users can insert own API keys" ON "public"."api_keys" FOR INSERT WITH CHECK ((( SELECT "auth"."uid"() AS "uid") = "user_id"));


--
-- Name: api_keys Users can update own API keys; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "Users can update own API keys" ON "public"."api_keys" FOR UPDATE USING ((( SELECT "auth"."uid"() AS "uid") = "user_id"));


--
-- Name: api_keys Users can view own API keys; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "Users can view own API keys" ON "public"."api_keys" FOR SELECT USING ((( SELECT "auth"."uid"() AS "uid") = "user_id"));


--
-- Name: api_keys; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."api_keys" ENABLE ROW LEVEL SECURITY;

--
-- Name: shared_entries authenticated users can view own shared entries; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "authenticated users can view own shared entries" ON "public"."shared_entries" FOR SELECT TO "authenticated" USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: custom_feeds; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."custom_feeds" ENABLE ROW LEVEL SECURITY;

--
-- Name: entries; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."entries" ENABLE ROW LEVEL SECURITY;

--
-- Name: feeds; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."feeds" ENABLE ROW LEVEL SECURITY;

--
-- Name: folders; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."folders" ENABLE ROW LEVEL SECURITY;

--
-- Name: muted_keywords; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."muted_keywords" ENABLE ROW LEVEL SECURITY;

--
-- Name: shared_entries owners can delete own shared entries; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "owners can delete own shared entries" ON "public"."shared_entries" FOR DELETE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: shared_entries owners can insert own shared entries; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "owners can insert own shared entries" ON "public"."shared_entries" FOR INSERT WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: shared_entries owners can update own shared entries; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "owners can update own shared entries" ON "public"."shared_entries" FOR UPDATE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid"))) WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: rate_limits; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."rate_limits" ENABLE ROW LEVEL SECURITY;

--
-- Name: shared_entries; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."shared_entries" ENABLE ROW LEVEL SECURITY;

--
-- Name: subscriptions; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."subscriptions" ENABLE ROW LEVEL SECURITY;

--
-- Name: user_entry_states; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."user_entry_states" ENABLE ROW LEVEL SECURITY;

--
-- Name: user_highlights; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."user_highlights" ENABLE ROW LEVEL SECURITY;

--
-- Name: user_profiles; Type: ROW SECURITY; Schema: public; Owner: postgres
--

ALTER TABLE "public"."user_profiles" ENABLE ROW LEVEL SECURITY;

--
-- Name: custom_feeds users can delete own custom feeds; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can delete own custom feeds" ON "public"."custom_feeds" FOR DELETE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: folders users can delete own folders; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can delete own folders" ON "public"."folders" FOR DELETE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: user_highlights users can delete own highlights; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can delete own highlights" ON "public"."user_highlights" FOR DELETE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: muted_keywords users can delete own muted keywords; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can delete own muted keywords" ON "public"."muted_keywords" FOR DELETE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: subscriptions users can delete own subscriptions; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can delete own subscriptions" ON "public"."subscriptions" FOR DELETE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: custom_feeds users can insert own custom feeds; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can insert own custom feeds" ON "public"."custom_feeds" FOR INSERT WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: folders users can insert own folders; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can insert own folders" ON "public"."folders" FOR INSERT WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: user_highlights users can insert own highlights; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can insert own highlights" ON "public"."user_highlights" FOR INSERT WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: muted_keywords users can insert own muted keywords; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can insert own muted keywords" ON "public"."muted_keywords" FOR INSERT WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: subscriptions users can insert own subscriptions; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can insert own subscriptions" ON "public"."subscriptions" FOR INSERT WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: user_entry_states users can manage own entry states; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can manage own entry states" ON "public"."user_entry_states" USING (("user_id" = ( SELECT "auth"."uid"() AS "uid"))) WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: custom_feeds users can update own custom feeds; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can update own custom feeds" ON "public"."custom_feeds" FOR UPDATE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid"))) WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: folders users can update own folders; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can update own folders" ON "public"."folders" FOR UPDATE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid"))) WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: user_highlights users can update own highlights; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can update own highlights" ON "public"."user_highlights" FOR UPDATE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid"))) WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: user_profiles users can update own profile; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can update own profile" ON "public"."user_profiles" FOR UPDATE USING (("id" = ( SELECT "auth"."uid"() AS "uid"))) WITH CHECK (("id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: subscriptions users can update own subscriptions; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can update own subscriptions" ON "public"."subscriptions" FOR UPDATE USING (("user_id" = ( SELECT "auth"."uid"() AS "uid"))) WITH CHECK (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: feeds users can view accessible feeds; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can view accessible feeds" ON "public"."feeds" FOR SELECT USING (((("visibility" = 'public'::"public"."feed_visibility") AND (( SELECT "auth"."role"() AS "role") = 'authenticated'::"text")) OR (("visibility" = 'authenticated'::"public"."feed_visibility") AND (EXISTS ( SELECT 1
   FROM "public"."subscriptions" "s"
  WHERE (("s"."feed_id" = "feeds"."id") AND ("s"."user_id" = ( SELECT "auth"."uid"() AS "uid"))))))));


--
-- Name: entries users can view entries from subscribed public feeds; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can view entries from subscribed public feeds" ON "public"."entries" FOR SELECT USING (((("owner_id" IS NULL) AND (EXISTS ( SELECT 1
   FROM "public"."subscriptions" "s"
  WHERE (("s"."feed_id" = "entries"."feed_id") AND ("s"."user_id" = ( SELECT "auth"."uid"() AS "uid")))))) OR ("owner_id" = ( SELECT "auth"."uid"() AS "uid"))));


--
-- Name: custom_feeds users can view own custom feeds; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can view own custom feeds" ON "public"."custom_feeds" FOR SELECT USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: folders users can view own folders; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can view own folders" ON "public"."folders" FOR SELECT USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: user_highlights users can view own highlights; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can view own highlights" ON "public"."user_highlights" FOR SELECT USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: muted_keywords users can view own muted keywords; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can view own muted keywords" ON "public"."muted_keywords" FOR SELECT USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: user_profiles users can view own profile; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can view own profile" ON "public"."user_profiles" FOR SELECT USING (("id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: subscriptions users can view own subscriptions; Type: POLICY; Schema: public; Owner: postgres
--

CREATE POLICY "users can view own subscriptions" ON "public"."subscriptions" FOR SELECT USING (("user_id" = ( SELECT "auth"."uid"() AS "uid")));


--
-- Name: supabase_realtime; Type: PUBLICATION; Schema: -; Owner: postgres
--

-- CREATE PUBLICATION "supabase_realtime" WITH (publish = 'insert, update, delete, truncate');


ALTER PUBLICATION "supabase_realtime" OWNER TO "postgres";

--
-- Name: supabase_realtime_messages_publication; Type: PUBLICATION; Schema: -; Owner: supabase_admin
--

-- CREATE PUBLICATION "supabase_realtime_messages_publication" WITH (publish = 'insert, update, delete, truncate');


-- ALTER PUBLICATION "supabase_realtime_messages_publication" OWNER TO "supabase_admin";

--
-- Name: supabase_realtime entries; Type: PUBLICATION TABLE; Schema: public; Owner: postgres
--

ALTER PUBLICATION "supabase_realtime" ADD TABLE ONLY "public"."entries";


--
-- Name: SCHEMA "cron"; Type: ACL; Schema: -; Owner: supabase_admin
--

-- GRANT USAGE ON SCHEMA "cron" TO "postgres" WITH GRANT OPTION;


--
-- Name: SCHEMA "public"; Type: ACL; Schema: -; Owner: pg_database_owner
--

GRANT USAGE ON SCHEMA "public" TO "postgres";
GRANT USAGE ON SCHEMA "public" TO "anon";
GRANT USAGE ON SCHEMA "public" TO "authenticated";
GRANT USAGE ON SCHEMA "public" TO "service_role";


--
-- Name: FUNCTION "gtrgm_in"("cstring"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_in"("cstring") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_in"("cstring") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_in"("cstring") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_in"("cstring") TO "service_role";


--
-- Name: FUNCTION "gtrgm_out"("extensions"."gtrgm"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_out"("extensions"."gtrgm") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_out"("extensions"."gtrgm") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_out"("extensions"."gtrgm") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_out"("extensions"."gtrgm") TO "service_role";


--
-- Name: FUNCTION "alter_job"("job_id" bigint, "schedule" "text", "command" "text", "database" "text", "username" "text", "active" boolean); Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "cron"."alter_job"("job_id" bigint, "schedule" "text", "command" "text", "database" "text", "username" "text", "active" boolean) TO "postgres" WITH GRANT OPTION;


--
-- Name: FUNCTION "job_cache_invalidate"(); Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "cron"."job_cache_invalidate"() TO "postgres" WITH GRANT OPTION;


--
-- Name: FUNCTION "schedule"("schedule" "text", "command" "text"); Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "cron"."schedule"("schedule" "text", "command" "text") TO "postgres" WITH GRANT OPTION;


--
-- Name: FUNCTION "schedule"("job_name" "text", "schedule" "text", "command" "text"); Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "cron"."schedule"("job_name" "text", "schedule" "text", "command" "text") TO "postgres" WITH GRANT OPTION;


--
-- Name: FUNCTION "schedule_in_database"("job_name" "text", "schedule" "text", "command" "text", "database" "text", "username" "text", "active" boolean); Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "cron"."schedule_in_database"("job_name" "text", "schedule" "text", "command" "text", "database" "text", "username" "text", "active" boolean) TO "postgres" WITH GRANT OPTION;


--
-- Name: FUNCTION "unschedule"("job_id" bigint); Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "cron"."unschedule"("job_id" bigint) TO "postgres" WITH GRANT OPTION;


--
-- Name: FUNCTION "unschedule"("job_name" "text"); Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "cron"."unschedule"("job_name" "text") TO "postgres" WITH GRANT OPTION;


--
-- Name: FUNCTION "armor"("bytea"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."armor"("bytea") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."armor"("bytea") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."armor"("bytea") TO "dashboard_user";


--
-- Name: FUNCTION "armor"("bytea", "text"[], "text"[]); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."armor"("bytea", "text"[], "text"[]) FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."armor"("bytea", "text"[], "text"[]) TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."armor"("bytea", "text"[], "text"[]) TO "dashboard_user";


--
-- Name: FUNCTION "crypt"("text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."crypt"("text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."crypt"("text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."crypt"("text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "dearmor"("text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."dearmor"("text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."dearmor"("text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."dearmor"("text") TO "dashboard_user";


--
-- Name: FUNCTION "decrypt"("bytea", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."decrypt"("bytea", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."decrypt"("bytea", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."decrypt"("bytea", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "decrypt_iv"("bytea", "bytea", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."decrypt_iv"("bytea", "bytea", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."decrypt_iv"("bytea", "bytea", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."decrypt_iv"("bytea", "bytea", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "digest"("bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."digest"("bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."digest"("bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."digest"("bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "digest"("text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."digest"("text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."digest"("text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."digest"("text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "encrypt"("bytea", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."encrypt"("bytea", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."encrypt"("bytea", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."encrypt"("bytea", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "encrypt_iv"("bytea", "bytea", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."encrypt_iv"("bytea", "bytea", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."encrypt_iv"("bytea", "bytea", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."encrypt_iv"("bytea", "bytea", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "gen_random_bytes"(integer); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."gen_random_bytes"(integer) FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gen_random_bytes"(integer) TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."gen_random_bytes"(integer) TO "dashboard_user";


--
-- Name: FUNCTION "gen_random_uuid"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."gen_random_uuid"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gen_random_uuid"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."gen_random_uuid"() TO "dashboard_user";


--
-- Name: FUNCTION "gen_salt"("text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."gen_salt"("text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gen_salt"("text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."gen_salt"("text") TO "dashboard_user";


--
-- Name: FUNCTION "gen_salt"("text", integer); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."gen_salt"("text", integer) FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gen_salt"("text", integer) TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."gen_salt"("text", integer) TO "dashboard_user";


--
-- Name: FUNCTION "gin_extract_query_trgm"("text", "internal", smallint, "internal", "internal", "internal", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gin_extract_query_trgm"("text", "internal", smallint, "internal", "internal", "internal", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gin_extract_query_trgm"("text", "internal", smallint, "internal", "internal", "internal", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gin_extract_query_trgm"("text", "internal", smallint, "internal", "internal", "internal", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gin_extract_query_trgm"("text", "internal", smallint, "internal", "internal", "internal", "internal") TO "service_role";


--
-- Name: FUNCTION "gin_extract_value_trgm"("text", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gin_extract_value_trgm"("text", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gin_extract_value_trgm"("text", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gin_extract_value_trgm"("text", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gin_extract_value_trgm"("text", "internal") TO "service_role";


--
-- Name: FUNCTION "gin_trgm_consistent"("internal", smallint, "text", integer, "internal", "internal", "internal", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gin_trgm_consistent"("internal", smallint, "text", integer, "internal", "internal", "internal", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gin_trgm_consistent"("internal", smallint, "text", integer, "internal", "internal", "internal", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gin_trgm_consistent"("internal", smallint, "text", integer, "internal", "internal", "internal", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gin_trgm_consistent"("internal", smallint, "text", integer, "internal", "internal", "internal", "internal") TO "service_role";


--
-- Name: FUNCTION "gin_trgm_triconsistent"("internal", smallint, "text", integer, "internal", "internal", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gin_trgm_triconsistent"("internal", smallint, "text", integer, "internal", "internal", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gin_trgm_triconsistent"("internal", smallint, "text", integer, "internal", "internal", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gin_trgm_triconsistent"("internal", smallint, "text", integer, "internal", "internal", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gin_trgm_triconsistent"("internal", smallint, "text", integer, "internal", "internal", "internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_compress"("internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_compress"("internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_compress"("internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_compress"("internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_compress"("internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_consistent"("internal", "text", smallint, "oid", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_consistent"("internal", "text", smallint, "oid", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_consistent"("internal", "text", smallint, "oid", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_consistent"("internal", "text", smallint, "oid", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_consistent"("internal", "text", smallint, "oid", "internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_decompress"("internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_decompress"("internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_decompress"("internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_decompress"("internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_decompress"("internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_distance"("internal", "text", smallint, "oid", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_distance"("internal", "text", smallint, "oid", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_distance"("internal", "text", smallint, "oid", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_distance"("internal", "text", smallint, "oid", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_distance"("internal", "text", smallint, "oid", "internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_options"("internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_options"("internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_options"("internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_options"("internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_options"("internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_penalty"("internal", "internal", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_penalty"("internal", "internal", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_penalty"("internal", "internal", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_penalty"("internal", "internal", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_penalty"("internal", "internal", "internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_picksplit"("internal", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_picksplit"("internal", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_picksplit"("internal", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_picksplit"("internal", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_picksplit"("internal", "internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_same"("extensions"."gtrgm", "extensions"."gtrgm", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_same"("extensions"."gtrgm", "extensions"."gtrgm", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_same"("extensions"."gtrgm", "extensions"."gtrgm", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_same"("extensions"."gtrgm", "extensions"."gtrgm", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_same"("extensions"."gtrgm", "extensions"."gtrgm", "internal") TO "service_role";


--
-- Name: FUNCTION "gtrgm_union"("internal", "internal"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."gtrgm_union"("internal", "internal") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_union"("internal", "internal") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_union"("internal", "internal") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."gtrgm_union"("internal", "internal") TO "service_role";


--
-- Name: FUNCTION "hmac"("bytea", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."hmac"("bytea", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."hmac"("bytea", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."hmac"("bytea", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "hmac"("text", "text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."hmac"("text", "text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."hmac"("text", "text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."hmac"("text", "text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "moddatetime"(); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."moddatetime"() TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."moddatetime"() TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."moddatetime"() TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."moddatetime"() TO "service_role";


--
-- Name: FUNCTION "pg_stat_statements"("showtext" boolean, OUT "userid" "oid", OUT "dbid" "oid", OUT "toplevel" boolean, OUT "queryid" bigint, OUT "query" "text", OUT "plans" bigint, OUT "total_plan_time" double precision, OUT "min_plan_time" double precision, OUT "max_plan_time" double precision, OUT "mean_plan_time" double precision, OUT "stddev_plan_time" double precision, OUT "calls" bigint, OUT "total_exec_time" double precision, OUT "min_exec_time" double precision, OUT "max_exec_time" double precision, OUT "mean_exec_time" double precision, OUT "stddev_exec_time" double precision, OUT "rows" bigint, OUT "shared_blks_hit" bigint, OUT "shared_blks_read" bigint, OUT "shared_blks_dirtied" bigint, OUT "shared_blks_written" bigint, OUT "local_blks_hit" bigint, OUT "local_blks_read" bigint, OUT "local_blks_dirtied" bigint, OUT "local_blks_written" bigint, OUT "temp_blks_read" bigint, OUT "temp_blks_written" bigint, OUT "shared_blk_read_time" double precision, OUT "shared_blk_write_time" double precision, OUT "local_blk_read_time" double precision, OUT "local_blk_write_time" double precision, OUT "temp_blk_read_time" double precision, OUT "temp_blk_write_time" double precision, OUT "wal_records" bigint, OUT "wal_fpi" bigint, OUT "wal_bytes" numeric, OUT "jit_functions" bigint, OUT "jit_generation_time" double precision, OUT "jit_inlining_count" bigint, OUT "jit_inlining_time" double precision, OUT "jit_optimization_count" bigint, OUT "jit_optimization_time" double precision, OUT "jit_emission_count" bigint, OUT "jit_emission_time" double precision, OUT "jit_deform_count" bigint, OUT "jit_deform_time" double precision, OUT "stats_since" timestamp with time zone, OUT "minmax_stats_since" timestamp with time zone); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pg_stat_statements"("showtext" boolean, OUT "userid" "oid", OUT "dbid" "oid", OUT "toplevel" boolean, OUT "queryid" bigint, OUT "query" "text", OUT "plans" bigint, OUT "total_plan_time" double precision, OUT "min_plan_time" double precision, OUT "max_plan_time" double precision, OUT "mean_plan_time" double precision, OUT "stddev_plan_time" double precision, OUT "calls" bigint, OUT "total_exec_time" double precision, OUT "min_exec_time" double precision, OUT "max_exec_time" double precision, OUT "mean_exec_time" double precision, OUT "stddev_exec_time" double precision, OUT "rows" bigint, OUT "shared_blks_hit" bigint, OUT "shared_blks_read" bigint, OUT "shared_blks_dirtied" bigint, OUT "shared_blks_written" bigint, OUT "local_blks_hit" bigint, OUT "local_blks_read" bigint, OUT "local_blks_dirtied" bigint, OUT "local_blks_written" bigint, OUT "temp_blks_read" bigint, OUT "temp_blks_written" bigint, OUT "shared_blk_read_time" double precision, OUT "shared_blk_write_time" double precision, OUT "local_blk_read_time" double precision, OUT "local_blk_write_time" double precision, OUT "temp_blk_read_time" double precision, OUT "temp_blk_write_time" double precision, OUT "wal_records" bigint, OUT "wal_fpi" bigint, OUT "wal_bytes" numeric, OUT "jit_functions" bigint, OUT "jit_generation_time" double precision, OUT "jit_inlining_count" bigint, OUT "jit_inlining_time" double precision, OUT "jit_optimization_count" bigint, OUT "jit_optimization_time" double precision, OUT "jit_emission_count" bigint, OUT "jit_emission_time" double precision, OUT "jit_deform_count" bigint, OUT "jit_deform_time" double precision, OUT "stats_since" timestamp with time zone, OUT "minmax_stats_since" timestamp with time zone) FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pg_stat_statements"("showtext" boolean, OUT "userid" "oid", OUT "dbid" "oid", OUT "toplevel" boolean, OUT "queryid" bigint, OUT "query" "text", OUT "plans" bigint, OUT "total_plan_time" double precision, OUT "min_plan_time" double precision, OUT "max_plan_time" double precision, OUT "mean_plan_time" double precision, OUT "stddev_plan_time" double precision, OUT "calls" bigint, OUT "total_exec_time" double precision, OUT "min_exec_time" double precision, OUT "max_exec_time" double precision, OUT "mean_exec_time" double precision, OUT "stddev_exec_time" double precision, OUT "rows" bigint, OUT "shared_blks_hit" bigint, OUT "shared_blks_read" bigint, OUT "shared_blks_dirtied" bigint, OUT "shared_blks_written" bigint, OUT "local_blks_hit" bigint, OUT "local_blks_read" bigint, OUT "local_blks_dirtied" bigint, OUT "local_blks_written" bigint, OUT "temp_blks_read" bigint, OUT "temp_blks_written" bigint, OUT "shared_blk_read_time" double precision, OUT "shared_blk_write_time" double precision, OUT "local_blk_read_time" double precision, OUT "local_blk_write_time" double precision, OUT "temp_blk_read_time" double precision, OUT "temp_blk_write_time" double precision, OUT "wal_records" bigint, OUT "wal_fpi" bigint, OUT "wal_bytes" numeric, OUT "jit_functions" bigint, OUT "jit_generation_time" double precision, OUT "jit_inlining_count" bigint, OUT "jit_inlining_time" double precision, OUT "jit_optimization_count" bigint, OUT "jit_optimization_time" double precision, OUT "jit_emission_count" bigint, OUT "jit_emission_time" double precision, OUT "jit_deform_count" bigint, OUT "jit_deform_time" double precision, OUT "stats_since" timestamp with time zone, OUT "minmax_stats_since" timestamp with time zone) TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pg_stat_statements"("showtext" boolean, OUT "userid" "oid", OUT "dbid" "oid", OUT "toplevel" boolean, OUT "queryid" bigint, OUT "query" "text", OUT "plans" bigint, OUT "total_plan_time" double precision, OUT "min_plan_time" double precision, OUT "max_plan_time" double precision, OUT "mean_plan_time" double precision, OUT "stddev_plan_time" double precision, OUT "calls" bigint, OUT "total_exec_time" double precision, OUT "min_exec_time" double precision, OUT "max_exec_time" double precision, OUT "mean_exec_time" double precision, OUT "stddev_exec_time" double precision, OUT "rows" bigint, OUT "shared_blks_hit" bigint, OUT "shared_blks_read" bigint, OUT "shared_blks_dirtied" bigint, OUT "shared_blks_written" bigint, OUT "local_blks_hit" bigint, OUT "local_blks_read" bigint, OUT "local_blks_dirtied" bigint, OUT "local_blks_written" bigint, OUT "temp_blks_read" bigint, OUT "temp_blks_written" bigint, OUT "shared_blk_read_time" double precision, OUT "shared_blk_write_time" double precision, OUT "local_blk_read_time" double precision, OUT "local_blk_write_time" double precision, OUT "temp_blk_read_time" double precision, OUT "temp_blk_write_time" double precision, OUT "wal_records" bigint, OUT "wal_fpi" bigint, OUT "wal_bytes" numeric, OUT "jit_functions" bigint, OUT "jit_generation_time" double precision, OUT "jit_inlining_count" bigint, OUT "jit_inlining_time" double precision, OUT "jit_optimization_count" bigint, OUT "jit_optimization_time" double precision, OUT "jit_emission_count" bigint, OUT "jit_emission_time" double precision, OUT "jit_deform_count" bigint, OUT "jit_deform_time" double precision, OUT "stats_since" timestamp with time zone, OUT "minmax_stats_since" timestamp with time zone) TO "dashboard_user";


--
-- Name: FUNCTION "pg_stat_statements_info"(OUT "dealloc" bigint, OUT "stats_reset" timestamp with time zone); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pg_stat_statements_info"(OUT "dealloc" bigint, OUT "stats_reset" timestamp with time zone) FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pg_stat_statements_info"(OUT "dealloc" bigint, OUT "stats_reset" timestamp with time zone) TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pg_stat_statements_info"(OUT "dealloc" bigint, OUT "stats_reset" timestamp with time zone) TO "dashboard_user";


--
-- Name: FUNCTION "pg_stat_statements_reset"("userid" "oid", "dbid" "oid", "queryid" bigint, "minmax_only" boolean); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pg_stat_statements_reset"("userid" "oid", "dbid" "oid", "queryid" bigint, "minmax_only" boolean) FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pg_stat_statements_reset"("userid" "oid", "dbid" "oid", "queryid" bigint, "minmax_only" boolean) TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pg_stat_statements_reset"("userid" "oid", "dbid" "oid", "queryid" bigint, "minmax_only" boolean) TO "dashboard_user";


--
-- Name: FUNCTION "pgp_armor_headers"("text", OUT "key" "text", OUT "value" "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_armor_headers"("text", OUT "key" "text", OUT "value" "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_armor_headers"("text", OUT "key" "text", OUT "value" "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_armor_headers"("text", OUT "key" "text", OUT "value" "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_key_id"("bytea"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_key_id"("bytea") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_key_id"("bytea") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_key_id"("bytea") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_decrypt"("bytea", "bytea"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_decrypt"("bytea", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_decrypt"("bytea", "bytea", "text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea", "text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea", "text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt"("bytea", "bytea", "text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_decrypt_bytea"("bytea", "bytea"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_decrypt_bytea"("bytea", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_decrypt_bytea"("bytea", "bytea", "text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea", "text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea", "text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_decrypt_bytea"("bytea", "bytea", "text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_encrypt"("text", "bytea"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_encrypt"("text", "bytea") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_encrypt"("text", "bytea") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_encrypt"("text", "bytea") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_encrypt"("text", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_encrypt"("text", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_encrypt"("text", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_encrypt"("text", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_encrypt_bytea"("bytea", "bytea"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_encrypt_bytea"("bytea", "bytea") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_encrypt_bytea"("bytea", "bytea") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_encrypt_bytea"("bytea", "bytea") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_pub_encrypt_bytea"("bytea", "bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_pub_encrypt_bytea"("bytea", "bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_encrypt_bytea"("bytea", "bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_pub_encrypt_bytea"("bytea", "bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_sym_decrypt"("bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_sym_decrypt"("bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_decrypt"("bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_decrypt"("bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_sym_decrypt"("bytea", "text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_sym_decrypt"("bytea", "text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_decrypt"("bytea", "text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_decrypt"("bytea", "text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_sym_decrypt_bytea"("bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_sym_decrypt_bytea"("bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_decrypt_bytea"("bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_decrypt_bytea"("bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_sym_decrypt_bytea"("bytea", "text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_sym_decrypt_bytea"("bytea", "text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_decrypt_bytea"("bytea", "text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_decrypt_bytea"("bytea", "text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_sym_encrypt"("text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_sym_encrypt"("text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_encrypt"("text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_encrypt"("text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_sym_encrypt"("text", "text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_sym_encrypt"("text", "text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_encrypt"("text", "text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_encrypt"("text", "text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_sym_encrypt_bytea"("bytea", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_sym_encrypt_bytea"("bytea", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_encrypt_bytea"("bytea", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_encrypt_bytea"("bytea", "text") TO "dashboard_user";


--
-- Name: FUNCTION "pgp_sym_encrypt_bytea"("bytea", "text", "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."pgp_sym_encrypt_bytea"("bytea", "text", "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_encrypt_bytea"("bytea", "text", "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."pgp_sym_encrypt_bytea"("bytea", "text", "text") TO "dashboard_user";


--
-- Name: FUNCTION "set_limit"(real); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."set_limit"(real) TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."set_limit"(real) TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."set_limit"(real) TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."set_limit"(real) TO "service_role";


--
-- Name: FUNCTION "show_limit"(); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."show_limit"() TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."show_limit"() TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."show_limit"() TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."show_limit"() TO "service_role";


--
-- Name: FUNCTION "show_trgm"("text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."show_trgm"("text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."show_trgm"("text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."show_trgm"("text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."show_trgm"("text") TO "service_role";


--
-- Name: FUNCTION "similarity"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."similarity"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."similarity"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."similarity"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."similarity"("text", "text") TO "service_role";


--
-- Name: FUNCTION "similarity_dist"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."similarity_dist"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."similarity_dist"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."similarity_dist"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."similarity_dist"("text", "text") TO "service_role";


--
-- Name: FUNCTION "similarity_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."similarity_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."similarity_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."similarity_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."similarity_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "strict_word_similarity"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity"("text", "text") TO "service_role";


--
-- Name: FUNCTION "strict_word_similarity_commutator_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_commutator_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_commutator_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_commutator_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_commutator_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "strict_word_similarity_dist_commutator_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_dist_commutator_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_dist_commutator_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_dist_commutator_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_dist_commutator_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "strict_word_similarity_dist_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_dist_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_dist_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_dist_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_dist_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "strict_word_similarity_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."strict_word_similarity_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "uuid_generate_v1"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_generate_v1"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v1"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v1"() TO "dashboard_user";


--
-- Name: FUNCTION "uuid_generate_v1mc"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_generate_v1mc"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v1mc"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v1mc"() TO "dashboard_user";


--
-- Name: FUNCTION "uuid_generate_v3"("namespace" "uuid", "name" "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_generate_v3"("namespace" "uuid", "name" "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v3"("namespace" "uuid", "name" "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v3"("namespace" "uuid", "name" "text") TO "dashboard_user";


--
-- Name: FUNCTION "uuid_generate_v4"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_generate_v4"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v4"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v4"() TO "dashboard_user";


--
-- Name: FUNCTION "uuid_generate_v5"("namespace" "uuid", "name" "text"); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_generate_v5"("namespace" "uuid", "name" "text") FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v5"("namespace" "uuid", "name" "text") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_generate_v5"("namespace" "uuid", "name" "text") TO "dashboard_user";


--
-- Name: FUNCTION "uuid_nil"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_nil"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_nil"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_nil"() TO "dashboard_user";


--
-- Name: FUNCTION "uuid_ns_dns"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_ns_dns"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_ns_dns"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_ns_dns"() TO "dashboard_user";


--
-- Name: FUNCTION "uuid_ns_oid"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_ns_oid"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_ns_oid"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_ns_oid"() TO "dashboard_user";


--
-- Name: FUNCTION "uuid_ns_url"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_ns_url"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_ns_url"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_ns_url"() TO "dashboard_user";


--
-- Name: FUNCTION "uuid_ns_x500"(); Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON FUNCTION "extensions"."uuid_ns_x500"() FROM "postgres";
-- GRANT ALL ON FUNCTION "extensions"."uuid_ns_x500"() TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "extensions"."uuid_ns_x500"() TO "dashboard_user";


--
-- Name: FUNCTION "word_similarity"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."word_similarity"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity"("text", "text") TO "service_role";


--
-- Name: FUNCTION "word_similarity_commutator_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."word_similarity_commutator_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_commutator_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_commutator_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_commutator_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "word_similarity_dist_commutator_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."word_similarity_dist_commutator_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_dist_commutator_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_dist_commutator_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_dist_commutator_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "word_similarity_dist_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."word_similarity_dist_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_dist_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_dist_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_dist_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "word_similarity_op"("text", "text"); Type: ACL; Schema: extensions; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "extensions"."word_similarity_op"("text", "text") TO "postgres";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_op"("text", "text") TO "anon";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_op"("text", "text") TO "authenticated";
-- GRANT ALL ON FUNCTION "extensions"."word_similarity_op"("text", "text") TO "service_role";


--
-- Name: FUNCTION "graphql"("operationName" "text", "query" "text", "variables" "jsonb", "extensions" "jsonb"); Type: ACL; Schema: graphql_public; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "graphql_public"."graphql"("operationName" "text", "query" "text", "variables" "jsonb", "extensions" "jsonb") TO "postgres";
-- GRANT ALL ON FUNCTION "graphql_public"."graphql"("operationName" "text", "query" "text", "variables" "jsonb", "extensions" "jsonb") TO "anon";
-- GRANT ALL ON FUNCTION "graphql_public"."graphql"("operationName" "text", "query" "text", "variables" "jsonb", "extensions" "jsonb") TO "authenticated";
-- GRANT ALL ON FUNCTION "graphql_public"."graphql"("operationName" "text", "query" "text", "variables" "jsonb", "extensions" "jsonb") TO "service_role";


--
-- Name: FUNCTION "crypto_aead_det_decrypt"("message" "bytea", "additional" "bytea", "key_uuid" "uuid", "nonce" "bytea"); Type: ACL; Schema: pgsodium; Owner: pgsodium_keymaker
--

-- GRANT ALL ON FUNCTION "pgsodium"."crypto_aead_det_decrypt"("message" "bytea", "additional" "bytea", "key_uuid" "uuid", "nonce" "bytea") TO "service_role";


--
-- Name: FUNCTION "crypto_aead_det_encrypt"("message" "bytea", "additional" "bytea", "key_uuid" "uuid", "nonce" "bytea"); Type: ACL; Schema: pgsodium; Owner: pgsodium_keymaker
--

-- GRANT ALL ON FUNCTION "pgsodium"."crypto_aead_det_encrypt"("message" "bytea", "additional" "bytea", "key_uuid" "uuid", "nonce" "bytea") TO "service_role";


--
-- Name: FUNCTION "crypto_aead_det_keygen"(); Type: ACL; Schema: pgsodium; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "pgsodium"."crypto_aead_det_keygen"() TO "service_role";


--
-- Name: FUNCTION "add_feed_credentials"("p_subscription_id" "uuid", "p_auth_type" "text", "p_credential" "text"); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."add_feed_credentials"("p_subscription_id" "uuid", "p_auth_type" "text", "p_credential" "text") TO "anon";
GRANT ALL ON FUNCTION "public"."add_feed_credentials"("p_subscription_id" "uuid", "p_auth_type" "text", "p_credential" "text") TO "authenticated";
GRANT ALL ON FUNCTION "public"."add_feed_credentials"("p_subscription_id" "uuid", "p_auth_type" "text", "p_credential" "text") TO "service_role";


--
-- Name: FUNCTION "check_custom_feed_limit"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."check_custom_feed_limit"() TO "anon";
GRANT ALL ON FUNCTION "public"."check_custom_feed_limit"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."check_custom_feed_limit"() TO "service_role";


--
-- Name: FUNCTION "check_folder_limit"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."check_folder_limit"() TO "anon";
GRANT ALL ON FUNCTION "public"."check_folder_limit"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."check_folder_limit"() TO "service_role";


--
-- Name: FUNCTION "check_highlight_limit"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."check_highlight_limit"() TO "anon";
GRANT ALL ON FUNCTION "public"."check_highlight_limit"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."check_highlight_limit"() TO "service_role";


--
-- Name: FUNCTION "check_muted_keyword_limit"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."check_muted_keyword_limit"() TO "anon";
GRANT ALL ON FUNCTION "public"."check_muted_keyword_limit"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."check_muted_keyword_limit"() TO "service_role";


--
-- Name: FUNCTION "check_rate_limit"("p_identifier" "text", "p_limit" integer, "p_window_seconds" integer); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."check_rate_limit"("p_identifier" "text", "p_limit" integer, "p_window_seconds" integer) TO "anon";
GRANT ALL ON FUNCTION "public"."check_rate_limit"("p_identifier" "text", "p_limit" integer, "p_window_seconds" integer) TO "authenticated";
GRANT ALL ON FUNCTION "public"."check_rate_limit"("p_identifier" "text", "p_limit" integer, "p_window_seconds" integer) TO "service_role";


--
-- Name: FUNCTION "check_subscription_limit"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."check_subscription_limit"() TO "anon";
GRANT ALL ON FUNCTION "public"."check_subscription_limit"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."check_subscription_limit"() TO "service_role";


--
-- Name: FUNCTION "cleanup_stale_entries"(); Type: ACL; Schema: public; Owner: postgres
--

REVOKE ALL ON FUNCTION "public"."cleanup_stale_entries"() FROM PUBLIC;
GRANT ALL ON FUNCTION "public"."cleanup_stale_entries"() TO "service_role";


--
-- Name: FUNCTION "cleanup_stale_rate_limits"(); Type: ACL; Schema: public; Owner: postgres
--

REVOKE ALL ON FUNCTION "public"."cleanup_stale_rate_limits"() FROM PUBLIC;
GRANT ALL ON FUNCTION "public"."cleanup_stale_rate_limits"() TO "anon";
GRANT ALL ON FUNCTION "public"."cleanup_stale_rate_limits"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."cleanup_stale_rate_limits"() TO "service_role";


--
-- Name: FUNCTION "decrement_custom_feed_count"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."decrement_custom_feed_count"() TO "anon";
GRANT ALL ON FUNCTION "public"."decrement_custom_feed_count"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."decrement_custom_feed_count"() TO "service_role";


--
-- Name: FUNCTION "decrement_folder_count"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."decrement_folder_count"() TO "anon";
GRANT ALL ON FUNCTION "public"."decrement_folder_count"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."decrement_folder_count"() TO "service_role";


--
-- Name: FUNCTION "decrement_highlight_count"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."decrement_highlight_count"() TO "anon";
GRANT ALL ON FUNCTION "public"."decrement_highlight_count"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."decrement_highlight_count"() TO "service_role";


--
-- Name: FUNCTION "decrement_muted_keyword_count"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."decrement_muted_keyword_count"() TO "anon";
GRANT ALL ON FUNCTION "public"."decrement_muted_keyword_count"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."decrement_muted_keyword_count"() TO "service_role";


--
-- Name: FUNCTION "decrement_subscription_count"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."decrement_subscription_count"() TO "anon";
GRANT ALL ON FUNCTION "public"."decrement_subscription_count"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."decrement_subscription_count"() TO "service_role";


--
-- Name: FUNCTION "enqueue_feed_refresh_on_subscribe"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."enqueue_feed_refresh_on_subscribe"() TO "anon";
GRANT ALL ON FUNCTION "public"."enqueue_feed_refresh_on_subscribe"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."enqueue_feed_refresh_on_subscribe"() TO "service_role";


--
-- Name: FUNCTION "get_custom_feed"("target_custom_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone); Type: ACL; Schema: public; Owner: postgres
--

REVOKE ALL ON FUNCTION "public"."get_custom_feed"("target_custom_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone) FROM PUBLIC;
GRANT ALL ON FUNCTION "public"."get_custom_feed"("target_custom_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone) TO "authenticated";
GRANT ALL ON FUNCTION "public"."get_custom_feed"("target_custom_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone) TO "service_role";


--
-- Name: FUNCTION "get_custom_feed_timeline"("p_custom_feed_id" "uuid", "p_result_limit" integer, "p_pagination_cursor" timestamp with time zone); Type: ACL; Schema: public; Owner: postgres
--

REVOKE ALL ON FUNCTION "public"."get_custom_feed_timeline"("p_custom_feed_id" "uuid", "p_result_limit" integer, "p_pagination_cursor" timestamp with time zone) FROM PUBLIC;
GRANT ALL ON FUNCTION "public"."get_custom_feed_timeline"("p_custom_feed_id" "uuid", "p_result_limit" integer, "p_pagination_cursor" timestamp with time zone) TO "authenticated";
GRANT ALL ON FUNCTION "public"."get_custom_feed_timeline"("p_custom_feed_id" "uuid", "p_result_limit" integer, "p_pagination_cursor" timestamp with time zone) TO "service_role";


--
-- Name: FUNCTION "get_timeline"("target_folder_id" "uuid", "target_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone, "unread_only" boolean, "prioritise_unread" boolean, "cursor_is_read" boolean); Type: ACL; Schema: public; Owner: postgres
--

REVOKE ALL ON FUNCTION "public"."get_timeline"("target_folder_id" "uuid", "target_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone, "unread_only" boolean, "prioritise_unread" boolean, "cursor_is_read" boolean) FROM PUBLIC;
GRANT ALL ON FUNCTION "public"."get_timeline"("target_folder_id" "uuid", "target_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone, "unread_only" boolean, "prioritise_unread" boolean, "cursor_is_read" boolean) TO "authenticated";
GRANT ALL ON FUNCTION "public"."get_timeline"("target_folder_id" "uuid", "target_feed_id" "uuid", "result_limit" integer, "pagination_cursor" timestamp with time zone, "unread_only" boolean, "prioritise_unread" boolean, "cursor_is_read" boolean) TO "service_role";


--
-- Name: FUNCTION "get_unread_counts"(); Type: ACL; Schema: public; Owner: postgres
--

REVOKE ALL ON FUNCTION "public"."get_unread_counts"() FROM PUBLIC;
GRANT ALL ON FUNCTION "public"."get_unread_counts"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."get_unread_counts"() TO "service_role";


--
-- Name: FUNCTION "handle_new_user"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."handle_new_user"() TO "anon";
GRANT ALL ON FUNCTION "public"."handle_new_user"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."handle_new_user"() TO "service_role";


--
-- Name: FUNCTION "mark_all_as_read"("p_feed_id" "uuid", "p_folder_id" "uuid", "p_read_state" boolean, "p_entry_ids" "uuid"[]); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."mark_all_as_read"("p_feed_id" "uuid", "p_folder_id" "uuid", "p_read_state" boolean, "p_entry_ids" "uuid"[]) TO "anon";
GRANT ALL ON FUNCTION "public"."mark_all_as_read"("p_feed_id" "uuid", "p_folder_id" "uuid", "p_read_state" boolean, "p_entry_ids" "uuid"[]) TO "authenticated";
GRANT ALL ON FUNCTION "public"."mark_all_as_read"("p_feed_id" "uuid", "p_folder_id" "uuid", "p_read_state" boolean, "p_entry_ids" "uuid"[]) TO "service_role";


--
-- Name: FUNCTION "prevent_billing_column_modification"(); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."prevent_billing_column_modification"() TO "anon";
GRANT ALL ON FUNCTION "public"."prevent_billing_column_modification"() TO "authenticated";
GRANT ALL ON FUNCTION "public"."prevent_billing_column_modification"() TO "service_role";


--
-- Name: FUNCTION "request_feed_refresh"("target_subscription_id" "uuid"); Type: ACL; Schema: public; Owner: postgres
--

REVOKE ALL ON FUNCTION "public"."request_feed_refresh"("target_subscription_id" "uuid") FROM PUBLIC;
GRANT ALL ON FUNCTION "public"."request_feed_refresh"("target_subscription_id" "uuid") TO "authenticated";
GRANT ALL ON FUNCTION "public"."request_feed_refresh"("target_subscription_id" "uuid") TO "service_role";


--
-- Name: FUNCTION "search_entries"("p_query" "text", "p_result_limit" integer); Type: ACL; Schema: public; Owner: postgres
--

REVOKE ALL ON FUNCTION "public"."search_entries"("p_query" "text", "p_result_limit" integer) FROM PUBLIC;
GRANT ALL ON FUNCTION "public"."search_entries"("p_query" "text", "p_result_limit" integer) TO "authenticated";
GRANT ALL ON FUNCTION "public"."search_entries"("p_query" "text", "p_result_limit" integer) TO "service_role";


--
-- Name: FUNCTION "reorder_items"("target_table" "text", "item_ids" "uuid"[], "new_positions" integer[]); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."reorder_items"("target_table" "text", "item_ids" "uuid"[], "new_positions" integer[]) TO "authenticated";
GRANT ALL ON FUNCTION "public"."reorder_items"("target_table" "text", "item_ids" "uuid"[], "new_positions" integer[]) TO "service_role";


--
-- Name: FUNCTION "subscribe_to_feed"("feed_url" "text", "target_folder_id" "uuid", "feed_custom_title" "text", "feed_credential" "text", "feed_auth_type" "text"); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."subscribe_to_feed"("feed_url" "text", "target_folder_id" "uuid", "feed_custom_title" "text", "feed_credential" "text", "feed_auth_type" "text") TO "anon";
GRANT ALL ON FUNCTION "public"."subscribe_to_feed"("feed_url" "text", "target_folder_id" "uuid", "feed_custom_title" "text", "feed_credential" "text", "feed_auth_type" "text") TO "authenticated";
GRANT ALL ON FUNCTION "public"."subscribe_to_feed"("feed_url" "text", "target_folder_id" "uuid", "feed_custom_title" "text", "feed_credential" "text", "feed_auth_type" "text") TO "service_role";


--
-- Name: FUNCTION "update_feed_credentials"("p_feed_id" "uuid", "p_auth_type" "text", "p_credential" "text"); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."update_feed_credentials"("p_feed_id" "uuid", "p_auth_type" "text", "p_credential" "text") TO "anon";
GRANT ALL ON FUNCTION "public"."update_feed_credentials"("p_feed_id" "uuid", "p_auth_type" "text", "p_credential" "text") TO "authenticated";
GRANT ALL ON FUNCTION "public"."update_feed_credentials"("p_feed_id" "uuid", "p_auth_type" "text", "p_credential" "text") TO "service_role";


--
-- Name: FUNCTION "update_feed_url"("target_feed_id" "uuid", "new_url" "text"); Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON FUNCTION "public"."update_feed_url"("target_feed_id" "uuid", "new_url" "text") TO "anon";
GRANT ALL ON FUNCTION "public"."update_feed_url"("target_feed_id" "uuid", "new_url" "text") TO "authenticated";
GRANT ALL ON FUNCTION "public"."update_feed_url"("target_feed_id" "uuid", "new_url" "text") TO "service_role";


--
-- Name: FUNCTION "_crypto_aead_det_decrypt"("message" "bytea", "additional" "bytea", "key_id" bigint, "context" "bytea", "nonce" "bytea"); Type: ACL; Schema: vault; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "vault"."_crypto_aead_det_decrypt"("message" "bytea", "additional" "bytea", "key_id" bigint, "context" "bytea", "nonce" "bytea") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "vault"."_crypto_aead_det_decrypt"("message" "bytea", "additional" "bytea", "key_id" bigint, "context" "bytea", "nonce" "bytea") TO "service_role";


--
-- Name: FUNCTION "create_secret"("new_secret" "text", "new_name" "text", "new_description" "text", "new_key_id" "uuid"); Type: ACL; Schema: vault; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "vault"."create_secret"("new_secret" "text", "new_name" "text", "new_description" "text", "new_key_id" "uuid") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "vault"."create_secret"("new_secret" "text", "new_name" "text", "new_description" "text", "new_key_id" "uuid") TO "service_role";


--
-- Name: FUNCTION "update_secret"("secret_id" "uuid", "new_secret" "text", "new_name" "text", "new_description" "text", "new_key_id" "uuid"); Type: ACL; Schema: vault; Owner: supabase_admin
--

-- GRANT ALL ON FUNCTION "vault"."update_secret"("secret_id" "uuid", "new_secret" "text", "new_name" "text", "new_description" "text", "new_key_id" "uuid") TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON FUNCTION "vault"."update_secret"("secret_id" "uuid", "new_secret" "text", "new_name" "text", "new_description" "text", "new_key_id" "uuid") TO "service_role";


--
-- Name: TABLE "job"; Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT SELECT ON TABLE "cron"."job" TO "postgres" WITH GRANT OPTION;


--
-- Name: TABLE "job_run_details"; Type: ACL; Schema: cron; Owner: supabase_admin
--

-- GRANT ALL ON TABLE "cron"."job_run_details" TO "postgres" WITH GRANT OPTION;


--
-- Name: TABLE "pg_stat_statements"; Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON TABLE "extensions"."pg_stat_statements" FROM "postgres";
-- GRANT ALL ON TABLE "extensions"."pg_stat_statements" TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON TABLE "extensions"."pg_stat_statements" TO "dashboard_user";


--
-- Name: TABLE "pg_stat_statements_info"; Type: ACL; Schema: extensions; Owner: postgres
--

-- REVOKE ALL ON TABLE "extensions"."pg_stat_statements_info" FROM "postgres";
-- GRANT ALL ON TABLE "extensions"."pg_stat_statements_info" TO "postgres" WITH GRANT OPTION;
-- GRANT ALL ON TABLE "extensions"."pg_stat_statements_info" TO "dashboard_user";


--
-- Name: TABLE "decrypted_key"; Type: ACL; Schema: pgsodium; Owner: postgres
--

-- GRANT ALL ON TABLE "pgsodium"."decrypted_key" TO "pgsodium_keyholder";


--
-- Name: TABLE "masking_rule"; Type: ACL; Schema: pgsodium; Owner: supabase_admin
--

-- GRANT ALL ON TABLE "pgsodium"."masking_rule" TO "pgsodium_keyholder";


--
-- Name: TABLE "mask_columns"; Type: ACL; Schema: pgsodium; Owner: supabase_admin
--

-- GRANT ALL ON TABLE "pgsodium"."mask_columns" TO "pgsodium_keyholder";


--
-- Name: TABLE "api_keys"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."api_keys" TO "anon";
GRANT ALL ON TABLE "public"."api_keys" TO "authenticated";
GRANT ALL ON TABLE "public"."api_keys" TO "service_role";


--
-- Name: TABLE "custom_feeds"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."custom_feeds" TO "service_role";
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE "public"."custom_feeds" TO "authenticated";


--
-- Name: TABLE "entries"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."entries" TO "service_role";
GRANT SELECT ON TABLE "public"."entries" TO "authenticated";


--
-- Name: TABLE "feeds"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."feeds" TO "service_role";
GRANT SELECT ON TABLE "public"."feeds" TO "authenticated";


--
-- Name: TABLE "folders"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."folders" TO "service_role";
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE "public"."folders" TO "authenticated";


--
-- Name: TABLE "muted_keywords"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."muted_keywords" TO "service_role";
GRANT SELECT,INSERT,DELETE ON TABLE "public"."muted_keywords" TO "authenticated";


--
-- Name: TABLE "rate_limits"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."rate_limits" TO "anon";
GRANT ALL ON TABLE "public"."rate_limits" TO "authenticated";
GRANT ALL ON TABLE "public"."rate_limits" TO "service_role";


--
-- Name: TABLE "shared_entries"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."shared_entries" TO "service_role";
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE "public"."shared_entries" TO "authenticated";


--
-- Name: TABLE "subscriptions"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."subscriptions" TO "service_role";
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE "public"."subscriptions" TO "authenticated";


--
-- Name: TABLE "user_entry_states"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."user_entry_states" TO "service_role";
GRANT SELECT,INSERT,UPDATE ON TABLE "public"."user_entry_states" TO "authenticated";


--
-- Name: TABLE "user_highlights"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."user_highlights" TO "service_role";
GRANT SELECT,INSERT,DELETE,UPDATE ON TABLE "public"."user_highlights" TO "authenticated";


--
-- Name: TABLE "user_profiles"; Type: ACL; Schema: public; Owner: postgres
--

GRANT ALL ON TABLE "public"."user_profiles" TO "service_role";
GRANT SELECT,UPDATE ON TABLE "public"."user_profiles" TO "authenticated";


--
-- Name: TABLE "secrets"; Type: ACL; Schema: vault; Owner: supabase_admin
--

-- GRANT SELECT,REFERENCES,DELETE,TRUNCATE ON TABLE "vault"."secrets" TO "postgres" WITH GRANT OPTION;
-- GRANT SELECT,DELETE ON TABLE "vault"."secrets" TO "service_role";


--
-- Name: TABLE "decrypted_secrets"; Type: ACL; Schema: vault; Owner: supabase_admin
--

-- GRANT SELECT,REFERENCES,DELETE,TRUNCATE ON TABLE "vault"."decrypted_secrets" TO "postgres" WITH GRANT OPTION;
-- GRANT SELECT,DELETE ON TABLE "vault"."decrypted_secrets" TO "service_role";


--
-- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: postgres
--

ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "postgres";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "anon";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "authenticated";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "service_role";


--
-- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin
--

-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "postgres";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "anon";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "authenticated";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON SEQUENCES TO "service_role";


--
-- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: public; Owner: postgres
--

ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "postgres";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "anon";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "authenticated";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "service_role";


--
-- Name: DEFAULT PRIVILEGES FOR FUNCTIONS; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin
--

-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "postgres";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "anon";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "authenticated";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON FUNCTIONS TO "service_role";


--
-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: postgres
--

ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "postgres";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "anon";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "authenticated";
ALTER DEFAULT PRIVILEGES FOR ROLE "postgres" IN SCHEMA "public" GRANT ALL ON TABLES TO "service_role";


--
-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: public; Owner: supabase_admin
--

-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON TABLES TO "postgres";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON TABLES TO "anon";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON TABLES TO "authenticated";
-- ALTER DEFAULT PRIVILEGES FOR ROLE "supabase_admin" IN SCHEMA "public" GRANT ALL ON TABLES TO "service_role";


--
-- Name: issue_graphql_placeholder; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin
--

-- CREATE EVENT TRIGGER "issue_graphql_placeholder" ON "sql_drop"
--          WHEN TAG IN ('DROP EXTENSION')
--    EXECUTE FUNCTION "extensions"."set_graphql_placeholder"();


-- ALTER EVENT TRIGGER "issue_graphql_placeholder" OWNER TO "supabase_admin";

--
-- Name: issue_pg_cron_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin
--

-- CREATE EVENT TRIGGER "issue_pg_cron_access" ON "ddl_command_end"
--          WHEN TAG IN ('CREATE EXTENSION')
--    EXECUTE FUNCTION "extensions"."grant_pg_cron_access"();


-- ALTER EVENT TRIGGER "issue_pg_cron_access" OWNER TO "supabase_admin";

--
-- Name: issue_pg_graphql_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin
--

-- CREATE EVENT TRIGGER "issue_pg_graphql_access" ON "ddl_command_end"
--          WHEN TAG IN ('CREATE FUNCTION')
--    EXECUTE FUNCTION "extensions"."grant_pg_graphql_access"();


-- ALTER EVENT TRIGGER "issue_pg_graphql_access" OWNER TO "supabase_admin";

--
-- Name: issue_pg_net_access; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin
--

-- CREATE EVENT TRIGGER "issue_pg_net_access" ON "ddl_command_end"
--          WHEN TAG IN ('CREATE EXTENSION')
--    EXECUTE FUNCTION "extensions"."grant_pg_net_access"();


-- ALTER EVENT TRIGGER "issue_pg_net_access" OWNER TO "supabase_admin";

--
-- Name: pgrst_ddl_watch; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin
--

-- CREATE EVENT TRIGGER "pgrst_ddl_watch" ON "ddl_command_end"
--    EXECUTE FUNCTION "extensions"."pgrst_ddl_watch"();


-- ALTER EVENT TRIGGER "pgrst_ddl_watch" OWNER TO "supabase_admin";

--
-- Name: pgrst_drop_watch; Type: EVENT TRIGGER; Schema: -; Owner: supabase_admin
--

-- CREATE EVENT TRIGGER "pgrst_drop_watch" ON "sql_drop"
--    EXECUTE FUNCTION "extensions"."pgrst_drop_watch"();


-- ALTER EVENT TRIGGER "pgrst_drop_watch" OWNER TO "supabase_admin";

--
-- PostgreSQL database dump complete
--

-- \unrestrict UmtWjVupPXEG8xu4MNItn9BufwfwMNLVelpizcRKVG9oupl8Ui3cSVHqhEZtw15

