module Foundation.Yesod.ErrorHandler ( errorHandler ) where import Import.NoFoundation hiding (errorHandler) import Utils.Form import Foundation.Type import Foundation.I18n import Foundation.Authorization import Foundation.SiteLayout import Foundation.Routes import qualified Data.Aeson as JSON import qualified Data.Text as Text errorHandler :: ( MonadSecretBox (HandlerFor UniWorX) , MonadSecretBox (WidgetFor UniWorX) , BearerAuthSite UniWorX , Button UniWorX ButtonSubmit , BackendCompatible SqlBackend (YesodPersistBackend UniWorX) ) => ErrorResponse -> HandlerFor UniWorX TypedContent errorHandler err = do shouldEncrypt <- do canDecrypt <- (== Authorized) <$> evalAccess AdminErrMsgR True shouldEncrypt <- getsYesod $ view _appEncryptErrors return $ shouldEncrypt && not canDecrypt sessErr <- bool return (_InternalError $ encodedSecretBox SecretBoxShort) shouldEncrypt err setSessionJson SessionError sessErr selectRep $ do provideRep $ do mr <- getMessageRender let encrypted :: ToJSON a => a -> WidgetFor UniWorX () -> WidgetFor UniWorX () encrypted plaintextJson plaintext = do if | shouldEncrypt -> do ciphertext <- encodedSecretBox SecretBoxPretty plaintextJson [whamlet|

_{MsgErrorResponseEncrypted}

                    #{ciphertext}
                |]
            | otherwise -> plaintext

        errPage = case err of
          NotFound -> [whamlet|

_{MsgErrorResponseNotFound}|] InternalError err' -> encrypted err' [whamlet|

#{err'}|] InvalidArgs errs -> [whamlet|