about summary refs log tree commit diff
path: root/users/aspen/bbbg/src/bbbg/db/attendee_check.clj
blob: 492f786bd660368e5cc627cb0f12f55516c97497 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
(ns bbbg.db.attendee-check
  (:require
   [bbbg.attendee :as attendee]
   [bbbg.attendee-check :as attendee-check]
   [bbbg.db :as db]
   [bbbg.user :as user]
   [bbbg.util.core :as u]))

(defn create! [db params]
  (db/insert! db :attendee-check
              (select-keys params [::attendee/id
                                   ::user/id
                                   ::attendee-check/last-dose-at])))

(defn attendees-with-last-checks
  [db attendees]
  (when (seq attendees)
    (let [ids (map ::attendee/id attendees)
          checks
          (db/list db {:select [:attendee-check.*]
                       :from [:attendee-check]
                       :join [[{:select [:%max.attendee-check.checked-at
                                         :attendee-check.attendee-id]
                                :from [:attendee-check]
                                :group-by [:attendee-check.attendee-id]
                                :where [:in :attendee-check.attendee-id ids]}
                               :last-check]
                              [:=
                               :attendee-check.attendee-id
                               :last-check.attendee-id]]})
          users (if (seq checks)
                  (u/key-by
                   ::user/id
                   (db/list db {:select [:public.user.*]
                                :from [:public.user]
                                :where [:in :id (map ::user/id checks)]}))
                  {})
          checks (map #(assoc % :user (users (::user/id %))) checks)
          attendee-id->check (u/key-by ::attendee/id checks)]
      (map #(assoc % :last-check (attendee-id->check (::attendee/id %)))
           attendees))))

(comment
  (def db (:db bbbg.core/system))

  (attendees-with-last-checks
   db
   (db/list db :attendee)
   )

  (db/insert! db :attendee-check
              {::attendee/id #uuid "58bcd372-ff6e-49df-b280-23d24c5ba0f0"
               ::user/id #uuid "303fb606-5ef0-4682-ad7d-6429c670cd78"
               ::attendee-check/last-dose-at "2021-12-19"})
  )