Refactor Supabase plugin to avoid upsert operations to play better with RLS policies #329
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The PostgREST upsert endpoint (used by the supabase-js
upsert
function) interacts weirdly with some RLS policies.Here's a simplified example of where things can go wrong:
I have a table
notes
with these columns:I have an RLS policy that looks like this:
if I do an upsert with this body:
The RLS policy will fail, presumably because the logic in PostgREST leads to an attempt to check that the request meets RLS policy for both create AND update. This request doesn't pass the create branch of the check, because there is no workspace_id provided in the request.
The postgres plugin handles updates fine, because in that case, we send the entire record when we call
upsert
. However, on soft-deletes, we only send theid
field and thedeleted
field, leading to this issue.The two possible solutions are sending the entire record on delete, or splitting out creates and updates.
This seemed the cleaner and less error-prone avenue.