| 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 |
|
|---|
| 9 | CREATE OR REPLACE FUNCTION trg_notify_new_follower()
|
|---|
| 10 | RETURNS TRIGGER AS $$
|
|---|
| 11 | DECLARE
|
|---|
| 12 | v_channel TEXT;
|
|---|
| 13 | v_payload JSON;
|
|---|
| 14 | BEGIN
|
|---|
| 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;
|
|---|
| 31 | END;
|
|---|
| 32 | $$ LANGUAGE plpgsql;
|
|---|
| 33 |
|
|---|
| 34 |
|
|---|
| 35 | DROP TRIGGER IF EXISTS notify_new_follower ON follows;
|
|---|
| 36 |
|
|---|
| 37 | CREATE TRIGGER notify_new_follower
|
|---|
| 38 | AFTER INSERT ON follows
|
|---|
| 39 | FOR EACH ROW
|
|---|
| 40 | EXECUTE FUNCTION trg_notify_new_follower();
|
|---|