Le foto caricate in Profilo vivevano solo in localStorage: ogni giocatore vedeva la propria foto solo sul proprio dispositivo, mai quella dei compagni nella rosa (Squadra). Ora vengono caricate in un bucket pubblico dedicato (avatar-giocatori, migration m6) e il componente Avatar carica l'URL pubblico con fallback su numero/iniziali se assente o non ancora caricata. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
39 lines
1.8 KiB
SQL
39 lines
1.8 KiB
SQL
-- M6 — Bucket pubblico per le foto profilo dei giocatori (avatar).
|
|
--
|
|
-- Sostituisce l'attuale localStorage per-dispositivo (src/lib/avatar-store.ts):
|
|
-- senza un bucket condiviso ogni giocatore vedeva la propria foto solo sul
|
|
-- proprio telefono, mai quella dei compagni nella rosa (Squadra).
|
|
--
|
|
-- Bucket pubblico: sono foto profilo informali di una squadra amatoriale, non
|
|
-- documenti sensibili (quelli restano nel bucket privato profili-giocatore,
|
|
-- DD-016 regola 4). Segue il modello "chiunque autenticato può" già usato per
|
|
-- mvp_voti/eventi_app, non il modello per-proprietario di profili-giocatore:
|
|
-- la maggior parte dei giocatori non ha ancora auth_user_id collegato
|
|
-- (DD-018, oggi 2 su 17), quindi un controllo per-proprietario bloccherebbe
|
|
-- l'upload per quasi tutta la squadra. L'accesso all'app richiede comunque
|
|
-- login Google (DD-011, vedi src/routes/__root.tsx), quindi auth.uid() è
|
|
-- sempre valorizzato per chi usa davvero l'app.
|
|
--
|
|
-- Percorso file: '<giocatore_id>/avatar.jpg' (un solo file per giocatore,
|
|
-- sovrascritto a ogni caricamento).
|
|
|
|
INSERT INTO storage.buckets (id, name, public, file_size_limit, allowed_mime_types)
|
|
VALUES ('avatar-giocatori', 'avatar-giocatori', true, 2097152, ARRAY['image/jpeg']);
|
|
|
|
CREATE POLICY "Chiunque puo vedere gli avatar" ON storage.objects
|
|
FOR SELECT TO anon, authenticated
|
|
USING (bucket_id = 'avatar-giocatori');
|
|
|
|
CREATE POLICY "Gli autenticati caricano gli avatar" ON storage.objects
|
|
FOR INSERT TO authenticated
|
|
WITH CHECK (bucket_id = 'avatar-giocatori');
|
|
|
|
CREATE POLICY "Gli autenticati sostituiscono gli avatar" ON storage.objects
|
|
FOR UPDATE TO authenticated
|
|
USING (bucket_id = 'avatar-giocatori')
|
|
WITH CHECK (bucket_id = 'avatar-giocatori');
|
|
|
|
CREATE POLICY "Gli autenticati eliminano gli avatar" ON storage.objects
|
|
FOR DELETE TO authenticated
|
|
USING (bucket_id = 'avatar-giocatori');
|