Merge pull request #2 from ivancacciari1995-a11y/fix/migration-history-cleanup

Clean up superseded profile migrations
This commit is contained in:
ivancacciari1995-a11y
2026-08-31 17:26:36 +02:00
committed by GitHub
3 changed files with 135 additions and 0 deletions
@@ -0,0 +1,135 @@
-- Correzione schema profili_giocatore (post 20260830123000)
--
-- Prerequisito: la migration 20260830123000 deve essere già applicata (schema doc_*,
-- enum doc_identita_tipo, funzione mio_giocatore_id, policy inglesi).
-- Porta il database allo schema atteso dal codice di develop (20260830120000 + 20100).
-- Non modifica giocatori_squadra né le tabelle v1.0.
-- Supabase avvolge ogni migration in una transazione: non serve BEGIN/COMMIT esplicito
-- (inserirli nel file può interferire con db push).
-- ── 1. Policy tabella: rimuovi quelle che dipendono da mio_giocatore_id() ───
DROP POLICY "Players can view own profile" ON public.profili_giocatore;
DROP POLICY "Players can insert own profile" ON public.profili_giocatore;
DROP POLICY "Players can update own profile" ON public.profili_giocatore;
-- Policy admin separata: va sostituita dal modello Davide (FOR ALL).
DROP POLICY "Admins can delete profiles" ON public.profili_giocatore;
-- ── 2. Policy Storage: tutte usano mio_giocatore_id() ──────────────────────
DROP POLICY "Players can read own profile files" ON storage.objects;
DROP POLICY "Players can upload own profile files" ON storage.objects;
DROP POLICY "Players can overwrite own profile files" ON storage.objects;
DROP POLICY "Players can delete own profile files" ON storage.objects;
-- ── 3. Trigger e funzione PK enforcement (assenti nello schema Davide) ─────
DROP TRIGGER enforce_profili_giocatore_pk ON public.profili_giocatore;
DROP FUNCTION public.enforce_profili_giocatore_pk();
-- ── 4. Vincolo sulle date documento (prima delle rinomine di colonna) ────────
ALTER TABLE public.profili_giocatore
DROP CONSTRAINT profilo_date_doc_valide;
-- ── 5. doc_tipo enum → documento_tipo text (valori UI del codice) ──────────
ALTER TABLE public.profili_giocatore
ALTER COLUMN doc_tipo TYPE text
USING (
CASE doc_tipo::text
WHEN 'carta_identita' THEN 'Carta d''identità'
WHEN 'patente' THEN 'Patente'
WHEN 'passaporto' THEN 'Passaporto'
ELSE doc_tipo::text
END
);
ALTER TABLE public.profili_giocatore
RENAME COLUMN doc_tipo TO documento_tipo;
-- ── 6. Rinomina colonne allo schema atteso da profili-core.ts ───────────────
ALTER TABLE public.profili_giocatore RENAME COLUMN doc_numero TO documento_numero;
ALTER TABLE public.profili_giocatore RENAME COLUMN doc_rilasciato_da TO documento_rilasciato_da;
ALTER TABLE public.profili_giocatore RENAME COLUMN doc_data_emissione TO documento_emissione;
ALTER TABLE public.profili_giocatore RENAME COLUMN doc_data_scadenza TO documento_scadenza;
ALTER TABLE public.profili_giocatore RENAME COLUMN doc_fronte_path TO documento_fronte_path;
ALTER TABLE public.profili_giocatore RENAME COLUMN doc_retro_path TO documento_retro_path;
ALTER TABLE public.profili_giocatore RENAME COLUMN cert_scadenza TO certificato_scadenza;
ALTER TABLE public.profili_giocatore RENAME COLUMN cert_file_path TO certificato_path;
ALTER TABLE public.profili_giocatore RENAME COLUMN foto_tessera_path TO foto_path;
-- ── 7. Colonna non usata dal codice ─────────────────────────────────────────
ALTER TABLE public.profili_giocatore DROP COLUMN avatar_path;
-- ── 8. Oggetti della migration 123000 non più necessari ─────────────────────
DROP FUNCTION public.mio_giocatore_id();
DROP TYPE public.doc_identita_tipo;
COMMENT ON TABLE public.profili_giocatore IS
'Dati personali, documento e certificato di ciascun giocatore, 1:1 con giocatori_squadra. Vedi DD-016.';
-- ── 9. RLS tabella (modello Davide, DD-017) ─────────────────────────────────
CREATE POLICY "Il giocatore legge il proprio profilo" ON public.profili_giocatore
FOR SELECT TO authenticated
USING (
EXISTS (
SELECT 1 FROM public.giocatori_squadra g
WHERE g.id = giocatore_id AND g.auth_user_id = auth.uid()
)
);
CREATE POLICY "Il giocatore crea il proprio profilo" ON public.profili_giocatore
FOR INSERT TO authenticated
WITH CHECK (
EXISTS (
SELECT 1 FROM public.giocatori_squadra g
WHERE g.id = giocatore_id AND g.auth_user_id = auth.uid()
)
);
CREATE POLICY "Il giocatore aggiorna il proprio profilo" ON public.profili_giocatore
FOR UPDATE TO authenticated
USING (
EXISTS (
SELECT 1 FROM public.giocatori_squadra g
WHERE g.id = giocatore_id AND g.auth_user_id = auth.uid()
)
)
WITH CHECK (
EXISTS (
SELECT 1 FROM public.giocatori_squadra g
WHERE g.id = giocatore_id AND g.auth_user_id = auth.uid()
)
);
CREATE POLICY "Gli admin gestiscono tutti i profili" ON public.profili_giocatore
FOR ALL TO authenticated
USING (public.has_role(auth.uid(), 'admin'::public.app_role))
WITH CHECK (public.has_role(auth.uid(), 'admin'::public.app_role));
-- ── 10. Policy Storage (DD-017: admin solo lettura) ─────────────────────────
CREATE POLICY "Il giocatore gestisce i propri file" ON storage.objects
FOR ALL TO authenticated
USING (
bucket_id = 'profili-giocatore'
AND EXISTS (
SELECT 1 FROM public.giocatori_squadra g
WHERE g.id = (storage.foldername(name))[1] AND g.auth_user_id = auth.uid()
)
)
WITH CHECK (
bucket_id = 'profili-giocatore'
AND EXISTS (
SELECT 1 FROM public.giocatori_squadra g
WHERE g.id = (storage.foldername(name))[1] AND g.auth_user_id = auth.uid()
)
);
CREATE POLICY "Gli admin scaricano tutti i file dei profili" ON storage.objects
FOR SELECT TO authenticated
USING (
bucket_id = 'profili-giocatore'
AND public.has_role(auth.uid(), 'admin'::public.app_role)
);
-- ── 11. Bucket: resta privato; limiti MIME/dimensione invariati ─────────────
UPDATE storage.buckets
SET public = false
WHERE id = 'profili-giocatore';