From 8abdd77fb4869ffd391fb4f8e46cddfff11822af Mon Sep 17 00:00:00 2001 From: Dmitry Novotochinov Date: Tue, 6 Feb 2018 12:57:19 +0300 Subject: [PATCH] [refs #3210] Replace realm reads for chats with app-db reads Signed-off-by: Andrey Shovkoplyas --- src/status_im/chat/handlers.cljs | 50 ++++++------- src/status_im/chat/models.cljs | 5 ++ src/status_im/data_store/chats.cljs | 18 ----- src/status_im/data_store/realm/chats.cljs | 7 -- src/status_im/protocol/handlers.cljs | 88 ++++++++++------------- 5 files changed, 69 insertions(+), 99 deletions(-) diff --git a/src/status_im/chat/handlers.cljs b/src/status_im/chat/handlers.cljs index e610bbc957..ddeeae2ac4 100644 --- a/src/status_im/chat/handlers.cljs +++ b/src/status_im/chat/handlers.cljs @@ -3,8 +3,8 @@ [clojure.string :as string] [status-im.ui.components.styles :refer [default-chat-color]] [status-im.chat.constants :as chat-consts] + [status-im.chat.models :as chat] [status-im.protocol.core :as protocol] - [status-im.data-store.chats :as chats] [status-im.data-store.messages :as messages] [status-im.constants :refer [text-content-type content-type-command @@ -39,23 +39,22 @@ (fn [{:keys [current-public-key web3 chats]} [_ {:keys [from] {:keys [group-id keypair timestamp]} :payload}]] - (let [{:keys [private public]} keypair] - (let [is-active (chats/is-active? group-id) - chat {:chat-id group-id - :public-key public - :private-key private - :updated-at timestamp}] - (when (and (= from (get-in chats [group-id :group-admin])) - (or (not (chats/exists? group-id)) - (chats/new-update? timestamp group-id))) - (dispatch [:update-chat! chat]) - (when is-active - (protocol/start-watching-group! - {:web3 web3 - :group-id group-id - :identity current-public-key - :keypair keypair - :callback #(dispatch [:incoming-message %1 %2])})))))))) + (let [{:keys [private public]} keypair + {:keys [group-admin is-active] :as chat} (get chats group-id)] + (when (and (= from group-admin) + (or (nil? chat) + (chat/new-update? chat timestamp))) + (dispatch [:update-chat! {:chat-id group-id + :public-key public + :private-key private + :updated-at timestamp}]) + (when is-active + (protocol/start-watching-group! + {:web3 web3 + :group-id group-id + :identity current-public-key + :keypair keypair + :callback #(dispatch [:incoming-message %1 %2])}))))))) (reg-fx ::start-watching-group @@ -162,7 +161,8 @@ (let [contacts' (keep (fn [ident] (when (not= ident current-public-key) {:identity ident})) contacts) - chat {:chat-id group-id + chat (get-in db [:chats group-id]) + new-chat {:chat-id group-id :name group-name :group-chat true :group-admin from @@ -171,15 +171,15 @@ :contacts contacts' :added-to-at timestamp :timestamp timestamp - :is-active true} - exists? (chats/exists? group-id)] - (when (or (not exists?) (chats/new-update? timestamp group-id)) + :is-active true}] + (when (or (nil? chat) + (chat/new-update? chat timestamp)) {::start-watching-group (merge {:group-id group-id :keypair keypair} (select-keys db [:web3 :current-public-key])) - :dispatch (if exists? - [:update-chat! chat] - [:add-chat group-id chat])}))))) + :dispatch (if chat + [:update-chat! new-chat] + [:add-chat group-id new-chat])}))))) (register-handler-fx :show-profile diff --git a/src/status_im/chat/models.cljs b/src/status_im/chat/models.cljs index f2d994f2a5..e1021a9595 100644 --- a/src/status_im/chat/models.cljs +++ b/src/status_im/chat/models.cljs @@ -59,3 +59,8 @@ "Just like `update-chat` only implicitely updates timestamp" [cofx chat] (update-chat cofx (assoc chat :timestamp (:now cofx)))) + +(defn new-update? [{:keys [added-to-at removed-at removed-from-at]} timestamp] + (and (> timestamp added-to-at) + (> timestamp removed-at) + (> timestamp removed-from-at))) diff --git a/src/status_im/data_store/chats.cljs b/src/status_im/data_store/chats.cljs index 90605e0a44..f98cb58cd6 100644 --- a/src/status_im/data_store/chats.cljs +++ b/src/status_im/data_store/chats.cljs @@ -34,10 +34,6 @@ [chat-id] (data-store/get-contacts chat-id)) -(defn has-contact? - [chat-id identity] - (data-store/has-contact? chat-id identity)) - (defn add-contacts [chat-id identities] (data-store/add-contacts chat-id identities)) @@ -54,10 +50,6 @@ [chat-id property-name] (data-store/get-property chat-id property-name)) -(defn is-active? - [chat-id] - (get-property chat-id :is-active)) - (defn removed-at [chat-id] (get-property chat-id :removed-at)) @@ -69,13 +61,3 @@ (defn set-active [chat-id active?] (save-property chat-id :is-active active?)) - -(defn new-update? - [timestamp chat-id] - (let - [{:keys [added-to-at removed-at removed-from-at added-at]} - (get-by-id chat-id)] - (and (> timestamp added-to-at) - (> timestamp removed-at) - (> timestamp removed-from-at) - (> timestamp added-at)))) diff --git a/src/status_im/data_store/realm/chats.cljs b/src/status_im/data_store/realm/chats.cljs index b36512c70f..beae90cfda 100644 --- a/src/status_im/data_store/realm/chats.cljs +++ b/src/status_im/data_store/realm/chats.cljs @@ -84,13 +84,6 @@ (realm/get-one-by-field :chat :chat-id chat-id) (object/get "contacts"))) -(defn has-contact? - [chat-id identity] - (let [contacts (get-contacts chat-id) - contact (.find contacts (fn [object _ _] - (= identity (object/get object "identity"))))] - (if contact true false))) - (defn- save-contacts [identities contacts added-at] (doseq [contact-identity identities] diff --git a/src/status_im/protocol/handlers.cljs b/src/status_im/protocol/handlers.cljs index a4208da407..b4bbb85f13 100644 --- a/src/status_im/protocol/handlers.cljs +++ b/src/status_im/protocol/handlers.cljs @@ -15,6 +15,7 @@ [status-im.protocol.message-cache :as cache] [status-im.protocol.listeners :as listeners] [status-im.chat.models.message :as models.message] + [status-im.chat.models :as chat] [status-im.protocol.web3.inbox :as inbox] [status-im.protocol.web3.keys :as web3.keys] [status-im.utils.datetime :as datetime] @@ -47,26 +48,6 @@ (let [[{{:keys [message-id]} :payload}] (:event coeffects)] (assoc coeffects :message-by-id (messages/get-by-id message-id))))) -(re-frame/reg-cofx - ::chats-new-update? - (fn [coeffects _] - (let [[{{:keys [group-id timestamp]} :payload}] (:event coeffects)] - (assoc coeffects :new-update? (chats/new-update? timestamp group-id))))) - -(re-frame/reg-cofx - ::chats-is-active-and-timestamp - (fn [coeffects _] - (let [[{{:keys [group-id timestamp]} :payload}] (:event coeffects)] - (assoc coeffects :chats-is-active-and-timestamp - (and (chats/is-active? group-id) - (> timestamp (chats/get-property group-id :timestamp))))))) - -(re-frame/reg-cofx - ::has-contact? - (fn [coeffects _] - (let [[{{:keys [group-id identity]} :payload}] (:event coeffects)] - (assoc coeffects :has-contact? (chats/has-contact? group-id identity))))) - ;;;; FX @@ -548,37 +529,44 @@ ;;GROUP +(defn- has-contact? [{:keys [contacts]} identity] + (let [identities (set (map :identity contacts))] + (contains? identities identity))) + (handlers/register-handler-fx :participant-invited-to-group - [re-frame/trim-v - (re-frame/inject-cofx ::has-contact?)] - (fn [{{:keys [current-public-key chats] :as db} :db has-contact? :has-contact?} + [re-frame/trim-v] + (fn [{{:keys [current-public-key chats] :as db} :db} [{:keys [from] {:keys [group-id identity message-id timestamp]} :payload}]] - (let [admin (get-in chats [group-id :group-admin])] + (let [chat (get-in db [:chats group-id]) + admin (:group-admin chats)] (when (= from admin) (merge {::participant-invited-to-group-message {:group-id group-id :current-public-key current-public-key :identity identity :from from :message-id message-id :timestamp timestamp}} - (when-not (and (= current-public-key identity) has-contact?) + (when-not (and (= current-public-key identity) (has-contact? chat identity)) {:db (update-in db [:chats group-id :contacts] conj {:identity identity}) ::chats-add-contact [group-id identity]})))))) (handlers/register-handler-fx ::you-removed-from-group - [re-frame/trim-v - (re-frame/inject-cofx ::chats-new-update?)] - (fn [{{:keys [web3]} :db new-update? :new-update?} + [re-frame/trim-v] + (fn [{{:keys [web3] :as db} :db} [{:keys [from] {:keys [group-id timestamp message-id] :as payload} :payload}]] - (when new-update? - {::you-removed-from-group-message {:from from :message-id message-id :timestamp timestamp - :group-id group-id} - ::stop-watching-group! {:web3 web3 - :group-id group-id} - :dispatch [:update-chat! {:chat-id group-id - :removed-from-at timestamp - :is-active false}]}))) + (let [chat (get-in db [:chats group-id]) + new-update? (chat/new-update? chat timestamp)] + (when new-update? + {::you-removed-from-group-message {:from from + :message-id message-id + :timestamp timestamp + :group-id group-id} + ::stop-watching-group! {:web3 web3 + :group-id group-id} + :dispatch [:update-chat! {:chat-id group-id + :removed-from-at timestamp + :is-active false}]})))) (handlers/register-handler-fx :participant-removed-from-group @@ -599,21 +587,23 @@ (handlers/register-handler-fx :participant-left-group - [re-frame/trim-v - (re-frame/inject-cofx ::chats-is-active-and-timestamp)] - (fn [{{:keys [current-public-key] :as db} :db chats-is-active-and-timestamp :chats-is-active-and-timestamp} + [re-frame/trim-v] + (fn [{{:keys [current-public-key] :as db} :db} [{:keys [from] {:keys [group-id timestamp message-id]} :payload}]] - (when (and (not= current-public-key from) - chats-is-active-and-timestamp) - {::participant-left-group-message {:chat-id group-id - :from from - :message-id message-id - :timestamp timestamp} - ::chats-remove-contact [group-id from] - :db (update-in db [:chats group-id :contacts] - #(remove (fn [{:keys [identity]}] - (= identity from)) %))}))) + (let [chat (get-in db [:chats group-id]) + {chat-is-active :is-active chat-timestamp :timestamp} chat] + (when (and (not= current-public-key from) + chat-is-active + (> timestamp chat-timestamp)) + {::participant-left-group-message {:chat-id group-id + :from from + :message-id message-id + :timestamp timestamp} + ::chats-remove-contact [group-id from] + :db (update-in db [:chats group-id :contacts] + #(remove (fn [{:keys [identity]}] + (= identity from)) %))})))) ;;ERROR