Context
In a controller, I have a function that is called via beforeAction to check if a certain field on user is null or not. If it is null, the user should be redirected to a certain action in another controller.
Since I want to call this function from almost every controller in my application, putting it in Application.Helper.Controller seems the right choice, but I cannot figure out the type signature.
The function is as follows, and in a normal controller this works:
ensureIsSubscribed :: _ => IO ()
ensureIsSubscribed = do
case currentUserOrNothing of
Just loggedInUser -> do
case (get #subscriptionId loggedInUser) of
Nothing -> redirectToPath "/NewCheckoutSession"
_ -> redirectToPath "/Welcome"
Nothing -> pure ()
but when putting the above in Application.Helper.Controller I get this error:
• Could not deduce (HasField
"subscriptionId" CurrentUserRecord (Maybe a0))
arising from a use of ‘get’
from the context: ?context::ControllerContext
bound by the inferred type of
ensureIsSubscribed :: (?context::ControllerContext) => IO ()
at Application/Helper/Controller.hs:(8,1)-(14,26)
The type variable ‘a0’ is ambiguous
• In the expression: (get #subscriptionId loggedInUser)
In a stmt of a 'do' block:
case (get #subscriptionId loggedInUser) of
Nothing -> redirectToPath "/NewCheckoutSession"
_ -> redirectToPath "/Welcome"
In the expression:
do case (get #subscriptionId loggedInUser) of
Nothing -> redirectToPath "/NewCheckoutSession"
_ -> redirectToPath "/Welcome"
|
11 | case (get #subscriptionId loggedInUser) of
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Question
Why does the above not work and what is the correct type signature (if that is the problem)?
CodePudding user response:
The CurrentUserRecord is defined in Web/Types.hs as type instance CurrentUserRecord = User. If the Web.Types module is not imported, the type CurrentUserRecord cannot be replaced with it's definition User.
The fix is therefore to add an import Web.Types to your Application.Helper.Controller module :)
