packages feed

RESTng-0.1: Example/Tags.hs

module Tags where

import Prelude hiding (div,span)
import Data.List (intersperse)
import Control.Monad (liftM2)
import Text.ParserCombinators.Parsec (parse)
import Database.HDBC (SqlValue, toSql)

import Text.CxML hiding (title)
import Text.YuiGrid

import RESTng.RqHandlers
import RESTng.System
import RESTng.Resources (restrictByTagQuery)

import Resource
import InLineCSS
import Common


tagsHandler :: RqHandlerT RESTng RESTngResp
tagsHandler = under "Tag" $ withDocNameString $ \tagname -> 
               okBoxesM [
                         return $ bigText $ smallMarginBottomCSS $ nearTop $ boxInMain $ t ("Resources tagged with " ++ tagname),
                         highlyRatedBooksWithTagBox tagname >>= return . nearLeft . setColumnsVote 2 . commonLayoutHints,
                         recentBooksWithTagBox tagname >>= return . nearRight . setColumnsVote 2 . commonLayoutHints
                        ]
             where
               commonLayoutHints = smallMarginBottomCSS . giveBorderCSS . inMain


--------------------------------------------------------
--- Most highly rated books with specific tag -------
--------------------------------------------------------
highlyRatedBooksWithTagBox :: String -> RESTng (GridElement RequestContext)
highlyRatedBooksWithTagBox tagname = 
                         do booksAndRatings <- ratedResourcesData bookProxy (highlyRatedResourcesWithTagQuery bookProxy tagname)
                            return $ withTitleBox "Most highly rated books:" $ toBox (ratedBooksView booksAndRatings)


highlyRatedResourcesWithTagQuery :: RelationalResource a => Proxy a -> String -> SqlCommand
highlyRatedResourcesWithTagQuery pr tagname = restrictByTagQuery pr tagname (highlyRatedResourcesQuery pr)


-------------------------------------------
--- Most recent books with this tag ----
-------------------------------------------
recentBooksWithTagBox :: String -> RESTng (GridElement RequestContext)
recentBooksWithTagBox tagname = 
                         do books <- recentBooksWithTagData tagname
                            return $ withTitleBox "Recent books:" $ toBox (booksShow books)


recentBooksWithTagData :: String -> RESTng [Book]
recentBooksWithTagData tagname = liftHDBC_0 $ runQueryN sqlRecordParser (recentBooksWithTagQuery tagname)

recentBooksWithTagQuery :: String -> SqlCommand
recentBooksWithTagQuery tagname = setOrderDesc (tableName bookProxy ++ ".id") $
                                      restrictByTagQuery bookProxy tagname $ 
                                       sqlSelect [] [] bookProxy


booksShow :: [Book] -> CxML RequestContext
booksShow = concatCxML . intersperse (br +++ br ) . map showShortURLHtml