2016-10-04 11:49:59 +00:00
|
|
|
(ns status-im.data-store.messages
|
|
|
|
(:require [status-im.data-store.realm.messages :as data-store]
|
|
|
|
[clojure.string :refer [join split]]
|
|
|
|
[status-im.utils.random :refer [timestamp]]
|
2017-07-20 11:59:57 +00:00
|
|
|
[status-im.utils.utils :refer [update-if-present]]
|
2016-10-04 11:49:59 +00:00
|
|
|
[clojure.walk :refer [stringify-keys keywordize-keys]]
|
|
|
|
[cljs.reader :refer [read-string]]
|
2017-10-27 13:22:53 +00:00
|
|
|
[status-im.constants :as c]))
|
2016-10-04 11:49:59 +00:00
|
|
|
|
|
|
|
(defn- user-statuses-to-map
|
|
|
|
[user-statuses]
|
|
|
|
(->> (vals user-statuses)
|
|
|
|
(mapv (fn [{:keys [whisper-identity] :as status}]
|
|
|
|
[whisper-identity status]))
|
|
|
|
(into {})))
|
|
|
|
|
|
|
|
(defn- command-type?
|
|
|
|
[type]
|
|
|
|
(contains?
|
2017-08-15 20:56:44 +00:00
|
|
|
#{c/content-type-command c/content-type-command-request
|
|
|
|
c/content-type-wallet-request c/content-type-wallet-command}
|
|
|
|
type))
|
2016-10-04 11:49:59 +00:00
|
|
|
|
|
|
|
(def default-values
|
|
|
|
{:outgoing false
|
|
|
|
:to nil
|
|
|
|
:same-author false
|
|
|
|
:same-direction false
|
|
|
|
:preview nil})
|
|
|
|
|
|
|
|
(defn get-by-id
|
|
|
|
[message-id]
|
|
|
|
(some-> (data-store/get-by-id message-id)
|
|
|
|
(clojure.core/update :user-statuses user-statuses-to-map)))
|
|
|
|
|
2017-03-12 11:20:56 +00:00
|
|
|
(defn get-message-content-by-id [message-id]
|
|
|
|
(when-let [{:keys [content-type content] :as message} (get-by-id message-id)]
|
|
|
|
(when (command-type? content-type)
|
2017-05-10 16:42:52 +00:00
|
|
|
(read-string content))))
|
2017-03-12 11:20:56 +00:00
|
|
|
|
2016-11-01 16:00:26 +00:00
|
|
|
(defn get-messages
|
|
|
|
[messages]
|
|
|
|
(->> messages
|
|
|
|
(mapv #(clojure.core/update % :user-statuses user-statuses-to-map))
|
|
|
|
(into '())
|
|
|
|
reverse
|
2017-01-23 15:57:40 +00:00
|
|
|
(keep (fn [{:keys [content-type] :as message}]
|
2016-11-01 16:00:26 +00:00
|
|
|
(if (command-type? content-type)
|
2017-05-10 16:42:52 +00:00
|
|
|
(clojure.core/update message :content read-string)
|
2016-11-01 16:00:26 +00:00
|
|
|
message)))))
|
|
|
|
|
2016-12-13 10:56:00 +00:00
|
|
|
(defn get-count-by-chat-id
|
|
|
|
[chat-id]
|
|
|
|
(data-store/get-count-by-chat-id chat-id))
|
|
|
|
|
2016-10-04 11:49:59 +00:00
|
|
|
(defn get-by-chat-id
|
|
|
|
([chat-id]
|
|
|
|
(get-by-chat-id chat-id 0))
|
|
|
|
([chat-id from]
|
|
|
|
(->> (data-store/get-by-chat-id chat-id from c/default-number-of-messages)
|
|
|
|
(mapv #(clojure.core/update % :user-statuses user-statuses-to-map))
|
|
|
|
(into '())
|
|
|
|
reverse
|
|
|
|
(keep (fn [{:keys [content-type preview] :as message}]
|
|
|
|
(if (command-type? content-type)
|
2017-05-10 16:42:52 +00:00
|
|
|
(clojure.core/update message :content read-string)
|
2016-10-04 11:49:59 +00:00
|
|
|
message))))))
|
|
|
|
|
2017-05-21 14:52:52 +00:00
|
|
|
(defn get-log-messages
|
|
|
|
[chat-id]
|
|
|
|
(->> (data-store/get-by-chat-id chat-id 0 100)
|
|
|
|
(filter #(= (:content-type %) c/content-type-log-message))
|
|
|
|
(map #(select-keys % [:content :timestamp]))))
|
|
|
|
|
2016-10-04 11:49:59 +00:00
|
|
|
(defn get-last-message
|
2016-12-27 15:16:53 +00:00
|
|
|
[chat-id]
|
2016-12-13 10:56:00 +00:00
|
|
|
(if-let [{:keys [content-type] :as message} (data-store/get-last-message chat-id)]
|
|
|
|
(if (command-type? content-type)
|
2017-05-10 16:42:52 +00:00
|
|
|
(clojure.core/update message :content read-string)
|
2016-12-13 10:56:00 +00:00
|
|
|
message)))
|
|
|
|
|
|
|
|
(defn get-last-outgoing
|
|
|
|
[chat-id number-of-messages]
|
|
|
|
(data-store/get-by-fields {:chat-id chat-id
|
|
|
|
:outgoing true}
|
|
|
|
0
|
|
|
|
number-of-messages))
|
|
|
|
|
|
|
|
(defn get-last-clock-value
|
|
|
|
[chat-id]
|
|
|
|
(if-let [message (data-store/get-last-message chat-id)]
|
|
|
|
(:clock-value message)
|
|
|
|
0))
|
2016-10-04 11:49:59 +00:00
|
|
|
|
|
|
|
(defn get-unviewed
|
|
|
|
[]
|
|
|
|
(data-store/get-unviewed))
|
|
|
|
|
2017-08-15 20:56:44 +00:00
|
|
|
(defn get-previews
|
|
|
|
[]
|
|
|
|
(->> (data-store/get-all-as-list)
|
|
|
|
(filter :preview)
|
|
|
|
(reduce (fn [acc {:keys [message-id preview]}]
|
|
|
|
(assoc acc message-id (read-string preview)))
|
|
|
|
{})))
|
|
|
|
|
2017-10-27 13:22:53 +00:00
|
|
|
(defn- prepare-content [content]
|
|
|
|
(pr-str
|
|
|
|
(update content :params dissoc :password :password-confirmation)))
|
|
|
|
|
2016-10-04 11:49:59 +00:00
|
|
|
(defn save
|
|
|
|
;; todo remove chat-id parameter
|
2017-08-07 21:29:54 +00:00
|
|
|
[chat-id {:keys [message-id content] :as message}]
|
2016-10-04 11:49:59 +00:00
|
|
|
(when-not (data-store/exists? message-id)
|
|
|
|
(let [content' (if (string? content)
|
|
|
|
content
|
2017-10-27 13:22:53 +00:00
|
|
|
(prepare-content content))
|
2016-10-04 11:49:59 +00:00
|
|
|
message' (merge default-values
|
|
|
|
message
|
2016-10-14 13:42:30 +00:00
|
|
|
{:chat-id chat-id
|
|
|
|
:content content'
|
|
|
|
:timestamp (timestamp)})]
|
2016-10-04 11:49:59 +00:00
|
|
|
(data-store/save message'))))
|
|
|
|
|
2017-10-27 13:22:53 +00:00
|
|
|
(defn update-message
|
2016-10-04 11:49:59 +00:00
|
|
|
[{:keys [message-id] :as message}]
|
|
|
|
(when (data-store/exists? message-id)
|
2017-07-20 11:59:57 +00:00
|
|
|
(let [message (update-if-present message :user-statuses vals)]
|
2016-10-04 11:49:59 +00:00
|
|
|
(data-store/save message))))
|
|
|
|
|
|
|
|
(defn delete-by-chat-id [chat-id]
|
|
|
|
(data-store/delete-by-chat-id chat-id))
|