diff --git a/ops/sql/SUPABASE-V17.6.1-CHAT-STORAGE-GUARD.sql b/ops/sql/SUPABASE-V17.6.1-CHAT-STORAGE-GUARD.sql new file mode 100644 index 0000000..052272f --- /dev/null +++ b/ops/sql/SUPABASE-V17.6.1-CHAT-STORAGE-GUARD.sql @@ -0,0 +1,45 @@ +-- Caterium v17.6.1: server memory counters for Developer Console +create or replace function public.sun_platform_dashboard() +returns jsonb +language plpgsql +stable +security definer +set search_path='public','auth' +as $$ +declare + v_companies bigint; v_accounts bigint; v_admins bigint; v_active bigint; v_trial bigint; + v_locked bigint; v_errors bigint; v_backups bigint; v_members bigint; + v_last_state timestamptz; v_last_backup timestamptz; + v_database_bytes bigint := 0; v_storage_bytes bigint := 0; v_storage_objects bigint := 0; + v_storage_buckets jsonb := '{}'::jsonb; +begin + perform public.sun_require_platform_admin_aal2(); + select count(*) into v_companies from public.sun_workspaces; + select count(*) into v_accounts from auth.users; + select count(*) into v_admins from public.sun_platform_admins; + select count(*) into v_members from public.sun_workspace_members where is_active=true; + select count(*) into v_active from public.sun_workspace_subscriptions where status='active' and coalesce(current_period_end,'infinity'::timestamptz)>now(); + select count(*) into v_trial from public.sun_workspace_subscriptions where status='trialing' and coalesce(trial_ends_at,'infinity'::timestamptz)>now(); + select count(*) into v_locked from public.sun_workspaces w where public.sun_subscription_access_mode(w.id) in ('read_only','blocked'); + select count(*) into v_errors from public.sun_v17_error_events where created_at>now()-interval '24 hours'; + select count(*) into v_backups from public.sun_v17_backups where created_at>now()-interval '24 hours'; + select max(updated_at) into v_last_state from public.sun_app_state; + select max(created_at) into v_last_backup from public.sun_v17_backups; + v_database_bytes := pg_database_size(current_database()); + select count(*), coalesce(sum(case when coalesce(metadata->>'size','') ~ '^[0-9]+$' then (metadata->>'size')::bigint else 0 end),0) + into v_storage_objects, v_storage_bytes from storage.objects; + select coalesce(jsonb_object_agg(bucket_id,jsonb_build_object('objects',object_count,'bytes',bucket_bytes,'size',pg_size_pretty(bucket_bytes))),'{}'::jsonb) + into v_storage_buckets + from (select bucket_id,count(*)::bigint as object_count,coalesce(sum(case when coalesce(metadata->>'size','') ~ '^[0-9]+$' then (metadata->>'size')::bigint else 0 end),0)::bigint as bucket_bytes from storage.objects group by bucket_id) s; + return jsonb_build_object( + 'companies',v_companies,'accounts',v_accounts,'platform_admins',v_admins,'memberships',v_members, + 'active_subscriptions',v_active,'trials',v_trial,'restricted_companies',v_locked, + 'errors_24h',v_errors,'backups_24h',v_backups,'last_state_at',v_last_state,'last_backup_at',v_last_backup, + 'database_bytes',v_database_bytes,'database_size',pg_size_pretty(v_database_bytes), + 'storage_bytes',v_storage_bytes,'storage_size',pg_size_pretty(v_storage_bytes),'storage_objects',v_storage_objects,'storage_buckets',v_storage_buckets, + 'server_bytes',v_database_bytes+v_storage_bytes,'server_size',pg_size_pretty(v_database_bytes+v_storage_bytes), + 'postgres_version',current_setting('server_version')); +end; +$$; +revoke all on function public.sun_platform_dashboard() from public, anon; +grant execute on function public.sun_platform_dashboard() to authenticated;