Marketplace inversée (Next.js 16 App Router + Supabase Cloud) : auth, schéma + RLS, publication de besoins avec upload d'images, feed avec filtres, offres, acceptation via RPC, messagerie temps réel, dashboards, et Dockerfile pour déploiement Coolify.
34 lines
1.4 KiB
SQL
34 lines
1.4 KiB
SQL
-- Corrections suite au linter de sécurité Supabase (get_advisors) après 0002.
|
|
|
|
-- 1. Bucket public : pas besoin d'une policy SELECT (elle permet le listing
|
|
-- complet du bucket, superflu — l'URL publique fonctionne sans RLS).
|
|
drop policy if exists "need_images_bucket_read" on storage.objects;
|
|
|
|
-- 2. handle_new_user() ne doit être invocable que par le trigger, pas en RPC public.
|
|
revoke execute on function public.handle_new_user() from public, anon, authenticated;
|
|
|
|
-- 3. accept_offer() : anon n'a aucune raison de l'appeler (auth.uid() sera
|
|
-- toujours null pour lui, mais autant réduire la surface d'API exposée).
|
|
revoke execute on function public.accept_offer(uuid) from anon;
|
|
|
|
-- 4. offer-images : resserrer la lecture aux seuls participants (marchand
|
|
-- auteur de l'offre, ou auteur du besoin concerné) au lieu de "tout
|
|
-- utilisateur connecté".
|
|
drop policy if exists "offer_images_bucket_read" on storage.objects;
|
|
create policy "offer_images_bucket_read"
|
|
on storage.objects for select
|
|
to authenticated
|
|
using (
|
|
bucket_id = 'offer-images'
|
|
and exists (
|
|
select 1
|
|
from public.offer_images oi
|
|
join public.offers o on o.id = oi.offer_id
|
|
where oi.storage_path = storage.objects.name
|
|
and (
|
|
o.merchant_id = auth.uid()
|
|
or exists (select 1 from public.needs n where n.id = o.need_id and n.author_id = auth.uid())
|
|
)
|
|
)
|
|
);
|