about summary refs log tree commit diff
path: root/users/grfn/bbbg/src/bbbg/handlers/home.clj
blob: 726f45d4905d168825d3f881801568a51d84043f (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
(ns bbbg.handlers.home
  (:require
   [bbbg.db.user :as db.user]
   [bbbg.discord.auth :as discord.auth]
   [bbbg.handlers.core :refer [page-response authenticated?]]
   [bbbg.user :as user]
   [bbbg.views.flash :as flash]
   [compojure.core :refer [GET POST routes]]
   [ring.util.response :refer [redirect]]
   [bbbg.discord :as discord]))

(defn- home-page [{:keys [authenticated?]}]
  [:nav.home-nav
   [:ul
    [:li [:a {:href "/events"}
          "Events"]]
    [:li [:a {:href "/signup-forms"}
          "Event Signup Form"]]
    (if authenticated?
      [:li [:form {:method :post
                   :action "/auth/sign-out"}
            [:input {:type "submit"
                     :value "Sign Out"}]]]
      [:li [:a {:href "/auth/discord"}
            "Sign In"]])]])

(defn auth-failure []
  [:div.auth-failure
   [:p
    "Sorry, only users with the Organizers role in discord can sign in"]
   [:p
    [:a {:href "/"} "Go Back"]]])

(defn home-routes [{:keys [db] :as env}]
  (routes
   (GET "/" request
     (page-response (home-page {:authenticated? (authenticated? request)})))

   (POST "/auth/sign-out" request
     (if (authenticated? request)
       (-> (redirect "/")
           (update :session dissoc ::user/id)
           (flash/add-flash
            {:flash/message "Successfully Signed Out"
             :flash/type :success}))
       (redirect "/")))

   (GET "/auth/success" request
     (let [token (get-in request [:oauth2/access-tokens :discord])]
       (if (discord.auth/check-discord-auth env token)
         (let [discord-user (discord/me token)
               user (db.user/find-or-create!
                     db
                     #::user{:username (:username discord-user)
                             :discord-user-id (:id discord-user)})]
           (-> (redirect "/")
               (assoc-in [:session ::user/id] (::user/id user))
               (flash/add-flash
                {:flash/message "Successfully Signed In"
                 :flash/type :success})))
         (->
          (page-response (auth-failure))
          (assoc :status 401)))))))