Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

[#200] Adds support for exposing Survey changes #205

Merged
merged 1 commit into from
Jan 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion api/src/clojure/org/akvo/flow_api/endpoint/sync.clj
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,15 @@
:form-deleted
:data-point-changed
:data-point-deleted
:survey-changed
:survey-deleted
:unilog-id])
(update :form-deleted #(map str %))
(update :form-instance-deleted #(map str %))
(update :data-point-deleted #(map str %)))
(update :data-point-deleted #(map str %))
(update :survey-deleted #(map str %))
(update :survey-changed (fn [changed]
(map #(update % :id str) changed))))
cursor (:unilog-id changes)]
(-> (response {:changes (dissoc changes :unilog-id)
:next-sync-url (next-sync-url api-root alias cursor)})
Expand Down
22 changes: 14 additions & 8 deletions api/src/clojure/org/akvo/flow_api/unilog/spec.clj
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
(s/def ::dataPointId ::id)
(s/def ::surveyId ::id)
(s/def ::identifier string?)
(s/def ::name string?)
(s/def ::suveyGroupType #{"SURVEY"})

(s/def ::formInstance
(s/keys :req-un [::id ::formId]))
Expand All @@ -26,6 +28,9 @@
(s/def ::delete
(s/keys :req-un [::id]))

(s/def ::survey
(s/keys :req-un [::id ::name ::surveyGroupType]))

(def type-to-spec
{"formInstanceDeleted" ::delete
"formInstanceUpdated" ::formInstance
Expand All @@ -37,7 +42,10 @@
"answerUpdated" ::answer
"dataPointCreated" ::dataPoint
"dataPointUpdated" ::dataPoint
"dataPointDeleted" ::delete})
"dataPointDeleted" ::delete
"surveyGroupCreated" ::survey
"surveyGroupUpdated" ::survey
"surveyGroupDeleted" ::delete})

(s/def ::eventType (set (keys type-to-spec)))
(s/def ::entity map?)
Expand All @@ -46,14 +54,12 @@


(defn valid? [m]
#_(when-not (s/valid? ::event m)
(s/explain ::event m))
(and
(s/valid? ::event m)
(when-let [spec (get type-to-spec (-> m :payload :eventType))]
(s/valid?
spec
(-> m :payload :entity)))))
(s/valid? ::event m)
(when-let [spec (get type-to-spec (-> m :payload :eventType))]
(s/valid?
spec
(-> m :payload :entity)))))

(comment
(gen/sample (s/gen ::event))
Expand Down
24 changes: 19 additions & 5 deletions api/src/clojure/org/akvo/flow_api/unilog/unilog.clj
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@
{:form-id formId
:id formInstanceId})

(defn survey-data [{:keys [id name]}]
{:id id
:name name})

(defn process-new-events [reducible]
(let [pipeline (comp
(map (fn [x]
Expand All @@ -64,7 +68,9 @@
("formUpdated" "formCreated") [::form-changed :id]
"formDeleted" [::form-deleted :id]
("dataPointUpdated" "dataPointCreated") [::data-point-changed :id]
"dataPointDeleted" [::data-point-deleted :id])]
"dataPointDeleted" [::data-point-deleted :id]
("surveyGroupCreated" "surveyGroupUpdated") [::survey-changed survey-data]
"surveyGroupDeleted" [::survey-deleted :id])]
(assoc x k (-> x :payload :entity f)))))))]
(transduce
pipeline
Expand All @@ -80,15 +86,19 @@
(comp form-instance-deleted :id)
(distinct (keep ::form-instance-changed final)))))
data-point-deleted (set (keep ::data-point-deleted final))
data-point-changed (apply disj (set (keep ::data-point-changed final)) data-point-deleted)]
data-point-changed (apply disj (set (keep ::data-point-changed final)) data-point-deleted)
survey-deleted (set (keep ::survey-deleted final))
survey-changed (remove #(survey-deleted (:id %)) (set (keep ::survey-changed final)))]
{::unilog-id (:id (last final))
::form-instance-deleted form-instance-deleted
::form-updated form-updated
::form-deleted form-deleted
:forms-to-load (apply conj form-updated (keys form-instances-grouped-by-form))
::forms-instances-grouped-by-form form-instances-grouped-by-form
::data-point-changed data-point-changed
::data-point-deleted data-point-deleted}))
::data-point-deleted data-point-deleted
::survey-changed survey-changed
::survey-deleted survey-deleted}))
([sofar batch]
(conj sofar batch)))
[]
Expand All @@ -100,7 +110,9 @@
form-deleted
form-instance-deleted
data-point-changed
data-point-deleted]}
data-point-deleted
survey-changed
survey-deleted]}
form-id->form]
{:unilog-id unilog-id
:form-changed (->> form-updated
Expand All @@ -115,7 +127,9 @@
:form-instance-ids (set (map :id form-instance))})))
set)
:data-point-changed data-point-changed
:data-point-deleted data-point-deleted})
:data-point-deleted data-point-deleted
:survey-changed survey-changed
:survey-deleted survey-deleted})

