Skip to content

Commit

Permalink
feat: migrate forms and field-values
Browse files Browse the repository at this point in the history
- from :form/id ... to :application/forms [{:form/id ...}]
- from :field-values {field value} to :field-values [{:form ... :field ... :value ...}]
  • Loading branch information
Macroz committed Mar 16, 2020
1 parent ed19d4c commit 2dff295
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
3 changes: 3 additions & 0 deletions resources/migrations/20200316071545-multiple-forms.edn
@@ -0,0 +1,3 @@
{:ns rems.migrations.multiple-forms
:up-fn migrate-up
:down-fn nil}
68 changes: 68 additions & 0 deletions src/clj/rems/migrations/multiple_forms.clj
@@ -0,0 +1,68 @@
(ns rems.migrations.multiple-forms
(:require [hugsql.core :as hugsql]
[medley.core :refer [map-keys]]
[rems.json :as json]
[rems.util :refer [getx update-present]]))

(hugsql/def-db-fns-from-string
"
-- :name get-application-events :? :*
SELECT id, eventdata::TEXT
FROM application_event
WHERE 1=1
/*~ (when (:application params) */
AND appId = :application
/*~ ) ~*/
ORDER BY id ASC;
-- :name set-event! :!
UPDATE application_event
SET eventdata = (:eventdata::jsonb)
WHERE id = :id;
")

(defn- get-application-forms [conn]
(reduce (fn [m {:keys [id eventdata]}]
(let [event (json/parse-string eventdata)]
(if (and (= "application.event/created" (:event/type event))
(:form/id event))
(assoc m (:application/id event) (:form/id event))
m)))
{}
(get-application-events conn)))

(defmulti migrate-event (fn [id event application-forms] (:event/type event)))

(defmethod migrate-event :default [id event application-forms]
nil)

(defmethod migrate-event "application.event/draft-saved"
[id event application-forms]
(when (map? (:application/field-values event))
(let [form-id (getx application-forms (:application/id event))]
(update event
:application/field-values
(fn [m]
(vec (for [[field-id field-value] m]
{:form form-id :field field-id :value field-value})))))))

(defmethod migrate-event "application.event/created"
[id event _application-forms]
(when (:form/id event)
(-> event
(dissoc :form/id)
(assoc :application/forms [{:form/id (:form/id event)}]))))

(defn- migrate-events [conn application-forms]
(doseq [{:keys [id eventdata]} (get-application-events conn)]
(let [event (json/parse-string eventdata)
new-event (migrate-event id event application-forms)]
(when new-event
(set-event! conn {:id id :eventdata (json/generate-string new-event)})))))

(defn migrate-up [{:keys [conn]}]
(let [application-forms (get-application-forms conn)]
(migrate-events conn application-forms)))

(comment
(migrate-up {:conn rems.db.core/*db*}))

0 comments on commit 2dff295

Please sign in to comment.