Skip to content

Commit b499f99

Browse files
authored
fix(supabase): tolerate owner-mismatch on smtp_senders and whatsapp_sessions (#2838)
The QA DB has these tables pre-applied by a role that doesn't match the migration runner, so CREATE INDEX and CREATE POLICY fail with 'must be owner of table' before IF NOT EXISTS can even run. Wrap the owner-required DDL in DO blocks that catch insufficient_privilege and skip silently. Trade-off: when the runner isn't the owner, the index/policy may be missing on QA after the migration. Acceptable because whoever pre-applied the table should have created them too; on a fresh env the migration applies correctly. Verified locally against supabase_db_leadminer (PG 15.8): ran the fixed migration against a pre-applied state, DO blocks apply cleanly (duplicate_object) and would also catch insufficient_privilege on a non-superuser runner (local postgres is superuser so we can't perfectly simulate that, but the EXCEPTION condition matches the error from the failed QA run).
1 parent 7ba26c1 commit b499f99

2 files changed

Lines changed: 24 additions & 28 deletions

File tree

supabase/migrations/20260530120000_add_smtp_senders.sql

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,20 @@ CREATE TABLE IF NOT EXISTS private.smtp_senders (
1818
UNIQUE(user_id, email)
1919
);
2020

21-
CREATE INDEX IF NOT EXISTS idx_smtp_senders_user_id ON private.smtp_senders(user_id);
21+
-- CREATE INDEX / CREATE POLICY on an existing table require ownership.
22+
-- On QA the table may have been pre-applied by a role that doesn't match
23+
-- the migration runner, so these no-op cleanly when we lack privilege.
24+
DO $$
25+
BEGIN
26+
CREATE INDEX idx_smtp_senders_user_id ON private.smtp_senders(user_id);
27+
EXCEPTION WHEN insufficient_privilege OR duplicate_table THEN NULL;
28+
END $$;
2229

2330
ALTER TABLE private.smtp_senders ENABLE ROW LEVEL SECURITY;
2431

25-
DROP POLICY IF EXISTS "Users can manage own smtp_senders" ON private.smtp_senders;
26-
CREATE POLICY "Users can manage own smtp_senders"
27-
ON private.smtp_senders
28-
USING (auth.uid() = user_id)
29-
WITH CHECK (auth.uid() = user_id);
32+
DO $$
33+
BEGIN
34+
EXECUTE 'DROP POLICY IF EXISTS "Users can manage own smtp_senders" ON private.smtp_senders';
35+
EXECUTE 'CREATE POLICY "Users can manage own smtp_senders" ON private.smtp_senders USING (auth.uid() = user_id) WITH CHECK (auth.uid() = user_id)';
36+
EXCEPTION WHEN insufficient_privilege THEN NULL;
37+
END $$;

supabase/migrations/20260601000000_add_whatsapp_gateway.sql

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,33 +32,21 @@ CREATE TABLE IF NOT EXISTS private.whatsapp_sessions (
3232
);
3333

3434
-- Indexes
35-
CREATE INDEX IF NOT EXISTS idx_whatsapp_sessions_user_id ON private.whatsapp_sessions(user_id);
36-
CREATE INDEX IF NOT EXISTS idx_whatsapp_sessions_status ON private.whatsapp_sessions(status);
37-
CREATE INDEX IF NOT EXISTS idx_whatsapp_sessions_active ON private.whatsapp_sessions(is_active);
35+
-- CREATE INDEX / CREATE POLICY on an existing table require ownership.
36+
-- On QA the table may have been pre-applied by a role that doesn't match
37+
-- the migration runner, so these no-op cleanly when we lack privilege.
38+
DO $$ BEGIN CREATE INDEX idx_whatsapp_sessions_user_id ON private.whatsapp_sessions(user_id); EXCEPTION WHEN insufficient_privilege OR duplicate_table THEN NULL; END $$;
39+
DO $$ BEGIN CREATE INDEX idx_whatsapp_sessions_status ON private.whatsapp_sessions(status); EXCEPTION WHEN insufficient_privilege OR duplicate_table THEN NULL; END $$;
40+
DO $$ BEGIN CREATE INDEX idx_whatsapp_sessions_active ON private.whatsapp_sessions(is_active); EXCEPTION WHEN insufficient_privilege OR duplicate_table THEN NULL; END $$;
3841

3942
-- Enable RLS
4043
ALTER TABLE private.whatsapp_sessions ENABLE ROW LEVEL SECURITY;
4144

4245
-- RLS Policies for whatsapp_sessions
43-
DROP POLICY IF EXISTS "Users can view own whatsapp sessions" ON private.whatsapp_sessions;
44-
CREATE POLICY "Users can view own whatsapp sessions"
45-
ON private.whatsapp_sessions FOR SELECT
46-
USING (auth.uid() = user_id);
47-
48-
DROP POLICY IF EXISTS "Users can insert own whatsapp sessions" ON private.whatsapp_sessions;
49-
CREATE POLICY "Users can insert own whatsapp sessions"
50-
ON private.whatsapp_sessions FOR INSERT
51-
WITH CHECK (auth.uid() = user_id);
52-
53-
DROP POLICY IF EXISTS "Users can update own whatsapp sessions" ON private.whatsapp_sessions;
54-
CREATE POLICY "Users can update own whatsapp sessions"
55-
ON private.whatsapp_sessions FOR UPDATE
56-
USING (auth.uid() = user_id);
57-
58-
DROP POLICY IF EXISTS "Users can delete own whatsapp sessions" ON private.whatsapp_sessions;
59-
CREATE POLICY "Users can delete own whatsapp sessions"
60-
ON private.whatsapp_sessions FOR DELETE
61-
USING (auth.uid() = user_id);
46+
DO $$ BEGIN EXECUTE 'DROP POLICY IF EXISTS "Users can view own whatsapp sessions" ON private.whatsapp_sessions'; EXECUTE 'CREATE POLICY "Users can view own whatsapp sessions" ON private.whatsapp_sessions FOR SELECT USING (auth.uid() = user_id)'; EXCEPTION WHEN insufficient_privilege OR duplicate_object THEN NULL; END $$;
47+
DO $$ BEGIN EXECUTE 'DROP POLICY IF EXISTS "Users can insert own whatsapp sessions" ON private.whatsapp_sessions'; EXECUTE 'CREATE POLICY "Users can insert own whatsapp sessions" ON private.whatsapp_sessions FOR INSERT WITH CHECK (auth.uid() = user_id)'; EXCEPTION WHEN insufficient_privilege OR duplicate_object THEN NULL; END $$;
48+
DO $$ BEGIN EXECUTE 'DROP POLICY IF EXISTS "Users can update own whatsapp sessions" ON private.whatsapp_sessions'; EXECUTE 'CREATE POLICY "Users can update own whatsapp sessions" ON private.whatsapp_sessions FOR UPDATE USING (auth.uid() = user_id)'; EXCEPTION WHEN insufficient_privilege OR duplicate_object THEN NULL; END $$;
49+
DO $$ BEGIN EXECUTE 'DROP POLICY IF EXISTS "Users can delete own whatsapp sessions" ON private.whatsapp_sessions'; EXECUTE 'CREATE POLICY "Users can delete own whatsapp sessions" ON private.whatsapp_sessions FOR DELETE USING (auth.uid() = user_id)'; EXCEPTION WHEN insufficient_privilege OR duplicate_object THEN NULL; END $$;
6250

6351
-- Trigger to automatically update updated_at
6452
CREATE OR REPLACE FUNCTION private.update_whatsapp_session_updated_at()

0 commit comments

Comments
 (0)