{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
module Main where
------------------------------------------------------------------------------
import Control.Applicative
import Control.Monad.Trans
import Control.Monad.Reader
import Control.Monad.State
import Data.ByteString (ByteString)
import Control.Lens
import Data.Maybe
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import Data.Time.Clock
import qualified Database.PostgreSQL.Simple as P
import Snap
import Snap.Snaplet.Auth
import Snap.Snaplet.Auth.Backends.PostgresqlSimple
import Snap.Snaplet.Heist
import Snap.Snaplet.PostgresqlSimple
import Snap.Snaplet.Session
import Snap.Snaplet.Session.Backends.CookieSession
import Snap.Util.FileServe
import Heist
import Text.XmlHtml hiding (render)
------------------------------------------------------------------------------
data App = App
{ _sess :: Snaplet SessionManager
, _db :: Snaplet Postgres
, _auth :: Snaplet (AuthManager App)
}
makeLenses ''App
instance HasPostgres (Handler b App) where
getPostgresState = with db get
setLocalPostgresState s = local (set (db . snapletValue) s)
------------------------------------------------------------------------------
-- | The application's routes.
routes :: [(ByteString, Handler App App ())]
routes = [ ("/", writeText "hello")
, ("foo", fooHandler)
, ("add/:uname", addHandler)
, ("find/:email", findHandler)
]
fooHandler = do
results <- query_ "select * from snap_auth_user"
liftIO $ print (results :: [AuthUser])
addHandler = do
mname <- getParam "uname"
email <- getParam "email"
let name = maybe "guest" T.decodeUtf8 mname
u <- with auth $ do
createUser name "" >>= \u -> case u of
Left _ -> return u
Right u' -> saveUser (u' {userEmail = T.decodeUtf8 <$> email})
liftIO $ print u
findHandler = do
email <- getParam "email"
env <- with auth get
liftIO $ lookupByEmail env (maybe "" T.decodeUtf8 email) >>= print
------------------------------------------------------------------------------
-- | The application initializer.
app :: SnapletInit App App
app = makeSnaplet "app" "An snaplet example application." Nothing $ do
s <- nestSnaplet "" sess $
initCookieSessionManager "site_key.txt" "_cookie" Nothing Nothing
d <- nestSnaplet "db" db pgsInit
a <- nestSnaplet "auth" auth $ initPostgresAuth sess d
addRoutes routes
return $ App s d a
main :: IO ()
main = serveSnaplet defaultConfig app