SentimentScope / misc /all_rpcs.md
Jodinho's picture
feat: Add comprehensive observability and telemetry logging via JSONL and rotating file handlers
7021daf
|
Raw
History Blame Contribute Delete
39.9 kB
| schema_name | function_name | identity_args | result_type | security_definer | function_definition |
| ----------- | ------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| public | get_dashboard_kpis | | json | true | CREATE OR REPLACE FUNCTION public.get_dashboard_kpis()
RETURNS json
LANGUAGE sql
SECURITY DEFINER
AS $function$
SELECT json_build_object(
'pricing', json_build_object(
'products_tracked', (SELECT COUNT(*) FROM products),
'price_changes_7d', (
SELECT COUNT(*) FROM price_history
WHERE created_at >= NOW() - INTERVAL '7 days'
AND price != (
SELECT price FROM price_history ph2
WHERE ph2.product_id = price_history.product_id
AND ph2.created_at < price_history.created_at
ORDER BY ph2.created_at DESC LIMIT 1
)
),
'spikes_7d', (
SELECT COUNT(*) FROM v_price_volatility
WHERE ABS(pct_above_trailing_avg) >= 25
AND created_at >= NOW() - INTERVAL '7 days'
),
'last_scrape_status', (
SELECT last_status FROM v_scrape_health
WHERE job_type = 'PRICE_MONITOR'
ORDER BY last_started_at DESC LIMIT 1
),
'tracking_since', (SELECT MIN(created_at) FROM products)
),
'leads', json_build_object(
'targets_crawled', (SELECT COUNT(*) FROM lead_targets),
'new_leads_7d', (SELECT COUNT(*) FROM leads WHERE created_at >= NOW() - INTERVAL '7 days'),
'total_leads_all_time', (SELECT COUNT(*) FROM leads),
'last_scrape_status', (
SELECT last_status FROM v_scrape_health
WHERE job_type = 'LEAD_GEN'
ORDER BY last_started_at DESC LIMIT 1
)
),
'real_estate', json_build_object(
'properties_tracked', (SELECT COUNT(DISTINCT property_id) FROM v_rate_volatility),
'rate_changes_7d', (
SELECT COUNT(*) FROM rate_history
WHERE created_at >= NOW() - INTERVAL '7 days'
AND nightly_rate IS NOT NULL
AND nightly_rate != (
SELECT nightly_rate FROM rate_history rh2
WHERE rh2.property_id = rate_history.property_id
AND rh2.created_at < rate_history.created_at
AND rh2.nightly_rate IS NOT NULL
ORDER BY rh2.created_at DESC LIMIT 1
)
),
'spikes_7d', (
SELECT COUNT(*) FROM v_rate_volatility
WHERE ABS(pct_above_trailing_avg) >= 25
AND recorded_at >= NOW() - INTERVAL '7 days'
),
'tracking_since', (SELECT MIN(created_at) FROM properties),
'last_scrape_status', (
SELECT COALESCE(json_object_agg(platform, last_status), '{}'::json)
FROM v_scrape_health
WHERE job_type = 'REAL_ESTATE_MONITOR'
)
)
);
$function$
|
| public | get_distance_km | property_a_id uuid, property_b_id uuid | TABLE(distance_km numeric) | true | CREATE OR REPLACE FUNCTION public.get_distance_km(property_a_id uuid, property_b_id uuid)
RETURNS TABLE(distance_km numeric)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
WITH a AS (
SELECT latitude, longitude
FROM public.properties
WHERE id = property_a_id
),
b AS (
SELECT latitude, longitude
FROM public.properties
WHERE id = property_b_id
)
SELECT
(
6371 * 2 * ASIN(
SQRT(
POWER(SIN(RADIANS(b.latitude - a.latitude) / 2), 2) +
COS(RADIANS(a.latitude)) * COS(RADIANS(b.latitude)) *
POWER(SIN(RADIANS(b.longitude - a.longitude) / 2), 2)
)
)
)::numeric(12,4) AS distance_km
FROM a, b
WHERE a.latitude IS NOT NULL
AND a.longitude IS NOT NULL
AND b.latitude IS NOT NULL
AND b.longitude IS NOT NULL;
$function$
|
| public | get_market_averages | market_param text | TABLE(market character varying, active_properties bigint, avg_nightly_rate numeric, min_nightly_rate numeric, max_nightly_rate numeric) | true | CREATE OR REPLACE FUNCTION public.get_market_averages(market_param text DEFAULT NULL::text)
RETURNS TABLE(market character varying, active_properties bigint, avg_nightly_rate numeric, min_nightly_rate numeric, max_nightly_rate numeric)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
SELECT
market,
COUNT(DISTINCT property_id) AS active_properties,
ROUND(AVG(nightly_rate), 2) AS avg_nightly_rate,
MIN(nightly_rate) AS min_nightly_rate,
MAX(nightly_rate) AS max_nightly_rate
FROM public.v_rate_volatility
WHERE (market_param IS NULL OR LOWER(market) = LOWER(market_param))
AND is_active = true
AND nightly_rate IS NOT NULL
GROUP BY market;
$function$
|
| public | get_properties_by_filter | p_market text, p_platform text, p_available boolean, p_bedrooms integer | TABLE(property_id uuid, property_name character varying, market character varying, platform character varying, bedrooms integer, avg_rating numeric, review_count integer, nightly_rate numeric, pct_above_trailing_avg numeric, is_available boolean, recorded_at timestamp with time zone) | true | CREATE OR REPLACE FUNCTION public.get_properties_by_filter(p_market text DEFAULT NULL::text, p_platform text DEFAULT NULL::text, p_available boolean DEFAULT NULL::boolean, p_bedrooms integer DEFAULT NULL::integer)
RETURNS TABLE(property_id uuid, property_name character varying, market character varying, platform character varying, bedrooms integer, avg_rating numeric, review_count integer, nightly_rate numeric, pct_above_trailing_avg numeric, is_available boolean, recorded_at timestamp with time zone)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
SELECT DISTINCT ON (property_id)
property_id,
property_name,
market,
platform,
bedrooms,
avg_rating,
review_count,
nightly_rate,
pct_above_trailing_avg,
is_available,
recorded_at
FROM public.v_rate_volatility
WHERE (p_market IS NULL OR LOWER(market) = LOWER(p_market))
AND (p_platform IS NULL OR LOWER(platform) = LOWER(p_platform))
AND (p_available IS NULL OR is_available = p_available)
AND (p_bedrooms IS NULL OR bedrooms = p_bedrooms)
ORDER BY property_id, recorded_at DESC;
$function$
|
| public | get_property_rate_changes | property_search text, days_param integer, compare_window_days integer | TABLE(property_id uuid, property_name character varying, market character varying, platform character varying, stay_date timestamp with time zone, nightly_rate numeric, trailing_avg_rate numeric, pct_above_trailing_avg numeric, prev_nightly_rate numeric, pct_change_vs_prev numeric) | true | CREATE OR REPLACE FUNCTION public.get_property_rate_changes(property_search text, days_param integer DEFAULT 14, compare_window_days integer DEFAULT 1)
RETURNS TABLE(property_id uuid, property_name character varying, market character varying, platform character varying, stay_date timestamp with time zone, nightly_rate numeric, trailing_avg_rate numeric, pct_above_trailing_avg numeric, prev_nightly_rate numeric, pct_change_vs_prev numeric)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
WITH base AS (
SELECT
rh.property_id,
p.name AS property_name,
p.market,
p.platform,
rh.stay_date,
rh.nightly_rate,
-- compute trailing avg as avg of previous 7 days (excluding current day)
AVG(rh.nightly_rate) OVER (
PARTITION BY rh.property_id
ORDER BY rh.stay_date
ROWS BETWEEN 7 PRECEDING AND 1 PRECEDING
) AS trailing_avg_rate,
LAG(rh.nightly_rate, compare_window_days) OVER (
PARTITION BY rh.property_id
ORDER BY rh.stay_date
) AS prev_nightly_rate
FROM public.v_rate_volatility rh
JOIN public.properties p
ON p.id = rh.property_id
WHERE (rh.property_id::text = property_search OR LOWER(rh.property_name) = LOWER(property_search) OR LOWER(rh.property_name) LIKE '%' || LOWER(property_search) || '%')
AND rh.recorded_at >= (NOW() - (days_param || ' days')::interval)
)
SELECT
property_id,
property_name,
market,
platform,
stay_date,
nightly_rate,
trailing_avg_rate,
CASE
WHEN trailing_avg_rate IS NULL OR trailing_avg_rate = 0 OR nightly_rate IS NULL THEN NULL
ELSE ((nightly_rate - trailing_avg_rate) / trailing_avg_rate) * 100
END AS pct_above_trailing_avg,
prev_nightly_rate,
CASE
WHEN prev_nightly_rate IS NULL OR prev_nightly_rate = 0 OR nightly_rate IS NULL THEN NULL
ELSE ((nightly_rate - prev_nightly_rate) / prev_nightly_rate) * 100
END AS pct_change_vs_prev
FROM base
WHERE stay_date IS NOT NULL
ORDER BY stay_date ASC;
$function$
|
| public | get_property_rate_history | property_search text, days_param integer | TABLE(property_id uuid, property_name character varying, market character varying, stay_date timestamp with time zone, nightly_rate numeric, trailing_avg_rate numeric, pct_above_trailing_avg numeric, is_available boolean) | true | CREATE OR REPLACE FUNCTION public.get_property_rate_history(property_search text, days_param integer DEFAULT 30)
RETURNS TABLE(property_id uuid, property_name character varying, market character varying, stay_date timestamp with time zone, nightly_rate numeric, trailing_avg_rate numeric, pct_above_trailing_avg numeric, is_available boolean)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
SELECT
property_id,
property_name,
market,
stay_date,
nightly_rate,
trailing_avg_rate,
pct_above_trailing_avg,
is_available
FROM public.v_rate_volatility
WHERE (property_id::TEXT = property_search OR LOWER(property_name) LIKE '%' || LOWER(property_search) || '%')
AND stay_date >= (NOW() - (days_param || ' days')::INTERVAL)
ORDER BY stay_date ASC;
$function$
|
| public | get_spike_alerts | threshold_param numeric, days_param integer | TABLE(property_id uuid, property_name character varying, market character varying, platform character varying, nightly_rate numeric, trailing_avg_rate numeric, pct_above_trailing_avg numeric, recorded_at timestamp with time zone) | true | CREATE OR REPLACE FUNCTION public.get_spike_alerts(threshold_param numeric DEFAULT 25.0, days_param integer DEFAULT 7)
RETURNS TABLE(property_id uuid, property_name character varying, market character varying, platform character varying, nightly_rate numeric, trailing_avg_rate numeric, pct_above_trailing_avg numeric, recorded_at timestamp with time zone)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
SELECT
property_id,
property_name,
market,
platform,
nightly_rate,
trailing_avg_rate,
pct_above_trailing_avg,
recorded_at
FROM public.v_rate_volatility
WHERE ABS(pct_above_trailing_avg) >= threshold_param
AND recorded_at >= (NOW() - (days_param || ' days')::INTERVAL)
ORDER BY recorded_at DESC;
$function$
|
| public | get_tracked_markets | p_platform text | TABLE(market character varying, active_properties bigint) | true | CREATE OR REPLACE FUNCTION public.get_tracked_markets(p_platform text DEFAULT NULL::text)
RETURNS TABLE(market character varying, active_properties bigint)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
SELECT p.market,
COUNT(DISTINCT p.id) AS active_properties
FROM public.properties p
WHERE p.is_active = true
AND (p_platform IS NULL OR LOWER(p.platform) = LOWER(p_platform))
AND p.market IS NOT NULL
GROUP BY p.market
ORDER BY active_properties DESC, market;
$function$
|
| public | match_re_methodology | query_embedding vector, match_threshold double precision, match_count integer | TABLE(id uuid, section_title character varying, chunk_content text, similarity double precision) | true | CREATE OR REPLACE FUNCTION public.match_re_methodology(query_embedding vector, match_threshold double precision DEFAULT 0.5, match_count integer DEFAULT 3)
RETURNS TABLE(id uuid, section_title character varying, chunk_content text, similarity double precision)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
SELECT
kb.id,
kb.section_title,
kb.chunk_content,
1 - (kb.embedding <=> query_embedding) AS similarity
FROM public.re_knowledge_base kb
WHERE 1 - (kb.embedding <=> query_embedding) > match_threshold
ORDER BY kb.embedding <=> query_embedding
LIMIT match_count;
$function$
|
| public | rls_auto_enable | | event_trigger | true | CREATE OR REPLACE FUNCTION public.rls_auto_enable()
RETURNS event_trigger
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path TO 'pg_catalog'
AS $function$
DECLARE
cmd record;
BEGIN
FOR cmd IN
SELECT *
FROM pg_event_trigger_ddl_commands()
WHERE command_tag IN ('CREATE TABLE', 'CREATE TABLE AS', 'SELECT INTO')
AND object_type IN ('table','partitioned table')
LOOP
IF cmd.schema_name IS NOT NULL AND cmd.schema_name IN ('public') AND cmd.schema_name NOT IN ('pg_catalog','information_schema') AND cmd.schema_name NOT LIKE 'pg_toast%' AND cmd.schema_name NOT LIKE 'pg_temp%' THEN
BEGIN
EXECUTE format('alter table if exists %s enable row level security', cmd.object_identity);
RAISE LOG 'rls_auto_enable: enabled RLS on %', cmd.object_identity;
EXCEPTION
WHEN OTHERS THEN
RAISE LOG 'rls_auto_enable: failed to enable RLS on %', cmd.object_identity;
END;
ELSE
RAISE LOG 'rls_auto_enable: skip % (either system schema or not in enforced list: %.)', cmd.object_identity, cmd.schema_name;
END IF;
END LOOP;
END;
$function$
|
| public | search_properties | p_search text, p_market text, p_platform text, p_bedrooms integer, p_available boolean, p_limit integer | TABLE(property_id uuid, property_name character varying, market character varying, platform character varying, bedrooms integer, avg_rating numeric, review_count integer, nightly_rate numeric, pct_above_trailing_avg numeric, is_available boolean, recorded_at timestamp with time zone) | true | CREATE OR REPLACE FUNCTION public.search_properties(p_search text DEFAULT NULL::text, p_market text DEFAULT NULL::text, p_platform text DEFAULT NULL::text, p_bedrooms integer DEFAULT NULL::integer, p_available boolean DEFAULT NULL::boolean, p_limit integer DEFAULT 50)
RETURNS TABLE(property_id uuid, property_name character varying, market character varying, platform character varying, bedrooms integer, avg_rating numeric, review_count integer, nightly_rate numeric, pct_above_trailing_avg numeric, is_available boolean, recorded_at timestamp with time zone)
LANGUAGE sql
STABLE SECURITY DEFINER
AS $function$
SELECT DISTINCT ON (rvv.property_id)
rvv.property_id,
rvv.property_name,
rvv.market,
rvv.platform,
rvv.bedrooms,
rvv.avg_rating,
rvv.review_count,
rvv.nightly_rate,
rvv.pct_above_trailing_avg,
rvv.is_available,
rvv.recorded_at
FROM public.v_rate_volatility rvv
WHERE
(p_market IS NULL OR LOWER(rvv.market) = LOWER(p_market))
AND (p_platform IS NULL OR LOWER(rvv.platform) = LOWER(p_platform))
AND (p_bedrooms IS NULL OR rvv.bedrooms = p_bedrooms)
AND (p_available IS NULL OR rvv.is_available = p_available)
AND (
p_search IS NULL
OR rvv.property_name ILIKE '%' || p_search || '%'
OR rvv.property_id::text = p_search
)
ORDER BY rvv.property_id, rvv.recorded_at DESC
LIMIT LEAST(GREATEST(p_limit, 1), 200);
$function$
|