blob: ce84b88e97c139c4979033167b0019dfb7979c03 (
plain) (
tree)
|
|
(ns bbbg.handlers.attendees
(:require
[bbbg.attendee :as attendee]
[bbbg.attendee-check :as attendee-check]
[bbbg.db :as db]
[bbbg.db.attendee :as db.attendee]
[bbbg.db.attendee-check :as db.attendee-check]
[bbbg.db.event :as db.event]
[bbbg.event :as event]
[bbbg.handlers.core :refer [page-response wrap-auth-required]]
[bbbg.user :as user]
[bbbg.util.display :refer [format-date]]
[bbbg.views.flash :as flash]
[cheshire.core :as json]
[compojure.coercions :refer [as-uuid]]
[compojure.core :refer [GET POST routes]]
[honeysql.helpers :refer [merge-where]]
[ring.util.response :refer [content-type not-found redirect response]])
(:import
java.util.UUID))
(defn- attendees-page [{:keys [attendees q edit-notes]}]
[:div.page
[:form.search-form {:method :get :action "/attendees"}
[:input.search-input
{:type "search"
:name "q"
:value q
:title "Search Attendees"}]
[:input {:type "submit"
:value "Search Attendees"}]]
[:table.attendees
[:thead
[:tr
[:th "Meetup Name"]
[:th "Discord Name"]
[:th "Events RSVPd"]
[:th "Events Attended"]
[:th "No-Shows"]
[:th "Last Vaccination Check"]
[:th "Notes"]]]
[:tbody
(for [attendee (sort-by
(comp #{edit-notes} ::attendee/id)
(comp - compare)
attendees)
:let [id (::attendee/id attendee)]]
[:tr
[:td.attendee-name (::attendee/meetup-name attendee)]
[:td
[:label.mobile-label "Discord Name: "]
(or (not-empty (::attendee/discord-name attendee))
"—")]
[:td
[:label.mobile-label "Events RSVPd: "]
(:events-rsvpd attendee)]
[:td
[:label.mobile-label "Events Attended: "]
(:events-attended attendee)]
[:td
[:label.mobile-label "No-shows: "]
(:no-shows attendee)]
[:td
[:label.mobile-label "Last Vaccination Check: "]
(if-let [last-check (:last-check attendee)]
(str "✔️ "(-> last-check
::attendee-check/checked-at
format-date)
", by "
(get-in last-check [:user ::user/username]))
(list
[:span {:title "Not Checked"}
"❌"]
" "
[:a {:href (str "/attendees/" id "/checks/edit")}
"Edit"] ))]
(if (= edit-notes id)
[:td
[:form.organizer-notes {:method :post
:action (str "/attendees/" id "/notes")}
[:div.form-group
[:input {:type :text :name "notes"
:value (::attendee/organizer-notes attendee)
:autofocus true}]]
[:div.form-group
[:input {:type "Submit" :value "Save Notes"}]]]]
[:td
[:p
(::attendee/organizer-notes attendee)]
[:p
[:a {:href (str "/attendees?edit-notes=" id)}
"Edit Notes"]]])])]]])
(defn attendees-routes [{:keys [db]}]
(routes
(wrap-auth-required
(routes
(GET "/attendees" [q edit-notes]
(let [attendees (db/list db (cond-> (db.attendee/with-stats)
q (db.attendee/search q)))
attendees (db.attendee-check/attendees-with-last-checks
db
attendees)
edit-notes (some-> edit-notes UUID/fromString)]
(page-response (attendees-page {:attendees attendees
:q q
:edit-notes edit-notes}))))
(POST "/attendees/:id/notes" [id :<< as-uuid notes]
(if (seq (db/update! db
:attendee
{::attendee/organizer-notes notes}
[:= :id id]))
(-> (redirect "/attendees")
(flash/add-flash
#:flash{:type :success
:message "Notes updated successfully"}))
(not-found "Attendee not found")))))
(GET "/attendees.json" [q event_id attended]
(let [results
(db/list
db
(cond->
(if q
(db.attendee/search q)
{:select [:attendee.*] :from [:attendee]})
event_id (db.attendee/for-event event_id)
(some? attended)
(merge-where
(case attended
"true" :attended
"false" [:or [:= :attended nil] [:not :attended]]))))]
(-> {:results results}
json/generate-string
response
(content-type "application/json"))))
(POST "/event_attendees" [event_id attendee_id]
(if (and (db/exists? db {:select [:id] :from [:event] :where [:= :id event_id]})
(db/exists? db {:select [:id] :from [:attendee] :where [:= :id attendee_id]}))
(do
(db.event/attended! db {::event/id event_id
::attendee/id attendee_id})
(-> (redirect (str "/signup-forms/" event_id))
(flash/add-flash
#:flash{:type :success
:message "Thank you for signing in! Enjoy the event."})))
(response "Something went wrong")))))
(comment
(def db (:db bbbg.core/system))
(db/list db :attendee)
(db/list db
(->
(db.attendee/search "gr")
(db.attendee/for-event #uuid "9f4f3eae-3317-41a7-843c-81bcae52aebf")))
(honeysql.format/format
(->
(db.attendee/search "gr")
(db.attendee/for-event #uuid "9f4f3eae-3317-41a7-843c-81bcae52aebf")))
)
|