Skip to content

Commit b9a5455

Browse files
committed
adds mayRequiresAuth combinator
1 parent c3edf86 commit b9a5455

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

src/FsTweet.Web/Auth.fs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)