@@ -7,90 +7,100 @@ module Zureg.Main.Web
7
7
, app
8
8
) where
9
9
10
- import Control.Applicative (liftA2 )
11
- import Control.Exception (throwIO )
12
- import Control.Monad (join , unless , when )
13
- import qualified Data.Aeson as A
14
- import Data.Maybe (isNothing )
15
- import qualified Data.Text as T
16
- import qualified Data.Text.Encoding as T
17
- import qualified Data.Text.Lazy.Encoding as TL
18
- import qualified Data.Time as Time
19
- import Data.UUID (UUID )
20
- import qualified Data.UUID as UUID
21
- import qualified Data.UUID.V4 as UUID
22
- import qualified Network.HTTP.Client as Http
23
- import qualified Network.HTTP.Client.TLS as Http
24
- import qualified Network.HTTP.Types as Http
25
- import qualified Network.Wai as Wai
26
- import qualified Network.Wai.Handler.Warp as Warp
27
- import qualified Text.Digestive as D
28
- import qualified Zureg.Captcha as Captcha
29
- import qualified Zureg.Database as Database
10
+ import Control.Applicative (liftA2 )
11
+ import Control.Exception (throwIO )
12
+ import Control.Monad (join , unless , void , when )
13
+ import qualified Data.Aeson as A
14
+ import Data.Maybe (isNothing )
15
+ import qualified Data.Text as T
16
+ import qualified Data.Text.Encoding as T
17
+ import qualified Data.Text.Lazy.Encoding as TL
18
+ import qualified Data.Time as Time
19
+ import Data.UUID (UUID )
20
+ import qualified Data.UUID as UUID
21
+ import qualified Data.UUID.V4 as UUID
22
+ import qualified Network.HTTP.Client as Http
23
+ import qualified Network.HTTP.Client.TLS as Http
24
+ import qualified Network.HTTP.Types as Http
25
+ import qualified Network.Wai as Wai
26
+ import qualified Network.Wai.Handler.Warp as Warp
27
+ import qualified Text.Digestive as D
28
+ import qualified Zureg.Captcha as Captcha
29
+ import qualified Zureg.Captcha.HCaptcha as HCaptcha
30
+ import qualified Zureg.Database as Database
30
31
import Zureg.Database.Models
31
32
import Zureg.Form
33
+ import qualified Zureg.Hackathon as Hackathon
34
+ import Zureg.Hackathon (Hackathon )
32
35
import qualified Zureg.Hackathon.ZuriHac2020.Discord as Discord
33
- import qualified Zureg.Hackathon as Hackathon
34
- import Zureg.Hackathon (Hackathon )
35
36
import Zureg.Http
36
- import qualified Zureg.SendEmail as SendEmail
37
+ import qualified Zureg.SendEmail as SendEmail
37
38
import Zureg.SendEmail.Hardcoded
38
- import qualified Zureg.Views as Views
39
+ import qualified Zureg.Views as Views
39
40
40
- main :: forall a . ( A. FromJSON a , A. ToJSON a ) => Hackathon a -> IO ()
41
+ main :: Hackathon -> IO ()
41
42
main hackathon = do
42
- dbConfig <- Database. configFromEnv
43
+ db <- Database. configFromEnv
43
44
discord <- Discord. configFromEnv
44
- app dbConfig hackathon >>= Warp. run 8000
45
+ hcaptcha <- HCaptcha. configFromEnv
46
+ app db discord hcaptcha hackathon >>= Warp. run 8000
45
47
46
48
app
47
49
:: Database. Config
48
50
-> Discord. Config
51
+ -> HCaptcha. Config -- ^ TODO: generic captcha config?
49
52
-> Hackathon
50
53
-> IO Wai. Application
51
- app dbConfig discord hackathon =
54
+ app dbConfig discord hcaptchaConfig hackathon =
52
55
fmap httpExceptionMiddleware $
53
56
Http. newManager Http. tlsManagerSettings >>= \ httpManager ->
54
57
Database. withHandle dbConfig $ \ db ->
55
- SendEmail. withHandle (Hackathon. sendEmailConfig hackathon) $ \ sendEmail ->
58
+ SendEmail. withHandle $ \ sendEmail ->
59
+ HCaptcha. withHandle hcaptchaConfig $ \ captcha ->
56
60
pure $ \ req respond -> case Wai. pathInfo req of
57
61
[" register" ] -> do
58
62
reqBody <- TL. decodeUtf8 <$> Wai. strictRequestBody req
59
63
when (Wai. requestMethod req == Http. methodPost) $ Captcha. verify
60
- ( Hackathon. captcha hackathon)
64
+ captcha
61
65
httpManager
62
66
(Just reqBody)
63
67
(view, mbReg) <- runForm req reqBody " register" $ D. checkM
64
68
" Email address already registered"
65
- (fmap isNothing . Database. lookupEmail db . riEmail . fst )
66
- (liftA2 (,)
67
- (registerForm hackathon)
68
- (Hackathon. registerForm hackathon))
69
+ (fmap isNothing . Database. lookupEmail db . irEmail)
70
+ registerForm
69
71
case mbReg of
70
72
Nothing -> respond . html $ Views. register
71
73
hackathon
72
- (Captcha. clientHtml $ Hackathon. captcha hackathon )
74
+ (Captcha. clientHtml captcha)
73
75
view
74
- Just (info, additionalInfo) -> do
76
+ Just insert -> do
77
+ -- TODO: transaction this
75
78
registrantsSummary <- Database. lookupRegistrantsSummary db
76
79
let atCapacity = Database. rsAvailable registrantsSummary <= 0
77
80
if atCapacity then do
78
81
-- You're on the waitlist
79
82
uuid <- UUID. nextRandom
83
+ {-
80
84
time <- Time.getCurrentTime
81
85
let wlinfo = WaitlistInfo time
82
86
Database.writeEvents db uuid
83
87
[Register info additionalInfo, Waitlist wlinfo]
84
88
Database.putEmail db (riEmail info) uuid
85
- sendWaitlistEmail sendEmail hackathon info uuid
86
- respond . html $ Views. registerWaitlist uuid info
89
+ -}
90
+ registrant <- Database. insertRegistration db insert
91
+ let uuid = rUuid registrant
92
+ registrant' <- Database. setRegistrationState db uuid
93
+ Waitlisted
94
+ sendWaitlistEmail sendEmail hackathon registrant'
95
+ respond . html $ Views. registerWaitlist registrant'
87
96
else do
88
97
-- Success registration
89
- uuid <- UUID. nextRandom
90
- Database. writeEvents db uuid [Register info additionalInfo]
91
- Database. putEmail db (riEmail info) uuid
92
- sendRegisterSuccessEmail sendEmail hackathon info uuid
93
- respond . html $ Views. registerSuccess uuid info
98
+ registrant <- Database. insertRegistration db insert
99
+ let uuid = rUuid registrant
100
+ registrant' <- Database. setRegistrationState db uuid
101
+ Registered
102
+ sendRegisterSuccessEmail sendEmail hackathon registrant'
103
+ respond . html $ Views. registerSuccess registrant'
94
104
95
105
[" ticket" ] | Wai. requestMethod req == Http. methodGet -> do
96
106
uuid <- getUuidParam req
@@ -125,8 +135,9 @@ app dbConfig discord hackathon =
125
135
uuid <- getUuidParam req
126
136
registrant <- Database. getRegistrant db uuid
127
137
case rState registrant of
128
- Just Registered -> Database. setRegistrationState db uuid Confirmed
129
- _ -> return ()
138
+ Registered -> void $
139
+ Database. setRegistrationState db uuid Confirmed
140
+ _ -> pure ()
130
141
respond . redirect $ " ticket?uuid=" <> UUID. toText uuid
131
142
132
143
[" cancel" ] -> do
0 commit comments