Files
accounted/supabase/migrations/20260807090000_mail_connections.sql
T
MattssonandClaude Fable 5 6458180bf5 fix(db): reconcile orphaned mail-hunt migrations applied to prod (#1447)
* fix(db): reconcile orphaned mail-hunt migrations applied to prod

Prod carries 20260807090000_mail_connections and
20260807090100_inbox_mail_hunt_source (applied 2026-08-07 morning) with
no files in supabase/migrations/, so the Supabase integration fails
every push to main with "Remote migration versions not found in local
migrations directory". This commits the byte-identical SQL recovered
from prod's supabase_migrations.schema_migrations statements under the
exact applied versions. No new DDL runs on prod: the versions already
exist there, this only reconciles the repo.

Also classifies mail_connections in full-archive-export.ts (excluded:
live OAuth refresh tokens, not portable), which the archive-completeness
test requires for any new company_id table.

Whoever owns the mail-hunt feature branch: these files now exist on
main; reuse them as-is instead of re-creating the versions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(db): annotate reconciled mail_connections migration as pg-test skip

The file is a byte-recovered reconciliation of DDL already applied to
prod; it never executes again, so pg-real coverage belongs to the
mail-hunt feature branch that owns the schema.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 11:45:11 +02:00

47 lines
2.0 KiB
SQL

-- pg-test: skip (reconciliation only: this DDL was already applied to prod
-- out-of-band on 2026-08-07 and recovered byte-identical from
-- supabase_migrations.schema_migrations; the file exists so Supabase
-- branching stops failing on the orphaned version and will never re-run.
-- The mail-hunt feature branch that owns this schema must ship the real
-- pg-real coverage for the trigger and RLS.)
CREATE TABLE IF NOT EXISTS public.mail_connections (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
company_id uuid NOT NULL REFERENCES public.companies(id) ON DELETE CASCADE,
provider text NOT NULL CHECK (provider IN ('gmail', 'microsoft')),
email_address text NOT NULL,
connected_by uuid REFERENCES auth.users(id) ON DELETE SET NULL,
encrypted_refresh_token text NOT NULL,
encrypted_access_token text,
access_token_expires_at timestamptz,
scopes text[] NOT NULL DEFAULT '{}',
scope_label text,
backfill_from date,
backfill_completed_at timestamptz,
status text NOT NULL DEFAULT 'active'
CHECK (status IN ('active', 'needs_reconsent', 'revoked')),
last_error_code text,
last_error_at timestamptz,
last_searched_at timestamptz,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_mail_connections_identity
ON public.mail_connections (company_id, provider, email_address);
CREATE INDEX IF NOT EXISTS idx_mail_connections_company_active
ON public.mail_connections (company_id)
WHERE status = 'active';
ALTER TABLE public.mail_connections ENABLE ROW LEVEL SECURITY;
DROP TRIGGER IF EXISTS mail_connections_updated_at ON public.mail_connections;
CREATE TRIGGER mail_connections_updated_at
BEFORE UPDATE ON public.mail_connections
FOR EACH ROW EXECUTE FUNCTION public.update_updated_at_column();
COMMENT ON TABLE public.mail_connections IS
'Read-only mailbox grants for receipt hunting. Service-role only: rows carry live refresh tokens.';
NOTIFY pgrst, 'reload schema';