feat: auditoría SEO real con histórico y avisos

Crawl técnico (HTTPS/robots/sitemap/on-page) + tabla seo_audits; UI con nota, checks y alertas.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
4Ventures
2026-09-24 16:55:58 +02:00
parent d896041bed
commit 06024cf473
6 changed files with 1008 additions and 67 deletions

31
sql/seo_audits.sql Normal file
View File

@@ -0,0 +1,31 @@
-- SEO site audit history (technical checks + score)
-- Idempotent.
create table if not exists public.seo_audits (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null references public.tenants(id) on delete cascade,
site_url text not null,
score numeric not null default 0,
grade text not null default 'F',
warning_count integer not null default 0,
critical_count integer not null default 0,
checks jsonb not null default '[]'::jsonb,
summary text,
created_at timestamptz not null default now()
);
create index if not exists seo_audits_tenant_created_idx
on public.seo_audits (tenant_id, created_at desc);
alter table public.seo_audits enable row level security;
drop policy if exists seo_audits_tenant_select on public.seo_audits;
create policy seo_audits_tenant_select on public.seo_audits
for select using (
tenant_id::text = coalesce(
auth.jwt() -> 'app_metadata' ->> 'tenant_id',
auth.jwt() -> 'user_metadata' ->> 'tenant_id'
)
);
-- Agency writes via service role (bypasses RLS).