{-
Copyright (C) 2017-2018 Johann Lee
This file is part of Yu.
Yu is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Yu is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Yu. If not, see .
-}
{-|
Module : Yu.Core.Model
Description : The module for model
Copyright : (C) 2017-2018 Johann Lee
Maintainer : me@qinka.pro
License : GPL3
Stability : experimental
Portability : unknown
The codes for model
-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Yu.Core.Model
( -- * run database
runDb
, runDbDefault
, -- * model
fetchFrame
, updateFrame
, fetchPost
, updatePost
, fetchResourceB
, updateResourceB
, fetchResourceT
, updateResourceT
, fetchStatic
, updateStatic
, fetchQuery
, updateQuery
, fetchMaybeI
, fetchMaybeR
, -- ** for navgation
fetchNav
, updateNav
, deleteNav
, -- re-export
module Yu.Core.Model.Internal
) where
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.Trans.Control
import Data.Pool
import Text.Blaze.Html (Html (..))
import qualified Text.Blaze.Html as TBH
import Yu.Core.Model.Internal
import Yu.Core.Model.TH
import Yu.Import
import Yu.Import.ByteString (ByteString (..))
import Yu.Import.Text (Text (..))
import Yu.Utils.Handler
import Yu.Utils.Handler
-- | escapted to html
preEscapedToHtml :: Text -> Html
preEscapedToHtml = TBH.preEscapedToHtml
-- | about frame
makeFetch 'preEscapedToHtml "frame" ''Html "html" "frame"
makeUpdate "frame" ''Text "html" "frame"
-- | about post
makeFetch 'preEscapedToHtml "post" ''Html "html" "post"
makeUpdate "post" ''Text "html" "post"
-- | about text resource
makeFetch 'id "resourceT" ''Text "text" "resource"
makeUpdate "resourceT" ''Text "text" "resource"
-- | about binary resource
makeFetch 'fromBinary "resourceB" ''ByteString "binary" "resource"
makeUpdate "resourceB" ''Binary "binary" "resource"
-- | about static
makeFetch 'id "static" ''Text "url" "static"
makeUpdate "static" ''Text "url" "static"
-- | about query
makeFetch 'id "query" ''Text "var" "query"
makeUpdate "query" ''Text "var" "query"
-- | fetch maybe index
fetchMaybeI :: MonadIO m
=> (ResT -> Action m (Maybe a)) -- ^ funcion for action
-> [Text] -- ^ index
-> Action m (Maybe a)
fetchMaybeI mf idx =
fetchRes idx >>= fetchMaybeR mf
-- | fetch maybe resource
fetchMaybeR :: MonadIO m
=> (ResT -> Action m (Maybe a)) -- ^ function for action
-> Maybe ResT -- ^ index
-> Action m (Maybe a)
fetchMaybeR mf (Just r) = mf r
fetchMaybeR _ _ = return Nothing
-- | fetch the nav
fetchNav :: (MonadBaseControl IO m, MonadIO m)
=> Action m [Nav]
fetchNav = do
cr <- find $ select [] "nav"
navs <- map docToNav <$> rest cr
closeCursor cr
return $ catMaybes navs
-- | update nav
updateNav :: MonadIO m
=> Maybe Text -- ^ label
-> Maybe Text -- ^ url
-> Maybe Int -- ^ order
-> Action m ()
updateNav label url order =
void $ upsert (select ["label" =: label] "nav") $ catMaybes
[ Just ("index" =: label)
, "url" =@ url
, "order" =@ order
]
-- | delete the nav
deleteNav :: MonadIO m
=> Maybe Text -- ^ label ( if it is Nothing, the all nav item will be delete)
-> Action m ()
deleteNav label =
delete $ select (catMaybes ["index" =@ label]) "nav"
-- | run mongo
runDb :: Mongodic site m
=> AccessMode -- ^ access mode
-> Database -- ^ database
-> Action m a -- ^ action
-> m a
runDb am db mf = getPool >>= \pool ->
withResource pool $ \p -> do
(user,pass) <- getDbUP
access p am db $ do
auth user pass
mf
-- | run mongo with default
runDbDefault :: Mongodic site m
=> Action m a -- ^ action
-> m a
runDbDefault mf = do
am <- getDefaultAccessMode
db <- getDefaultDb
runDb am db mf