118 lines
2.5 KiB
SQL
118 lines
2.5 KiB
SQL
-- Storage policies for content bucket uploads used by:
|
|
-- - Admin branding owner avatar/logo/favicon
|
|
-- - Member profile avatar
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1
|
|
FROM pg_policies
|
|
WHERE schemaname = 'storage'
|
|
AND tablename = 'objects'
|
|
AND policyname = 'content_public_read'
|
|
) THEN
|
|
CREATE POLICY "content_public_read"
|
|
ON storage.objects
|
|
FOR SELECT
|
|
USING (bucket_id = 'content');
|
|
END IF;
|
|
END $$;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1
|
|
FROM pg_policies
|
|
WHERE schemaname = 'storage'
|
|
AND tablename = 'objects'
|
|
AND policyname = 'content_admin_manage'
|
|
) THEN
|
|
CREATE POLICY "content_admin_manage"
|
|
ON storage.objects
|
|
FOR ALL
|
|
USING (
|
|
bucket_id = 'content'
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM public.user_roles ur
|
|
WHERE ur.user_id = auth.uid()
|
|
AND ur.role = 'admin'
|
|
)
|
|
)
|
|
WITH CHECK (
|
|
bucket_id = 'content'
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM public.user_roles ur
|
|
WHERE ur.user_id = auth.uid()
|
|
AND ur.role = 'admin'
|
|
)
|
|
);
|
|
END IF;
|
|
END $$;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1
|
|
FROM pg_policies
|
|
WHERE schemaname = 'storage'
|
|
AND tablename = 'objects'
|
|
AND policyname = 'content_user_avatar_insert'
|
|
) THEN
|
|
CREATE POLICY "content_user_avatar_insert"
|
|
ON storage.objects
|
|
FOR INSERT
|
|
TO authenticated
|
|
WITH CHECK (
|
|
bucket_id = 'content'
|
|
AND name LIKE ('users/' || auth.uid()::text || '/%')
|
|
);
|
|
END IF;
|
|
END $$;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1
|
|
FROM pg_policies
|
|
WHERE schemaname = 'storage'
|
|
AND tablename = 'objects'
|
|
AND policyname = 'content_user_avatar_update'
|
|
) THEN
|
|
CREATE POLICY "content_user_avatar_update"
|
|
ON storage.objects
|
|
FOR UPDATE
|
|
TO authenticated
|
|
USING (
|
|
bucket_id = 'content'
|
|
AND name LIKE ('users/' || auth.uid()::text || '/%')
|
|
)
|
|
WITH CHECK (
|
|
bucket_id = 'content'
|
|
AND name LIKE ('users/' || auth.uid()::text || '/%')
|
|
);
|
|
END IF;
|
|
END $$;
|
|
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1
|
|
FROM pg_policies
|
|
WHERE schemaname = 'storage'
|
|
AND tablename = 'objects'
|
|
AND policyname = 'content_user_avatar_delete'
|
|
) THEN
|
|
CREATE POLICY "content_user_avatar_delete"
|
|
ON storage.objects
|
|
FOR DELETE
|
|
TO authenticated
|
|
USING (
|
|
bucket_id = 'content'
|
|
AND name LIKE ('users/' || auth.uid()::text || '/%')
|
|
);
|
|
END IF;
|
|
END $$;
|
|
|