Skip to content

Commit 67f3b42

Browse files
committed
Add querying/rendering of our blog posts
1 parent bcecc3c commit 67f3b42

File tree

3 files changed

+40
-0
lines changed

3 files changed

+40
-0
lines changed
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<apply template="base">
2+
<h1>Blog Posts</h1>
3+
<ul>
4+
<blogPosts>
5+
<li>
6+
<strong><title/></strong>
7+
<p><postContent/></p>
8+
</li>
9+
</blogPosts>
10+
</ul>
11+
</apply>

src/Models.hs

+13
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,26 @@ module Models where
1010

1111
import Data.Text
1212
import Data.Time.Clock
13+
import Control.Monad.IO.Class (MonadIO)
1314

1415
import Database.Persist.TH
1516
import Snap.Snaplet.Auth.Backends.Persistent (authEntityDefs)
1617

18+
import qualified Database.Esqueleto as E
19+
1720
share [mkPersist sqlSettings, mkMigrate "migrateAll"] $ authEntityDefs ++ [persistLowerCase|
1821
BlogPost
1922
title String
2023
content String
2124
deriving Eq Show
2225
|]
26+
27+
selectBlogPosts :: MonadIO m => E.SqlPersistT m [BlogPost]
28+
selectBlogPosts = do
29+
posts <-
30+
E.select $
31+
E.from $ \blogPost -> do
32+
E.orderBy [E.asc (blogPost E.^. BlogPostTitle)]
33+
E.limit 3
34+
return blogPost
35+
return $ E.entityVal <$> posts

src/Site.hs

+16
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,28 @@ handleNewUser = method GET handleForm <|> method POST handleFormSubmit
6363
handleFormSubmit = registerUser "login" "password" >> redirect "/"
6464

6565

66+
------------------------------------------------------------------------------
67+
-- | Handle the blog posts view when logged in
68+
handleBlogPosts :: Handler App (AuthManager App) ()
69+
handleBlogPosts = do
70+
blogPosts <- runPersist selectBlogPosts
71+
renderWithSplices "blog_posts" (splices blogPosts)
72+
where
73+
splices bps =
74+
"blogPosts" ## I.mapSplices (I.runChildrenWith . splicesFromBlogPost) bps
75+
76+
splicesFromBlogPost p = do
77+
"title" ## I.textSplice (T.pack (blogPostTitle p))
78+
"postContent" ## I.textSplice (T.pack (blogPostContent p))
79+
80+
6681
------------------------------------------------------------------------------
6782
-- | The application's routes.
6883
routes :: [(ByteString, Handler App App ())]
6984
routes = [ ("/login", with auth handleLoginSubmit)
7085
, ("/logout", with auth handleLogout)
7186
, ("/new_user", with auth handleNewUser)
87+
, ("/posts", with auth handleBlogPosts)
7288
, ("", serveDirectory "static")
7389
]
7490

0 commit comments

Comments
 (0)