Files
quotes-api/app/Main.hs

74 lines
1.9 KiB
Haskell
Raw Normal View History

2023-02-03 23:40:28 +01:00
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE DataKinds #-}
2023-02-27 23:46:29 +05:30
{-# LANGUAGE TypeOperators #-}
2023-02-03 14:45:16 +01:00
module Main where
2023-03-05 16:46:56 +05:30
import Database.SQLite.Simple hiding ((:.))
2023-02-03 23:40:28 +01:00
import Database.SQLite.Simple.QQ
import Network.Wai.Handler.Warp
import Data.Proxy
import Servant
import Control.Monad.IO.Class
2023-03-05 15:08:02 +05:30
import Servant.HTML.Blaze
2023-03-05 16:46:56 +05:30
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8)
import Data.ByteString.Lazy (fromStrict)
2023-02-03 23:40:28 +01:00
2023-02-27 23:46:29 +05:30
import Api.Types
import qualified Parsers.KOReader as KO
import qualified Parsers.Readwise as RW
2023-03-05 15:08:02 +05:30
import Config
import Options.Applicative
2023-04-13 23:43:39 +02:00
import Database
2023-02-03 14:45:16 +01:00
2023-03-05 15:08:02 +05:30
type API = Get '[HTML] Quote
:<|> "quotes" :> Get '[JSON] [Quote]
2023-02-27 23:46:29 +05:30
:<|> "quote" :> "random" :> Get '[JSON] Quote
2023-03-05 15:08:02 +05:30
:<|> "today" :> Get '[HTML] Quote
2023-04-13 23:46:43 +02:00
2023-03-05 16:46:56 +05:30
2023-02-03 23:40:28 +01:00
api :: Proxy API
api = Proxy
2023-11-09 22:29:32 +01:00
2023-02-27 23:46:29 +05:30
-- | TODO: readerT
2023-02-03 23:40:28 +01:00
server :: FilePath -> Server API
2023-04-11 11:02:42 +02:00
server dbf = randomQuote dbf
:<|> listQuotes dbf
:<|> randomQuote dbf
:<|> randomQuote dbf
2023-03-05 16:46:56 +05:30
2023-02-27 23:46:29 +05:30
-- | API begins here
randomQuote :: FilePath -> Handler Quote
randomQuote db = do
2023-03-05 16:46:56 +05:30
qts <- liftIO $ withConnection db $ \c -> query_ c qry
case length qts of
2023-02-27 23:46:29 +05:30
0 -> undefined
_ -> pure (head qts)
where
qry = [sql|SELECT * FROM quotes ORDER BY RANDOM();|]
2023-02-03 23:40:28 +01:00
listQuotes :: FilePath -> Handler [Quote]
listQuotes db = liftIO $ withConnection db $ \conn -> query_ conn [sql|SELECT * FROM quotes;|]
2023-02-27 23:46:29 +05:30
addKoReader :: FilePath -> KO.KoHighlight -> Handler NoContent
addKoReader db hl = do
2023-04-13 23:43:39 +02:00
liftIO $ insertQts db (KO.parse hl)
2023-02-27 23:46:29 +05:30
pure NoContent
addReadwise :: FilePath -> T.Text -> Handler NoContent
addReadwise db hl = do
let
qts = RW.parse (fromStrict $ encodeUtf8 hl)
liftIO $ print $ show qts
pure NoContent
2023-03-05 15:08:02 +05:30
runApp :: AppConfig -> IO ()
runApp c = run (appPort c) (serve api $ server (appDbFile c))
2023-03-05 15:08:02 +05:30
main :: IO ()
main = do
conf <- execParser parserOpts
putStrLn $ "running with conf" <> show conf
initDb (appDbFile conf)
runApp conf