Crawl técnico (HTTPS/robots/sitemap/on-page) + tabla seo_audits; UI con nota, checks y alertas. Co-authored-by: Cursor <cursoragent@cursor.com>
32 lines
1.0 KiB
SQL
32 lines
1.0 KiB
SQL
-- 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).
|