Skip to content

Plano — Drop coluna olimpiadas.tipo_inscricao

Status: agendado Criado: 2026-05-07 Etapa C (remoção de espelhos): 2026-05-08 Etapa D (DROP COLUMN): 2026-05-09Owner: backend/olimpíadas

Contexto

A coluna escalar olimpiadas.tipo_inscricao foi substituída pelo array tipos_inscricao TEXT[] para suportar combinações ("Por Escola + Individual" etc.). O backfill já populou 39/39 olimpíadas e o contrato do coordenador (Etapa A) foi corrigido em 2026-05-07. Resta remover os espelhos legados e dropar a coluna.

Pré-requisitos / Gates

  • [x] Backfill tipos_inscricao populado (39/39).
  • [x] Etapa A — backend coord retorna tiposInscricao (coordenador-olimpiadas/index.ts linhas 139, 193, 325, 637).
  • [x] Etapa B — UI multi-select dropdown em tab-informacoes.tsx.
  • [ ] Janela 48h em produção sem incidente "Tipo de Inscrição" (até 2026-05-09).

Mapa dos espelhos legados (10 pontos + types auto-gerados)

Backend — escrita (espelho mandatório de remover ANTES do drop)

#ArquivoLinhaO que faz
1supabase/functions/_shared/olimpiada-helpers.ts515updateData.tipo_inscricao = enums[0] (ao criar)
2supabase/functions/_shared/olimpiada-helpers.ts519updateData.tipo_inscricao = tipoInscDb (ao atualizar)

Backend — leitura

#ArquivoLinhaO que faz
3supabase/functions/_shared/olimpiada-helpers.ts1344tipoInscricao: TIPO_INSCRICAO_MAP[olimpiada.tipo_inscricao] (especialista GET)
4supabase/functions/_shared/olimpiada-helpers.ts1347Fallback [TIPO_INSCRICAO_MAP[olimpiada.tipo_inscricao]]
5supabase/functions/coordenador-olimpiadas/index.ts139.select("... tipo_inscricao ...")
6supabase/functions/coordenador-olimpiadas/index.ts193, 325, 6373 retornos tipoInscricao (espelho)
7supabase/functions/especialista-olimpiadas/index.ts140Leitura tipoInscricao no list

Frontend — fallbacks

#ArquivoLinhasO que faz
8src/components/olimpiadas.tsx604–606, 793, 1505Fallbacks tipoInscricao || 'Individual'
9src/hooks/useOlimpiadasCoordenador.ts24, 77, 269, 272, 291, 294Campo no tipo + fallback
10src/hooks/useOlimpiadasData.ts + src/components/olimpiada-detalhes/{helpers.ts:20,160; types.ts:22; index.tsx:108,184,405; tab-informacoes.tsx}Estado/diff/payload com campo single

Tipos auto-gerados (regenera após drop)

  • src/integrations/supabase/types.ts:2845, 2870, 2895 — coluna tipo_inscricao.

Etapa C — Remover espelhos (2026-05-08)

  1. Backend escrita: remover linhas 515 e 519 de olimpiada-helpers.ts. Validar que payload sempre traz tiposInscricao (Zod).
  2. Backend leitura: remover todas as 5 referências (olimpiada-helpers.ts:1344,1347, coordenador-olimpiadas x4, especialista-olimpiadas:140). tipoInscricao (single) deixa de ser retornado.
  3. Frontend: remover campo tipoInscricao de types.ts, helpers.ts, index.tsx, tab-informacoes.tsx, useOlimpiadasData.ts, useOlimpiadasCoordenador.ts. Remover fallbacks || 'Individual' em olimpiadas.tsx (manter tiposInscricao.join(' + ')).
  4. Validação: rodar testes Deno (olimpiada-helpers.test.ts, navigation-guard, fases-niveis), build frontend, smoke E2E coord+especialista.

Etapa D — Drop da coluna (2026-05-09)

sql
-- Migration: 2026-05-09 drop_olimpiadas_tipo_inscricao
ALTER TABLE public.olimpiadas DROP COLUMN tipo_inscricao;

Pós-drop:

  • Aguardar regeneração automática de src/integrations/supabase/types.ts.
  • Confirmar logs de coordenador-olimpiadas e especialista-olimpiadas sem erros.

Rollback

Caso a Etapa C cause regressão antes do drop:

  • Reverter PR da Etapa C (espelhos voltam, coluna ainda existe → contrato single restaurado).

Caso o drop cause regressão (improvável após Etapa C estável):

  • Recriar coluna via migration + backfill UPDATE olimpiadas SET tipo_inscricao = tipos_inscricao[1].

Referências

  • docs/architecture/DATABASE_SCHEMA.md (linha 282 marcada DEPRECATED).
  • docs/development/TS_SANEAMENTO_BACKLOG.md (item 6).
  • mem://architecture/olympics-phases-by-level-standard.