Have now (finally) inserting correctly, but not returning success(?)
This commit is contained in:
parent
cdd3723c7b
commit
2c4c61c458
|
@ -9,6 +9,7 @@
|
||||||
[clj-oauth "1.5.5"]
|
[clj-oauth "1.5.5"]
|
||||||
[cljsjs/react-leaflet "1.6.5-0"]
|
[cljsjs/react-leaflet "1.6.5-0"]
|
||||||
[cljs-ajax "0.7.4"]
|
[cljs-ajax "0.7.4"]
|
||||||
|
[clojure.java-time "0.3.2"]
|
||||||
[com.cemerick/url "0.1.1"]
|
[com.cemerick/url "0.1.1"]
|
||||||
[compojure "1.6.1"]
|
[compojure "1.6.1"]
|
||||||
[conman "0.8.2"]
|
[conman "0.8.2"]
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3,9 +3,12 @@
|
||||||
(:require [adl-support.core :refer [massage-params do-or-log-error]]
|
(:require [adl-support.core :refer [massage-params do-or-log-error]]
|
||||||
[clojure.core.memoize :as memo]
|
[clojure.core.memoize :as memo]
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
|
[clojure.string :as s]
|
||||||
[clojure.tools.logging :as log]
|
[clojure.tools.logging :as log]
|
||||||
[clojure.walk :refer [keywordize-keys]]
|
[clojure.walk :refer [keywordize-keys]]
|
||||||
[compojure.core :refer [defroutes GET POST]]
|
[compojure.core :refer [defroutes GET POST]]
|
||||||
|
[java-time :as jt]
|
||||||
|
[mount.core :as mount]
|
||||||
[noir.response :as nresponse]
|
[noir.response :as nresponse]
|
||||||
[noir.util.route :as route]
|
[noir.util.route :as route]
|
||||||
[ring.util.http-response :as response]
|
[ring.util.http-response :as response]
|
||||||
|
@ -104,44 +107,99 @@
|
||||||
(:address_id params)
|
(:address_id params)
|
||||||
(:address_id last-visit))
|
(:address_id last-visit))
|
||||||
(:id last-visit)
|
(:id last-visit)
|
||||||
(db/create-visit! db/*db* params))))
|
(db/create-visit!
|
||||||
|
db/*db*
|
||||||
|
(assoc
|
||||||
|
params
|
||||||
|
:canvasser_id (-> request :session :user :id)
|
||||||
|
:date (jt/to-sql-timestamp (jt/local-date-time)))))))
|
||||||
|
|
||||||
|
|
||||||
;; http://localhost:3000/rest/create-intention?address_id=18&elector-id=62&elector_id=62&intention=Yes&locality=5482391
|
;; (current-visit-id {:session {:user {:email "simon@journeyman.cc",
|
||||||
|
;; :phone "07768 130255",
|
||||||
|
;; :roles #{"analysts" "canvassers" "admin" "teamorganisers" "issueexperts" "issueeditors"},
|
||||||
|
;; :username "simon_brooke",
|
||||||
|
;; :fullname "Simon Brooke",
|
||||||
|
;; :bio "Sinister pagan",
|
||||||
|
;; :elector_id 2, :id 4, :address_id 2,
|
||||||
|
;; :authority_id "GitHub",
|
||||||
|
;; :authorised true}}
|
||||||
|
;; :params {:address_id 79, :elector_id 238, :locality 5494393, :option_id "Yes"}})
|
||||||
|
;; (current-visit-id {:session {:user {:email "simon@journeyman.cc",
|
||||||
|
;; :phone "07768 130255",
|
||||||
|
;; :roles #{"analysts" "canvassers" "admin" "teamorganisers" "issueexperts" "issueeditors"},
|
||||||
|
;; :username "simon_brooke",
|
||||||
|
;; :fullname "Simon Brooke",
|
||||||
|
;; :bio "Sinister pagan",
|
||||||
|
;; :elector_id 2, :id 4, :address_id 2,
|
||||||
|
;; :authority_id "GitHub",
|
||||||
|
;; :authorised true}}
|
||||||
|
;; :params {:address_id 80, :elector_id 239, :locality 5494393, :option_id "Yes"}})
|
||||||
|
|
||||||
|
|
||||||
|
(defmacro do-or-return-reason
|
||||||
|
"Clojure stacktraces are unreadable. We have to do better; evaluate
|
||||||
|
this `form` in a try-catch block; return a map. If the evaluation
|
||||||
|
succeeds, the map will have a key `:result` whose value is the result;
|
||||||
|
otherwise it will have a key `:error` which will be bound to the most
|
||||||
|
sensible error message we can construct."
|
||||||
|
;; TODO: candidate for moving to adl-support.core
|
||||||
|
[form]
|
||||||
|
`(try
|
||||||
|
{:result ~form}
|
||||||
|
(catch Exception any#
|
||||||
|
(clojure.tools.logging/error
|
||||||
|
(str (.getName (.getClass any#))
|
||||||
|
": "
|
||||||
|
(.getMessage any#)
|
||||||
|
(with-out-str
|
||||||
|
(-> any# .printStackTrace))))
|
||||||
|
{:error
|
||||||
|
s/join "\n\tcaused by: "
|
||||||
|
(reverse
|
||||||
|
(loop [ex# any# result# ()]
|
||||||
|
(if-not (nil? ex#)
|
||||||
|
(recur
|
||||||
|
(.getCause ex#)
|
||||||
|
(str (.getName (.getClass ex#)) ": " (.getMessage ex#)))
|
||||||
|
result#)))})))
|
||||||
|
|
||||||
|
|
||||||
(defn create-intention-and-visit!
|
(defn create-intention-and-visit!
|
||||||
"Doing visit creation logic server side; request params are expected to
|
"Doing visit creation logic server side; request params are expected to
|
||||||
include an `option`, an `elector_id` and an `address_id`, or an `option` and
|
include an `option_id`, an `elector_id` and an `address_id`, or an `option` and
|
||||||
a `location`. If no `address_id` is provided, we simply create an
|
a `location`. If no `address_id` is provided, we simply create an
|
||||||
`intention` record from the `option` and the `locality`; if a `address_id`
|
`intention` record from the `option_id` and the `locality`; if an `address_id`
|
||||||
is provided, we need to check whether the last `visit` by the current `user`
|
is provided, we need to check whether the last `visit` by the current `user`
|
||||||
was to the same address, if so use that as the `visit_id`, if not create
|
was to the same address, if so use that as the `visit_id`, if not create
|
||||||
a new `visit` record."
|
a new `visit` record."
|
||||||
[request]
|
[request]
|
||||||
(let [params (:params request)]
|
(let [params (massage-params request)]
|
||||||
(log/debug "Creating intention with params: " params)
|
(log/debug "Creating intention with params: " params)
|
||||||
(if (-> request :session :user)
|
(if (-> request :session :user)
|
||||||
(if
|
(if
|
||||||
(and
|
(and
|
||||||
(or (:locality params)
|
(or (:locality params)
|
||||||
(and (:elector-id params)
|
(and (:elector_id params)
|
||||||
(:address_id params)))
|
(:address_id params)))
|
||||||
(:intention params))
|
(:option_id params))
|
||||||
(do-or-log-error
|
(let [r (do-or-return-reason
|
||||||
{:status 201
|
(db/create-intention!
|
||||||
:body (with-out-str
|
db/*db*
|
||||||
(print
|
(assoc
|
||||||
(hash-map
|
params :visit_id (current-visit-id request))))]
|
||||||
:id
|
(if
|
||||||
(db/create-intention!
|
(:result r)
|
||||||
db/*db*
|
{:status 201
|
||||||
(assoc
|
:body (with-out-str
|
||||||
params :visit_id (current-visit-id request))
|
(print
|
||||||
(db/create-intention! db/*db* params)))))}
|
(hash-map
|
||||||
:error-return {:status 500
|
:id (:id (:result r))
|
||||||
:body "Failed to create intention record"})
|
)))}
|
||||||
|
{:status 500
|
||||||
|
:body (:error r)}))
|
||||||
{:status 400
|
{:status 400
|
||||||
:body "create-intention requires params: `intention` and either `locality` or both `address_id` and `elector_id`."})
|
:body "create-intention requires params: `option_id` and either `locality` or both `address_id` and `elector_id`."})
|
||||||
{:status 403
|
{:status 403
|
||||||
:body "You must be logged in to do that"})))
|
:body "You must be logged in to do that"})))
|
||||||
|
|
||||||
|
|
|
@ -322,12 +322,11 @@
|
||||||
(assoc
|
(assoc
|
||||||
(add-to-outqueue
|
(add-to-outqueue
|
||||||
(clear-messages db)
|
(clear-messages db)
|
||||||
(assoc
|
{:address_id (-> db :address :id)
|
||||||
args
|
:locality (-> db :address :locality)
|
||||||
:address_id (-> db :address :id)
|
:elector_id (-> db :elector :id)
|
||||||
:locality (-> db :address :locality)
|
:option_id (:intention args)
|
||||||
:elector_id (-> db :elector :id)
|
:action :create-intention})
|
||||||
:action :create-intention))
|
|
||||||
:elector (assoc (:elector db) :intention intention)
|
:elector (assoc (:elector db) :intention intention)
|
||||||
:page :elector))))))
|
:page :elector))))))
|
||||||
|
|
||||||
|
|
|
@ -326,7 +326,7 @@ version="0.1.1">
|
||||||
<prompt prompt="Canvasser" locale="en_GB.UTF-8"/>
|
<prompt prompt="Canvasser" locale="en_GB.UTF-8"/>
|
||||||
</property>
|
</property>
|
||||||
<property required="true" type="timestamp" name="date"
|
<property required="true" type="timestamp" name="date"
|
||||||
column="date" default="now()" distinct="user">
|
column="date" default="CURRENT_TIMESTAMP" distinct="user">
|
||||||
<prompt prompt="Date" locale="en_GB.UTF-8"/>
|
<prompt prompt="Date" locale="en_GB.UTF-8"/>
|
||||||
</property>
|
</property>
|
||||||
<permission group="canvassers" permission="noedit">
|
<permission group="canvassers" permission="noedit">
|
||||||
|
@ -704,7 +704,7 @@ version="0.1.1">
|
||||||
column="method_id" entity="followupmethods" farkey="id">
|
column="method_id" entity="followupmethods" farkey="id">
|
||||||
<prompt prompt="method_id" locale="en_GB.UTF-8"/>
|
<prompt prompt="method_id" locale="en_GB.UTF-8"/>
|
||||||
</property>
|
</property>
|
||||||
<property required="true" type="string" name="method-detail">
|
<property required="true" type="string" name="method-detail" size="128">
|
||||||
<documentation>
|
<documentation>
|
||||||
Phone number or email address for followup.
|
Phone number or email address for followup.
|
||||||
</documentation>
|
</documentation>
|
||||||
|
@ -983,7 +983,7 @@ version="0.1.1">
|
||||||
column="actor" entity="canvassers" farkey="id">
|
column="actor" entity="canvassers" farkey="id">
|
||||||
<prompt prompt="actor" locale="en_GB.UTF-8"/>
|
<prompt prompt="actor" locale="en_GB.UTF-8"/>
|
||||||
</property>
|
</property>
|
||||||
<property required="true" default="now()" type="timestamp"
|
<property default="CURRENT_TIMESTAMP" type="timestamp"
|
||||||
name="date" column="date" distinct="user">
|
name="date" column="date" distinct="user">
|
||||||
<prompt prompt="date" locale="en_GB.UTF-8"/>
|
<prompt prompt="date" locale="en_GB.UTF-8"/>
|
||||||
</property>
|
</property>
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue