module Yesod.Comments.Storage
(
getCommentPersist
, storeCommentPersist
, deleteCommentPersist
, loadCommentsPersist
, migrateComments
) where
import Yesod
import Yesod.Comments.Core (Comment(..), ThreadId, CommentId)
import Yesod.Goodies.Markdown (Markdown(..))
import Data.Time.Clock (UTCTime)
import qualified Data.Text as T
share2 mkPersist (mkMigrate "migrateComments") [persist|
SqlComment
threadId ThreadId Eq noreference
commentId CommentId Eq Asc noreference
timeStamp UTCTime
ipAddress T.Text
userName T.Text
userEmail T.Text
content Markdown
isAuth Bool
UniqueSqlComment threadId commentId
|]
toSqlComment :: Comment -> SqlComment
toSqlComment comment = SqlComment
{ sqlCommentThreadId = threadId comment
, sqlCommentCommentId = commentId comment
, sqlCommentTimeStamp = timeStamp comment
, sqlCommentIpAddress = ipAddress comment
, sqlCommentUserName = userName comment
, sqlCommentUserEmail = userEmail comment
, sqlCommentContent = content comment
, sqlCommentIsAuth = isAuth comment
}
fromSqlComment :: SqlComment -> Comment
fromSqlComment sqlComment = Comment
{ threadId = sqlCommentThreadId sqlComment
, commentId = sqlCommentCommentId sqlComment
, timeStamp = sqlCommentTimeStamp sqlComment
, ipAddress = sqlCommentIpAddress sqlComment
, userName = sqlCommentUserName sqlComment
, userEmail = sqlCommentUserEmail sqlComment
, content = sqlCommentContent sqlComment
, isAuth = sqlCommentIsAuth sqlComment
}
getCommentPersist :: (YesodPersist m, PersistBackend (YesodDB m (GGHandler s m IO))) => ThreadId -> CommentId -> GHandler s m (Maybe Comment)
getCommentPersist tid cid = return . fmap (fromSqlComment . snd) =<< runDB (getBy $ UniqueSqlComment tid cid)
storeCommentPersist :: (YesodPersist m, PersistBackend (YesodDB m (GGHandler s m IO))) => Comment -> GHandler s m ()
storeCommentPersist c = return . const () =<< runDB (insert $ toSqlComment c)
deleteCommentPersist :: (YesodPersist m, PersistBackend (YesodDB m (GGHandler s m IO))) => Comment -> GHandler s m ()
deleteCommentPersist c = return . const () =<< runDB (deleteBy $ UniqueSqlComment (threadId c) (commentId c))
loadCommentsPersist :: (YesodPersist m, PersistBackend (YesodDB m (GGHandler s m IO))) => Maybe ThreadId -> GHandler s m [Comment]
loadCommentsPersist (Just tid) = return . fmap (fromSqlComment . snd) =<< runDB (selectList [SqlCommentThreadIdEq tid] [SqlCommentCommentIdAsc] 0 0)
loadCommentsPersist Nothing = return . fmap (fromSqlComment . snd) =<< runDB (selectList [] [SqlCommentCommentIdAsc] 0 0)