Skip to content

Commit

Permalink
Added implementation for url /trackers/1,2/events (fetch events for g…
Browse files Browse the repository at this point in the history
…iven trackers). Added transactionality to create event. Extension values are now correctly displayed in json responses.
  • Loading branch information
jsyrjala committed Apr 4, 2012
1 parent a48f75d commit e61bf9c
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 99 deletions.
16 changes: 10 additions & 6 deletions src/ruuvi_server/api.clj
Expand Up @@ -29,16 +29,20 @@
(-> #'tracker-api/handle-create-event (-> #'tracker-api/handle-create-event
(wrap-request-logger "create-event") (wrap-request-logger "create-event")
)) ))
(GET [(str url-prefix "/trackers/:id") :id #"([0-9+],?)+"] [id] (GET [(str url-prefix "/trackers/:ids") :ids #"([0-9]+,?)+"] [ids]
(-> (fn [request] (client-api/fetch-tracker request id)) (-> (fn [request] (client-api/fetch-tracker request ids))
(wrap-request-logger "fetch-trackers") (wrap-request-logger "fetch-trackers")
)) ))
(GET (str url-prefix "/v1-dev/trackers") [] (GET [(str url-prefix "/trackers/:ids/events") :ids #"([0-9]+,?)+"] [ids]
(-> (fn [request] (client-api/fetch-events (merge request {:tracker_ids ids})))
(wrap-request-logger "fetch events for -trackers")
))
(GET (str url-prefix "/trackers") []
(-> #'client-api/fetch-trackers (-> #'client-api/fetch-trackers
(wrap-request-logger "fetch-trackers") (wrap-request-logger "fetch-trackers")
)) ))
(GET [(str url-prefix "/events/:id") :id #"([0-9+],?)+"] [id] (GET [(str url-prefix "/events/:ids") :ids #"([0-9+],?)+"] [ids]
(-> (fn [request] (client-api/fetch-event request id)) (-> (fn [request] (client-api/fetch-event request ids))
(wrap-request-logger "fetch-trackers") (wrap-request-logger "fetch-trackers")
)) ))
(GET (str url-prefix "/events") [] (GET (str url-prefix "/events") []
Expand Down
33 changes: 16 additions & 17 deletions src/ruuvi_server/client_api.clj
Expand Up @@ -19,11 +19,10 @@
) data-map)) ) data-map))


(defn- select-extension-data [extension-data] (defn- select-extension-data [extension-data]
(when extension-data (map (fn [data]
(let [selected-data (select-keys extension-data [:type :value])] {(data :name) (data :value)})
(util/remove-nil-values selected-data) extension-data))
)))

(defn- select-location-data [location-data] (defn- select-location-data [location-data]
(when location-data (when location-data
(let [selected-data (select-keys location-data (let [selected-data (select-keys location-data
Expand All @@ -42,8 +41,7 @@
(get (event-data :event_locations) (get (event-data :event_locations)
0)) 0))
extension-data (select-extension-data extension-data (select-extension-data
(get (event-data :event_extension_values) (event-data :event_extension_values))]
0))]
(util/remove-nil-values (merge renamed-data (util/remove-nil-values (merge renamed-data
{:location location-data {:location location-data
:extension_values extension-data})) :extension_values extension-data}))
Expand Down Expand Up @@ -73,11 +71,11 @@
"time" (util/timestamp)})) "time" (util/timestamp)}))


