Chapter 22. Blog: i18n, Authentication, Authorization, and Database
This chapter presents a simple blog app. It allows an admin to add blog posts via a rich text editor (nicedit), allows logged-in users to comment, and has full i18n support. It is also a good example of using a Persistent database, leveraging Yesod’s authorization system, and using templates.
It is generally recommended to place templates, Persist
entity definitions,
and routing in separate files, but we’ll keep it all in one file here for
convenience. The one exception you’ll see will be i18n messages.
We’ll start off with our language extensions. In scaffolded code, the language extensions are specified in the cabal file, so you won’t need to put this in your individual Haskell files:
{-# LANGUAGE OverloadedStrings, TypeFamilies, QuasiQuotes,
TemplateHaskell, GADTs, FlexibleContexts,
MultiParamTypeClasses, DeriveDataTypeable,
GeneralizedNewtypeDeriving, ViewPatterns #-}
Now our imports:
import
Yesod
import
Yesod.Auth
import
Yesod.Form.Nic
(
YesodNic
,
nicHtmlField
)
import
Yesod.Auth.BrowserId
(
authBrowserId
,
def
)
import
Data.Text
(
Text
)
import
Network.HTTP.Client.TLS
(
tlsManagerSettings
)
import
Network.HTTP.Conduit
(
Manager
,
newManager
)
import
Database.Persist.Sqlite
(
ConnectionPool
,
SqlBackend
,
runSqlPool
,
runMigration
,
createSqlitePool
,
runSqlPersistMPool
)
import
Data.Time
(
UTCTime
,
getCurrentTime
)
import
Control.Applicative
((
<$>
),
(
<*>
),
pure
)
import
Data.Typeable
(
Typeable
)
import
Control.Monad.Logger ...
Get Developing Web Apps with Haskell and Yesod, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.