yesod-dsl-0.1.1.19: codegen/header.cg
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-overlapping-patterns #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
module Handler.~{moduleName m}.Internal where
import Handler.~{moduleName m}.Enums
import Handler.~{moduleName m}.Esqueleto
import qualified Handler.~{moduleName m}.PathPieces as PP
import Prelude
import Control.Monad (forM_, when)
import Control.Monad.Catch (MonadThrow)
import Database.Esqueleto
import Database.Esqueleto.Internal.Sql (unsafeSqlBinOp, unsafeSqlExtractSubField, UnsafeSqlFunctionArgument)
import qualified Database.Persist as P
import Database.Persist.TH
import Yesod.Auth (requireAuth, requireAuthId, YesodAuth, AuthId, YesodAuthPersist)
import Yesod.Core hiding (fileName, fileContentType)
import Yesod.Persist (runDB, YesodPersist, YesodPersistBackend)
import Data.Aeson ((.:), (.:?), (.!=), FromJSON, parseJSON, decode)
import Data.Aeson.TH
import Data.Int
import Data.Word
import Data.Time
import Data.Text.Encoding (encodeUtf8)
import Data.Typeable (Typeable)
import qualified Data.Attoparsec as AP
import qualified Data.Aeson as A
import qualified Data.Aeson.Types as AT
import qualified Data.ByteString.Lazy as LBS
import Data.Maybe
import qualified Data.Text.Read
import qualified Data.Text as T
import Data.String (IsString(..))
import Data.Text (Text)
import qualified Data.List as DL
import Control.Monad (mzero)
import Control.Monad.Trans.Resource (runResourceT)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
import qualified Network.HTTP.Conduit as C
import qualified Network.Wai as W
import Data.Conduit.Lazy (lazyConsume)
import Network.HTTP.Types (status200, status400, status403, status404)
import Blaze.ByteString.Builder.ByteString (fromByteString)
import Control.Applicative ((<$>), (<*>))
import qualified Data.HashMap.Lazy as HML
import qualified Data.HashMap.Strict as HMS
import qualified Data.Text.Lazy.Builder as TLB
data ~{moduleName m} = ~{moduleName m}
data FilterJsonMsg = FilterJsonMsg {
filterJsonMsg_type :: Text,
filterJsonMsg_value :: Text,
filterJsonMsg_field :: Text,
filterJsonMsg_property :: Text,
filterJsonMsg_comparison :: Text
}
filterJsonMsg_field_or_property :: FilterJsonMsg -> Text
filterJsonMsg_field_or_property fjm
| not $ T.null $ filterJsonMsg_field fjm = filterJsonMsg_field fjm
| otherwise = filterJsonMsg_property fjm
instance FromJSON FilterJsonMsg where
parseJSON (A.Object v) = FilterJsonMsg <$>
v .:? "type" .!= "string" <*>
(parseStringOrInt v) <*>
v .:? "field" .!= "" <*>
v .:? "property" .!= "" <*>
v .:? "comparison" .!= "eq"
parseJSON _ = mzero
instance IsString (Maybe Text) where
fromString "" = Nothing
fromString a = Just $ T.pack a
parseStringOrInt :: HMS.HashMap Text A.Value -> AT.Parser Text
parseStringOrInt hm = case HMS.lookup "value" hm of
Just (A.Number n) -> return $ T.pack $ show n
Just (A.String s) -> return s
_ -> mzero
data SortJsonMsg = SortJsonMsg {
sortJsonMsg_property :: Text,
sortJsonMsg_direction :: Text
}
$(deriveJSON defaultOptions{fieldLabelModifier = drop 12} ''SortJsonMsg)
-- defaultFilterOp :: forall v typ. PersistField typ => Text -> EntityField v typ -> typ -> Filter v
defaultFilterOp "eq" = (==.)
defaultFilterOp "neq" = (!=.)
defaultFilterOp "lt" = (<.)
defaultFilterOp "gt" = (>.)
defaultFilterOp "le" = (<=.)
defaultFilterOp "ge" = (>=.)
defaultFilterOp _ = (==.)
ilike = unsafeSqlBinOp " ILIKE "
is = unsafeSqlBinOp " IS "
extractSubField :: UnsafeSqlFunctionArgument a => TLB.Builder -> a -> SqlExpr (Database.Esqueleto.Value Double)
extractSubField = unsafeSqlExtractSubField
getDefaultFilter maybeGetParam defaultFilterJson p = do
f <- maybe maybeGetParam Just getFilter
PP.fromPathPiece f
where
getFilter = do
j <- defaultFilterJson
v <- DL.find (\fjm -> filterJsonMsg_property fjm == p) j
return (filterJsonMsg_value v)
hasDefaultFilter maybeGetParam defaultFilterJson p = isJust $
maybe maybeGetParam Just getFilter
where
getFilter = do
j <- defaultFilterJson
v <- DL.find (\fjm -> filterJsonMsg_property fjm == p) j
return (filterJsonMsg_value v)