🐛 Fix incorrect topic sending on internal srepl notify helper

This commit is contained in:
Andrey Antukh 2025-04-03 10:58:10 +02:00
parent 5d600c6715
commit 78919df886

View file

@ -210,99 +210,105 @@
The message can be a free text or a preconfigured one. The message can be a free text or a preconfigured one.
The destination can be: all, profile-id, team-id, or a coll of them." The destination can be: all, profile-id, team-id, or a coll of them."
[{:keys [::mbus/msgbus ::db/pool]} & {:keys [dest code message level] [& {:keys [dest code message level]
:or {code :generic level :info} :or {code :generic level :info}
:as params}] :as params}]
(when-not (contains? #{:success :error :info :warning} level) (when-not (contains? #{:success :error :info :warning} level)
(ex/raise :type :assertion (ex/raise :type :assertion
:code :incorrect-level :code :incorrect-level
:hint (str "level '" level "' not supported"))) :hint (str "level '" level "' not supported")))
(letfn [(send [dest] (let [{:keys [::mbus/msgbus ::db/pool]} main/system
(l/inf :hint "sending notification" :dest (str dest))
(let [message {:type :notification
:code code
:level level
:version (:full cf/version)
:subs-id dest
:message message}
message (->> (dissoc params :dest :code :message :level)
(merge message))]
(mbus/pub! msgbus
:topic (str dest)
:message message)))
(resolve-profile [email] send
(some-> (db/get* pool :profile {:email (str/lower email)} {:columns [:id]}) :id vector)) (fn [dest]
(l/inf :hint "sending notification" :dest (str dest))
(let [message {:type :notification
:code code
:level level
:version (:full cf/version)
:subs-id dest
:message message}
message (->> (dissoc params :dest :code :message :level)
(merge message))]
(mbus/pub! msgbus
:topic dest
:message message)))
(resolve-team [team-id] resolve-profile
(->> (db/query pool :team-profile-rel (fn [email]
{:team-id team-id} (some-> (db/get* pool :profile {:email (str/lower email)} {:columns [:id]}) :id vector))
{:columns [:profile-id]})
(map :profile-id)))
(resolve-dest [dest] resolve-team
(cond (fn [team-id]
(= :all dest) (->> (db/query pool :team-profile-rel
[uuid/zero] {:team-id team-id}
{:columns [:profile-id]})
(map :profile-id)))
(uuid? dest) resolve-dest
[dest] (fn resolve-dest [dest]
(cond
(= :all dest)
[uuid/zero]
(string? dest) (uuid? dest)
(some-> dest h/parse-uuid resolve-dest) [dest]
(nil? dest) (string? dest)
(resolve-dest uuid/zero) (some-> dest h/parse-uuid resolve-dest)
(map? dest) (nil? dest)
(sequence (comp [uuid/zero]
(map vec)
(mapcat resolve-dest))
dest)
(and (vector? dest) (map? dest)
(every? vector? dest)) (sequence (comp
(sequence (comp (map vec)
(map vec) (mapcat resolve-dest))
(mapcat resolve-dest)) dest)
dest)
(and (vector? dest) (and (vector? dest)
(keyword? (first dest))) (every? vector? dest))
(let [[op param] dest] (sequence (comp
(map vec)
(mapcat resolve-dest))
dest)
(and (vector? dest)
(keyword? (first dest)))
(let [[op param] dest]
(cond
(= op :email)
(cond (cond
(= op :email) (and (coll? param)
(cond (every? string? param))
(and (coll? param) (sequence (comp
(every? string? param)) (keep resolve-profile)
(sequence (comp (mapcat identity))
(keep resolve-profile) param)
(mapcat identity))
param)
(string? param) (string? param)
(resolve-profile param)) (resolve-profile param))
(= op :team-id) (= op :team-id)
(cond (cond
(coll? param) (coll? param)
(sequence (comp (sequence (comp
(mapcat resolve-team) (mapcat resolve-team)
(keep h/parse-uuid)) (keep h/parse-uuid))
param) param)
(uuid? param) (uuid? param)
(resolve-team param) (resolve-team param)
(string? param) (string? param)
(some-> param h/parse-uuid resolve-team)) (some-> param h/parse-uuid resolve-team))
(= op :profile-id) (= op :profile-id)
(if (coll? param) (if (coll? param)
(sequence (keep h/parse-uuid) param) (sequence (keep h/parse-uuid) param)
(resolve-dest param))))))] (resolve-dest param))))))]
(->> (resolve-dest dest) (->> (resolve-dest dest)
(filter some?) (filter some?)