(defn get-cursor [db]
(let [result (first (jdbc/query db
Expand Down
27 changes: 27 additions & 0 deletions api/test/clojure/org/akvo/flow_api/sync.clj
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,18 @@
:payload (json/generate-string {:eventType "dataPointDeleted"
:entity {:id data-point-id}})})

(defn survey [survey-id name]
{:id (swap! unilog-id-seq inc)
:payload (json/generate-string {:eventType (rand-nth ["surveyGroupCreated" "surveyGroupUpdated"])
:entity {:id survey-id
:name name
:surveyGroupType "SURVEY"}})})

(defn survey-delete [survey-id]
{:id (swap! unilog-id-seq inc)
:payload (json/generate-string {:eventType "surveyGroupDeleted"
:entity {:id survey-id}})})

(defn can-see [& form-ids]
(zipmap form-ids form-ids))

Expand All @@ -64,6 +76,8 @@
(def form-deletes (comp :form-deleted changes-with-permissions))
(def data-point-changes (comp :data-point-changed changes-with-permissions))
(def data-point-deleted (comp :data-point-deleted changes-with-permissions))
(def survey-changes (comp :survey-changed changes-with-permissions))
(def survey-deleted (comp :survey-deleted changes-with-permissions))

(deftest unilog-batch
(testing "basic case"
Expand Down Expand Up @@ -119,6 +133,19 @@
(data-point-changes [(data-point-deleted-event 11)
(data-point 11 40 "dddd-eeee-ffff")]))))

(testing "Surveys"
(is (= #{60 80}
(set (map :id
(survey-changes [(survey 60 "Survey 60")
(survey 80 "Survey 80")])))))

(is (= #{90}
(survey-deleted [(survey-delete 90)])))

(is (empty?
(survey-changes [(survey 100 "Survey 100")
(survey-delete 100)]))))

(testing "form changes"
(is (= #{{:some-form :definition}}
(form-changes [(form 34)
Expand Down
11 changes: 10 additions & 1 deletion api/test/clojure/org/akvo/flow_api/sync_end_to_end.clj
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,13 @@
:identifier "3kfp-75fw-w15n"}
:eventType "dataPointCreated"}
{:entity {:id 144602051}
:eventType "dataPointDeleted"}])
:eventType "dataPointDeleted"}
{:eventType "surveyGroupUpdated"
:entity {:id 152372359
:name "All question types"
:surveyGroupType "SURVEY"}}
{:eventType "surveyGroupDeleted"
:entity {:id 153132013}}])

(defn insert-log [db events]
(jdbc/insert-multi! db :event_log (mapv (fn [evt]
Expand Down Expand Up @@ -117,6 +123,9 @@
(is (= #{"144622023"}
(set (map :id (:dataPointChanged changes)))))
(is (= (:dataPointDeleted changes) ["144602051"]))
(is (= #{"152372359"}
(set (map :id (:surveyChanged changes)))))
(is (= (:surveyDeleted changes) ["153132013"]))
(let [{:keys [headers status]} (http/get nextSyncUrl
{:as :json
:headers {"x-akvo-email" user
Expand Down