AdvancedTopics: pubsub.sql

File pubsub.sql, 1.2 KB (added by 231136, 5 days ago)
Line 
1-- напредна тема 2: pub/sub преку Postgres LISTEN/NOTIFY
2-- испраќаме нотификација на персонален канал кога корисник добива нов следбеник
3
4
5-- тригер функција: при INSERT во follows се прави JSON payload
6-- со податоци за follower-от (преку join со users) и испраќа на каналот
7-- follows_user_<followed_user_id>
8
9CREATE OR REPLACE FUNCTION trg_notify_new_follower()
10 RETURNS TRIGGER AS $$
11DECLARE
12 v_channel TEXT;
13 v_payload JSON;
14BEGIN
15 v_channel := 'follows_user_' || NEW.followed_user_id;
16
17 SELECT json_build_object(
18 'follower_id', u.id,
19 'follower_username', u.username,
20 'follower_full_name', u.full_name,
21 'followed_id', NEW.followed_user_id,
22 'followed_at', NEW.followed_at
23 )
24 INTO v_payload
25 FROM Users u
26 WHERE u.id = NEW.follower_user_id;
27
28 PERFORM pg_notify(v_channel, v_payload::text);
29
30 RETURN NEW;
31END;
32$$ LANGUAGE plpgsql;
33
34
35DROP TRIGGER IF EXISTS notify_new_follower ON follows;
36
37CREATE TRIGGER notify_new_follower
38 AFTER INSERT ON follows
39 FOR EACH ROW
40EXECUTE FUNCTION trg_notify_new_follower();