about summary refs log tree commit diff
path: root/users/grfn/bbbg/src/bbbg/handlers/events.clj
blob: f1cd0523542347d808969d0265d556577a388965 (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
(ns bbbg.handlers.events
  (:require
   [bbbg.db :as db]
   [bbbg.db.event :as db.event]
   [bbbg.event :as event]
   [bbbg.handlers.core :refer [authenticated? page-response]]
   [bbbg.meetup.import :refer [import-attendees!]]
   [bbbg.util.display :refer [format-date]]
   [bbbg.util.time :as t]
   [bbbg.views.flash :as flash]
   [compojure.coercions :refer [as-uuid]]
   [compojure.core :refer [context GET POST]]
   [java-time :refer [local-date]]
   [ring.util.response :refer [not-found redirect]]))

(defn events-index [{:keys [events authenticated?]}]
  [:div
   (when authenticated?
     [:a {:href "/events/new"}
      "Create New Event"])
   [:ul.events-list
    (for [event events]
      [:li
       [:a {:href (str "/events/" (::event/id event))}
        (format-date (::event/date event))]])]])

(defn- import-attendee-list-form-group []
  [:div.form-group
   [:label "Import Attendee List"
    [:br]
    [:input {:type :file
             :name :attendees}]]])

(defn event-page [{:keys [event]}]
  [:div.event-page
   [:h1 (format-date (::event/date event))]
   [:div.stats
    [:p (:num-rsvps event) " RSVP"
     (when-not (= 1 (:num-rsvps event)) "s")]
    [:p (:num-attendees event)
     (if (= (t/->LocalDate (::event/date event))
            (local-date))
       " Signed In"
       (str " Attendee" (when-not (= 1 (:num-attendees event)) "s")))]]
   [:div
    [:form {:method :post
            :action (str "/events/" (::event/id event) "/attendees")
            :enctype "multipart/form-data"}
     (import-attendee-list-form-group)
     [:div.form-group
      [:input {:type :submit
               :value "Import"}]]]]])

(defn event-form
  ([] (event-form {}))
  ([event]
   [:form {:method "POST"
           :action "/events"
           :enctype "multipart/form-data"}
    [:div.form-group
     [:label "Date"
      [:input {:type "date"
               :id "date"
               :name "date"
               :value (str (::event/date event))}]]]
    (import-attendee-list-form-group)
    [:div.form-group
     [:input {:type "submit"
              :value "Create Event"}]]]))

(defn events-routes [{:keys [db]}]
  (context "/events" []
    (GET "/" request
      (let [events (db/list db :event)]
        (page-response
         (events-index {:events events
                        :authenticated? (authenticated? request)}))))

    (GET "/new" [date]
      (page-response
       {:title "New Event"}
       (event-form {::event/date date})))

    (POST "/" [date attendees]
      (let [event (db.event/create! db {::event/date date})
            message
            (if attendees
              (let [num-attendees
                    (import-attendees! db
                                       (::event/id event)
                                       (:tempfile attendees))]
                (format "Event created with %d attendees"
                        num-attendees))
              "Event created")]
        (-> (str "/signup-forms/" (::event/id event))
            redirect
            (flash/add-flash {:flash/type :success
                              :flash/message message}))))

    (context "/:id" [id :<< as-uuid]
      (GET "/" []
        (if-let [event (db/fetch db
                                 (-> {:select [:event.*]
                                      :from [:event]
                                      :where [:= :event.id id]}
                                     (db.event/with-stats)))]
          (page-response
           (event-page {:event event}))
          (not-found "Event Not Found")))

      (POST "/attendees" [attendees]
        (let [num-imported (import-attendees! db id (:tempfile attendees))]
          (-> (redirect (str "/events/" id))
              (flash/add-flash
               #:flash{:type :success
                       :message (format "Successfully imported %d attendees"
                                        num-imported)})))))))

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

  (-> (db/list db :event)
      first
      ::event/date
      format-date)
  )