-- Your SQL goes here
CREATE TABLE actors (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    actor_id TEXT UNIQUE NOT NULL,
    public_key TEXT NOT NULL,
    public_key_id TEXT UNIQUE NOT NULL,
    listener_id UUID NOT NULL REFERENCES listeners(id) ON DELETE CASCADE,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);

SELECT diesel_manage_updated_at('actors');

CREATE OR REPLACE FUNCTION invoke_actors_trigger ()
    RETURNS TRIGGER
    LANGUAGE plpgsql
AS $$
DECLARE
    rec RECORD;
    channel TEXT;
    payload TEXT;
BEGIN
    case TG_OP
    WHEN 'INSERT' THEN
        rec := NEW;
        channel := 'new_actors';
        payload := NEW.actor_id;
    WHEN 'UPDATE' THEN
        rec := NEW;
        channel := 'new_actors';
        payload := NEW.actor_id;
    WHEN 'DELETE' THEN
        rec := OLD;
        channel := 'rm_actors';
        payload := OLD.actor_id;
    ELSE
        RAISE EXCEPTION 'Unknown TG_OP: "%". Should not occur!', TG_OP;
    END CASE;

    PERFORM pg_notify(channel, payload::TEXT);
    RETURN rec;
END;
$$;

CREATE TRIGGER actors_notify
    AFTER INSERT OR UPDATE OR DELETE
    ON actors
FOR EACH ROW
    EXECUTE PROCEDURE invoke_actors_trigger();