@@ -73,8 +73,14 @@ module Suave =
7373
7474 let loginTemplatePath = " user/login.liquid"
7575
76- let renderLoginPage ( viewModel : LoginViewModel ) =
77- page loginTemplatePath viewModel
76+ let redirectToWallPage =
77+ Redirection.FOUND " /wall"
78+
79+ let renderLoginPage ( viewModel : LoginViewModel ) hasUserLoggedIn =
80+ match hasUserLoggedIn with
81+ | Some _ -> redirectToWallPage
82+ | _ -> page loginTemplatePath viewModel
83+
7884
7985 let userSessionKey = " fsTweetUser"
8086
@@ -101,6 +107,10 @@ module Suave =
101107 statefulForSession
102108 >=> context ( initUserSession fFailure fSuccess)
103109
110+ let optionalUserSession fSuccess =
111+ statefulForSession
112+ >=> context ( fun ctx -> fSuccess ( retrieveUser ctx))
113+
104114 let redirectToLoginPage =
105115 Redirection.FOUND " /login"
106116
@@ -109,31 +119,37 @@ module Suave =
109119 ( fun _ -> Choice2Of2 redirectToLoginPage)
110120 ( fun _ -> Choice2Of2 redirectToLoginPage)
111121 ( userSession redirectToLoginPage fSuccess)
122+
123+ let mayRequiresAuth fSuccess =
124+ authenticate CookieLife.Session false
125+ ( fun _ -> Choice2Of2 ( fSuccess None))
126+ ( fun _ -> Choice2Of2 ( fSuccess None))
127+ ( optionalUserSession fSuccess)
112128
113129 let onLoginSuccess viewModel ( user : User ) =
114130 authenticated CookieLife.Session false
115131 >=> createUserSession user
116- >=> Redirection.FOUND " /wall "
132+ >=> redirectToWallPage
117133
118134 let onLoginFailure viewModel loginError =
119135 match loginError with
120136 | PasswordMisMatch ->
121137 let vm =
122138 { viewModel with Error = Some " password didn't match" }
123- renderLoginPage vm
139+ renderLoginPage vm None
124140 | EmailNotVerified ->
125141 let vm =
126142 { viewModel with Error = Some " email not verified" }
127- renderLoginPage vm
143+ renderLoginPage vm None
128144 | UsernameNotFound ->
129145 let vm =
130146 { viewModel with Error = Some " invalid username" }
131- renderLoginPage vm
147+ renderLoginPage vm None
132148 | Error ex ->
133149 printfn " %A " ex
134150 let vm =
135151 { viewModel with Error = Some " something went wrong" }
136- renderLoginPage vm
152+ renderLoginPage vm None
137153
138154 let handleLoginResult viewModel loginResult =
139155 either
@@ -159,16 +175,16 @@ module Suave =
159175 return ! webpart ctx
160176 | Failure err ->
161177 let viewModel = { vm with Error = Some err}
162- return ! renderLoginPage viewModel ctx
178+ return ! renderLoginPage viewModel None ctx
163179 | Choice2Of2 err ->
164180 let viewModel =
165181 { emptyLoginViewModel with Error = Some err}
166- return ! renderLoginPage viewModel ctx
182+ return ! renderLoginPage viewModel None ctx
167183 }
168184
169185 let webpart getDataCtx =
170186 let findUser = Persistence.findUser getDataCtx
171187 path " /login" >=> choose [
172- GET >=> renderLoginPage emptyLoginViewModel
188+ GET >=> mayRequiresAuth ( renderLoginPage emptyLoginViewModel)
173189 POST >=> handleUserLogin findUser
174190 ]
0 commit comments