quotes-api/app/Main.hs

62 lines
1.6 KiB
Haskell
Raw Normal View History

2023-02-03 22:40:28 +00:00
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DeriveGeneric #-}
2023-02-03 13:45:16 +00:00
module Main where
2023-02-03 22:40:28 +00:00
import Data.Text (Text(..))
import Data.Aeson
2023-02-03 13:45:16 +00:00
import qualified MyLib (someFunc)
2023-02-03 22:40:28 +00:00
import Database.SQLite.Simple
import Database.SQLite.Simple.FromRow (FromRow)
import Database.SQLite.Simple.FromField (fromField)
import Database.SQLite.Simple.QQ
import Network.Wai
import Network.Wai.Handler.Warp
import Deriving.Aeson
import Data.Proxy
import Servant
import Control.Monad.IO.Class
data Quote = Quote { qQuote :: Text
, qAuthor :: Text
, qBook :: Text
} deriving (Show, Eq, Ord, Generic)
deriving (FromJSON,ToJSON)
via CustomJSON '[OmitNothingFields, FieldLabelModifier '[StripPrefix "q", CamelToSnake]] Quote
instance FromRow Quote where
fromRow = Quote <$> field <*> field <*> field
2023-02-03 13:45:16 +00:00
main :: IO ()
main = do
putStrLn "Hello, Haskell!"
2023-02-03 22:40:28 +00:00
let dbfile = "quotes.db"
initDb dbfile
runApp dbfile
type API = Get '[JSON] [Quote]
api :: Proxy API
api = Proxy
initDb :: FilePath -> IO ()
initDb dbFile = withConnection dbFile $ \conn ->
execute_ conn
[sql|CREATE TABLE IF NOT EXISTS quotes (quote text non null, author text, book text)|]
server :: FilePath -> Server API
server dbf = listQuotes dbf
listQuotes :: FilePath -> Handler [Quote]
listQuotes db = liftIO $ withConnection db $ \conn -> query_ conn [sql|SELECT * FROM quotes;|]
runApp :: FilePath -> IO ()
runApp dbfile = run 8081 (serve api $ server dbfile)