foodsnap/supabase_introspection.sql

208 lines
5.6 KiB
SQL

-- ============================================================
-- FOODSNAP - SUPABASE FULL INTROSPECTION (SINGLE JSON OUTPUT)
-- Execute no SQL Editor do Supabase (Dashboard > SQL Editor)
-- Retorna TUDO em um único JSON
-- ============================================================
SELECT jsonb_build_object(
-- 1. TABLES & COLUMNS
'tables', (
SELECT jsonb_agg(jsonb_build_object(
'table', t.table_name,
'column', c.column_name,
'type', c.data_type,
'udt', c.udt_name,
'default', c.column_default,
'nullable', c.is_nullable
) ORDER BY t.table_name, c.ordinal_position)
FROM information_schema.tables t
JOIN information_schema.columns c
ON t.table_name = c.table_name AND t.table_schema = c.table_schema
WHERE t.table_schema = 'public' AND t.table_type = 'BASE TABLE'
),
-- 2. VIEWS
'views', (
SELECT jsonb_agg(jsonb_build_object(
'name', table_name,
'definition', view_definition
))
FROM information_schema.views
WHERE table_schema = 'public'
),
-- 3. FOREIGN KEYS
'foreign_keys', (
SELECT jsonb_agg(jsonb_build_object(
'table', tc.table_name,
'column', kcu.column_name,
'ref_table', ccu.table_name,
'ref_column', ccu.column_name,
'constraint', tc.constraint_name
))
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage ccu
ON ccu.constraint_name = tc.constraint_name AND ccu.table_schema = tc.table_schema
WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema = 'public'
),
-- 4. PRIMARY KEYS & UNIQUE
'primary_keys', (
SELECT jsonb_agg(jsonb_build_object(
'table', tc.table_name,
'constraint', tc.constraint_name,
'type', tc.constraint_type,
'column', kcu.column_name
))
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu
ON tc.constraint_name = kcu.constraint_name AND tc.table_schema = kcu.table_schema
WHERE tc.table_schema = 'public' AND tc.constraint_type IN ('PRIMARY KEY', 'UNIQUE')
),
-- 5. CHECK CONSTRAINTS
'check_constraints', (
SELECT jsonb_agg(jsonb_build_object(
'table', tc.table_name,
'constraint', tc.constraint_name,
'check', cc.check_clause
))
FROM information_schema.table_constraints tc
JOIN information_schema.check_constraints cc
ON tc.constraint_name = cc.constraint_name AND tc.constraint_schema = cc.constraint_schema
WHERE tc.table_schema = 'public' AND tc.constraint_type = 'CHECK'
),
-- 6. INDEXES
'indexes', (
SELECT jsonb_agg(jsonb_build_object(
'table', tablename,
'index', indexname,
'def', indexdef
))
FROM pg_indexes
WHERE schemaname = 'public'
),
-- 7. RLS POLICIES
'rls_policies', (
SELECT jsonb_agg(jsonb_build_object(
'table', tablename,
'policy', policyname,
'permissive', permissive,
'roles', roles,
'cmd', cmd,
'qual', qual,
'with_check', with_check
))
FROM pg_policies
WHERE schemaname = 'public'
),
-- 8. FUNCTIONS
'functions', (
SELECT jsonb_agg(jsonb_build_object(
'name', p.proname,
'args', pg_get_function_arguments(p.oid),
'returns', pg_get_function_result(p.oid),
'definition', pg_get_functiondef(p.oid)
))
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'public'
),
-- 9. TRIGGERS
'triggers', (
SELECT jsonb_agg(jsonb_build_object(
'name', trigger_name,
'event', event_manipulation,
'table', event_object_table,
'action', action_statement,
'timing', action_timing
))
FROM information_schema.triggers
WHERE trigger_schema = 'public'
),
-- 10. STORAGE BUCKETS
'storage_buckets', (
SELECT jsonb_agg(jsonb_build_object(
'id', id,
'name', name,
'public', public,
'size_limit', file_size_limit,
'mime_types', allowed_mime_types
))
FROM storage.buckets
),
-- 11. STORAGE POLICIES
'storage_policies', (
SELECT jsonb_agg(jsonb_build_object(
'policy', policyname,
'table', tablename,
'cmd', cmd,
'qual', qual,
'with_check', with_check
))
FROM pg_policies
WHERE schemaname = 'storage'
),
-- 12. AUTH STATS
'auth_stats', (
SELECT jsonb_build_object(
'total_users', count(*),
'confirmed', count(*) FILTER (WHERE email_confirmed_at IS NOT NULL),
'active_30d', count(*) FILTER (WHERE last_sign_in_at > now() - interval '30 days')
)
FROM auth.users
),
-- 13. ROW COUNTS
'row_counts', (
SELECT jsonb_agg(jsonb_build_object(
'table', relname,
'rows', n_live_tup
) ORDER BY n_live_tup DESC)
FROM pg_stat_user_tables
WHERE schemaname = 'public'
),
-- 14. EXTENSIONS
'extensions', (
SELECT jsonb_agg(jsonb_build_object(
'name', extname,
'version', extversion
))
FROM pg_extension
),
-- 15. REALTIME
'realtime_tables', (
SELECT jsonb_agg(jsonb_build_object(
'pub', pubname,
'schema', schemaname,
'table', tablename
))
FROM pg_publication_tables
WHERE pubname = 'supabase_realtime'
),
-- 16. ENUMS
'enums', (
SELECT jsonb_agg(jsonb_build_object(
'type', t.typname,
'value', e.enumlabel
))
FROM pg_type t
JOIN pg_enum e ON t.oid = e.enumtypid
JOIN pg_namespace n ON t.typnamespace = n.oid
WHERE n.nspname = 'public'
)
) AS full_introspection;