|
| 1 | +-- Add columns to support message actions |
| 2 | +ALTER TABLE private_user_messages |
| 3 | +ADD COLUMN IF NOT EXISTS is_edited BOOLEAN DEFAULT FALSE, |
| 4 | +ADD COLUMN IF NOT EXISTS reactions JSONB DEFAULT '{}'::jsonb, |
| 5 | +ADD COLUMN IF NOT EXISTS deleted BOOLEAN DEFAULT FALSE, |
| 6 | +ADD COLUMN IF NOT EXISTS edited_at TIMESTAMPTZ; |
| 7 | + |
| 8 | +-- Create a function to update edited_at timestamp |
| 9 | +-- CREATE OR REPLACE FUNCTION update_edited_at() |
| 10 | +-- RETURNS TRIGGER AS $$ |
| 11 | +-- BEGIN |
| 12 | +-- IF NEW.content <> OLD.content THEN |
| 13 | +-- NEW.is_edited := TRUE; |
| 14 | +-- NEW.edited_at := NOW(); |
| 15 | +-- END IF; |
| 16 | +-- RETURN NEW; |
| 17 | +-- END; |
| 18 | +-- $$ LANGUAGE plpgsql; |
| 19 | +-- |
| 20 | +-- -- Create a trigger to update edited_at when content changes |
| 21 | +-- DROP TRIGGER IF EXISTS update_private_message_edited_at ON private_user_messages; |
| 22 | +-- CREATE TRIGGER update_private_message_edited_at |
| 23 | +-- BEFORE UPDATE ON private_user_messages |
| 24 | +-- FOR EACH ROW |
| 25 | +-- WHEN (OLD.content IS DISTINCT FROM NEW.content) |
| 26 | +-- EXECUTE FUNCTION update_edited_at(); |
| 27 | + |
| 28 | +-- Update RLS policies to allow message owners to update their messages |
| 29 | +-- DROP POLICY IF EXISTS "private message update" ON private_user_messages; |
| 30 | +-- CREATE POLICY "private message update" ON private_user_messages |
| 31 | +-- FOR UPDATE USING ( |
| 32 | +-- user_id = firebase_uid() |
| 33 | +-- AND created_time > NOW() - INTERVAL '1 day' -- Only allow editing for 24 hours |
| 34 | +-- AND deleted = FALSE |
| 35 | +-- ); |
| 36 | + |
| 37 | +-- Add policy for soft delete |
| 38 | +-- DROP POLICY IF EXISTS "private message delete" ON private_user_messages; |
| 39 | +-- CREATE POLICY "private message delete" ON private_user_messages |
| 40 | +-- FOR UPDATE USING ( |
| 41 | +-- user_id = firebase_uid() |
| 42 | +-- ); |
| 43 | + |
| 44 | +-- Add policy for reactions |
| 45 | +-- DROP POLICY IF EXISTS "private message react" ON private_user_messages; |
| 46 | +-- CREATE POLICY "private message react" ON private_user_messages |
| 47 | +-- FOR UPDATE USING ( |
| 48 | +-- EXISTS ( |
| 49 | +-- SELECT 1 |
| 50 | +-- FROM private_user_message_channels ch |
| 51 | +-- JOIN private_user_message_channel_members m ON ch.id = m.channel_id |
| 52 | +-- WHERE m.user_id = firebase_uid() |
| 53 | +-- AND ch.id = private_user_messages.channel_id |
| 54 | +-- ) |
| 55 | +-- ); |
0 commit comments