(defn- string-to-ids [value] (defn- string-to-ids [value]
(let [strings (.split value ",") (when value
ids (map #(Integer/parseInt %) strings)] (let [strings (.split value ",")
ids ids (map #(Integer/parseInt %) strings)]
) ids
) )))


(defn fetch-trackers [request] (defn fetch-trackers [request]
(json-response request {:trackers (db/get-all-trackers)} )) (json-response request {:trackers (db/get-all-trackers)} ))
Expand All @@ -93,18 +91,19 @@
;; Timezone may contain a + char. Browser converts + to space in url encode. This reverts the change. ;; Timezone may contain a + char. Browser converts + to space in url encode. This reverts the change.
(let [date-tmp (.replaceAll date-str " " "+") (let [date-tmp (.replaceAll date-str " " "+")
date (util/parse-date-time date-tmp)] date (util/parse-date-time date-tmp)]
(if date (if date
{key date} {key date}
nil)))) nil))))
(let [params (request :params) (let [params (request :params)
;; TODO this simply ignores invalid values => not good, should throw exception instead ;; TODO this simply ignores invalid values => not good, should throw exception instead
eventTimeStart (parse-date :eventTimeStart (params :eventTimeStart)) eventTimeStart (parse-date :eventTimeStart (params :eventTimeStart))
createTimeStart (parse-date :createTimeStart (params :createTimeStart)) createTimeStart (parse-date :createTimeStart (params :createTimeStart))
trackerIds {:trackerIds (string-to-ids (request :tracker_ids))}
] ]
(merge {} eventTimeStart createTimeStart) (merge {} trackerIds eventTimeStart createTimeStart)
)) ))


