@@ -30,50 +30,46 @@ AS $$
3030DECLARE
3131 latest_message jsonb;
3232 ts_in_milliseconds bigint ;
33+ affected_room_id bigint ;
3334BEGIN
34- SELECT jsonb_build_object(
35- ' id' , id,
36- ' createdAt' , " createdAt" ,
37- ' metadata' , metadata,
38- ' duration' , duration,
39- ' mimeType' , " mimeType" ,
40- ' name' , name,
41- ' remoteId' , " remoteId" ,
42- ' repliedMessage' , " repliedMessage" ,
43- ' roomId' , " roomId" ,
44- ' showStatus' , " showStatus" ,
45- ' size' , size,
46- ' status' , status,
47- ' type' , type,
48- ' updatedAt' , " updatedAt" ,
49- ' uri' , uri,
50- ' waveForm' , " waveForm" ,
51- ' isLoading' , " isLoading" ,
52- ' height' , height,
53- ' width' , width,
54- ' previewData' , " previewData" ,
55- ' authorId' , " authorId" ,
56- ' text' , text
57- )
58- INTO latest_message
59- FROM chats .messages
60- WHERE " roomId" = NEW." roomId"
61- ORDER BY " createdAt" DESC
62- LIMIT 1 ;
63- IF latest_message IS DISTINCT FROM (SELECT " lastMessages" FROM chats .rooms WHERE id = NEW." roomId" ) THEN
64- SELECT EXTRACT(epoch FROM NOW()) * 1000 INTO ts_in_milliseconds;
65- UPDATE chats .rooms
66- SET " updatedAt" = ts_in_milliseconds,
67- " lastMessages" = jsonb_build_array(latest_message)
68- WHERE id = NEW." roomId" ;
69- END IF;
35+ IF TG_OP = ' DELETE' THEN
36+ affected_room_id := OLD." roomId" ;
37+ ELSE
38+ affected_room_id := NEW." roomId" ;
39+ END IF;
40+
41+ SELECT to_jsonb(m)
42+ INTO latest_message
43+ FROM chats .messages m
44+ WHERE m." roomId" = affected_room_id
45+ ORDER BY m." createdAt" DESC
46+ LIMIT 1 ;
47+
48+ IF latest_message IS DISTINCT FROM (
49+ SELECT value FROM jsonb_array_elements(
50+ (SELECT " lastMessages" FROM chats .rooms WHERE id = affected_room_id)
51+ ) LIMIT 1
52+ ) THEN
53+ SELECT EXTRACT(epoch FROM NOW()) * 1000 INTO ts_in_milliseconds;
54+
55+ UPDATE chats .rooms
56+ SET " updatedAt" = ts_in_milliseconds,
57+ " lastMessages" = jsonb_build_array(latest_message)
58+ WHERE id = affected_room_id;
59+ END IF;
60+
61+ IF TG_OP = ' DELETE' THEN
62+ RETURN OLD;
63+ ELSE
7064 RETURN NEW;
65+ END IF;
7166END;
7267$$ LANGUAGE plpgsql;
7368
69+
7470drop trigger if exists update_last_messages_trigger on chats .messages ;
7571CREATE TRIGGER update_last_messages_trigger
76- AFTER INSERT OR UPDATE ON chats .messages
72+ AFTER INSERT OR UPDATE OR DELETE ON chats .messages
7773 FOR EACH ROW
7874EXECUTE FUNCTION chats .update_last_messages ();
7975
0 commit comments