(defn fetch-events [request] (defn fetch-events [request ]
(let [query-params (parse-event-search-criterias request) (let [query-params (parse-event-search-criterias request)
found-events (db/search-events query-params)] found-events (db/search-events query-params)]
(json-response request (json-response request
Expand Down
158 changes: 82 additions & 76 deletions src/ruuvi_server/database/entities.clj
Expand Up @@ -57,16 +57,49 @@


(defn- remove-nil-values [map-data] (defn- remove-nil-values [map-data]
(flatten (filter (fn [x] (nth x 1) ) map-data) )) (flatten (filter (fn [x] (nth x 1) ) map-data) ))

;; public functions ;; public functions
(defn get-trackers [ids]
(select tracker
(where (in :id ids))))

(defn get-tracker-by-code [tracker-code]
(first (select tracker
(where {:tracker_code tracker-code}))))

(defn get-tracker-by-code! [tracker-code & tracker-name]
(let [existing-tracker (get-tracker-by-code tracker-code)]
(if existing-tracker
existing-tracker
(insert tracker (values {:tracker_code tracker-code
:name (or tracker-name tracker-code)}))
)))

(defn get-extension-type-by-id [id]
(first (select event-extension-type
(where {:name id}))))


(defn get-extension-type-by-name [type-name]
(first (select event-extension-type
(where {:name (str (name type-name))}))))

(defn get-extension-type-by-name! [type-name]
(let [existing-extension-type (get-extension-type-by-name type-name)]
(if existing-extension-type
existing-extension-type
(insert event-extension-type (values {:name (str (name type-name))
:description "Autogenerated"}))
)))

(defn get-event [event_id] (defn get-event [event_id]
(first (select event (first (select event
(with tracker) (with tracker)
(with event-location) (with event-location)
(with event-extension-value) (with event-extension-value)
(where {:id event_id}))) (where {:id event_id})))
) )

(defn search-events (defn search-events
"Search events: criteria is a map that can contain following keys. "Search events: criteria is a map that can contain following keys.
- :createTimeStart <DateTime>, find events that are created (stored) to database later than given time (inclusive). - :createTimeStart <DateTime>, find events that are created (stored) to database later than given time (inclusive).
Expand All @@ -75,22 +108,23 @@ TODO supports only the eventTimeStart
TODO calculates milliseconds wrong (12:30:01.000 is rounded to 12:30:01 but 12:30:01.001 is rounded to 12:30:02) TODO calculates milliseconds wrong (12:30:01.000 is rounded to 12:30:01 but 12:30:01.001 is rounded to 12:30:02)
" "
[criteria] [criteria]

(let [event-start (:eventTimeStart criteria) (let [event-start (:eventTimeStart criteria)
create-start (:createTimeStart criteria) create-start (:createTimeStart criteria)
tracker-ids (:trackerIds criteria)
conditions (merge (when event-start {:event_time ['>= (to-sql-timestamp event-start)]}) conditions (merge (when event-start {:event_time ['>= (to-sql-timestamp event-start)]})
(when create-start {:created_on ['>= (to-sql-timestamp create-start)]}) (when create-start {:created_on ['>= (to-sql-timestamp create-start)]})
(when tracker-ids {:tracker_id ['in tracker-ids]})
)] )]
(if (not (empty? conditions)) (if (not (empty? conditions))
;; (transaction (let [results (select event
(let [result (select event (with event-location)
(with event-location) (with event-extension-value (fields :value)
(with event-extension-value) (with event-extension-type (fields :name)))
(where (and conditions)) (where (and conditions))
)] )]
;; (rollback) results
result )
);)
'()))) '())))


(defn get-events [ids] (defn get-events [ids]
Expand All @@ -112,35 +146,7 @@ TODO calculates milliseconds wrong (12:30:01.000 is rounded to 12:30:01 but 12:3
(defn get-tracker [id] (defn get-tracker [id]
;; TODO support also fetching with tracker_indentifier ;; TODO support also fetching with tracker_indentifier
(first (select tracker (first (select tracker
(where {:id id})))) (where {:id id}))))

(defn get-trackers [ids]
(select tracker
(where (in :id ids))))

(defn get-tracker-by-code [tracker-code]
(first (select tracker
(where {:tracker_code tracker-code}))))

(defn get-tracker-by-code! [tracker-code & tracker-name]
(let [existing-tracker (get-tracker-by-code tracker-code)]
(if existing-tracker
existing-tracker
(insert tracker (values {:tracker_code tracker-code
:name (or tracker-name tracker-code)}))
)))

(defn get-extension-type-by-name [type-name]
(first (select event-extension-type
(where {:name (str (name type-name))}))))

(defn get-extension-type-by-name! [type-name]
(let [existing-extension-type (get-extension-type-by-name type-name)]
(if existing-extension-type
existing-extension-type
(insert event-extension-type (values {:name (str (name type-name))
:description "Autogenerated"}))
)))


(defn- update-tracker-latest-activity [id] (defn- update-tracker-latest-activity [id]
(update tracker (update tracker
Expand All @@ -155,39 +161,39 @@ TODO calculates milliseconds wrong (12:30:01.000 is rounded to 12:30:01 but 12:3
:name name}))) :name name})))


(defn create-event [data] (defn create-event [data]
(let [extension-keys (filter (fn [key] (transaction
(.startsWith (str (name key)) "X-")) (let [extension-keys (filter (fn [key]
(keys data)) (.startsWith (str (name key)) "X-"))
tracker (get-tracker-by-code! (:tracker_code data)) (keys data))
latitude (:latitude data) tracker (get-tracker-by-code! (:tracker_code data))
longitude (:longitude data) latitude (:latitude data)

longitude (:longitude data)
event-entity (insert event (values
{:tracker_id (tracker :id) event-entity (insert event (values
:event_time (or (to-sql-timestamp (:event_time data)) {:tracker_id (tracker :id)
(current-sql-timestamp) ) :event_time (or (to-sql-timestamp (:event_time data))
}))] (current-sql-timestamp) )

}))]
(if (and latitude longitude)
(insert event-location (values (if (and latitude longitude)
{:event_id (:id event-entity) (insert event-location (values
:latitude latitude {:event_id (:id event-entity)
:longitude longitude :latitude latitude
:accuracy (:accuracy data) :longitude longitude
:satellite_count (:satellite_count data) :accuracy (:accuracy data)
:altitude (:altitude data)})) :satellite_count (:satellite_count data)
) :altitude (:altitude data)}))
)


(doseq [key extension-keys] (doseq [key extension-keys]
(insert event-extension-value (insert event-extension-value
(values (values
{:event_id (:id event-entity) {:event_id (:id event-entity)
:value (data key) :value (data key)
:event_extension_type_id (:id (get-extension-type-by-name! key)) :event_extension_type_id (:id (get-extension-type-by-name! key))
} }
))) )))
(update-tracker-latest-activity (tracker :id)) (update-tracker-latest-activity (tracker :id))
event-entity event-entity
)) )))

)
)

0 comments on commit e61bf9c

Please sign in to comment.