1 {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
2 {-# LANGUAGE DataKinds #-}
3 {-# LANGUAGE TemplateHaskell #-}
4 {-# LANGUAGE TypeOperators #-}
5 module Data.Gargantext.Server
11 import Prelude hiding (null)
13 import Control.Monad.IO.Class
16 import Network.Wai.Handler.Warp
18 import Servant.Multipart
19 import Database.PostgreSQL.Simple (Connection, connect)
22 import Data.Gargantext.Types.Main (Node, NodeId)
23 import Data.Gargantext.Database.Node (getNodesWithParentId, getNode)
24 import Data.Gargantext.Database.Private (infoGargandb)
26 -- | TODO, use MOCK feature of Servant to generate fake data (for tests)
28 type NodeAPI = Get '[JSON] (Node Value)
29 :<|> "children" :> Get '[JSON] [Node Value]
31 type API = "roots" :> Get '[JSON] [Node Value]
32 :<|> "node" :> Capture "id" Int :> NodeAPI
33 :<|> "echo" :> Capture "string" String :> Get '[JSON] String
34 :<|> "upload" :> MultipartForm MultipartData :> Post '[JSON] String
36 -- :<|> "node" :> Capture "id" Int :> Get '[JSON] Node
38 server :: Connection -> Server API
40 = liftIO (getNodesWithParentId conn null)
48 startGargantext :: IO ()
50 print ("Starting server on port " ++ show port)
51 conn <- connect infoGargandb
56 -- | TODO App type, the main monad in which the bot code is written with.
57 -- Provide config, state, logs and IO
58 -- type App m a = ( MonadState AppState m
59 -- , MonadReader Conf m
60 -- , MonadLog (WithSeverity Doc) m
61 -- , MonadIO m) => m a
62 -- Thanks @yannEsposito for this.
63 app :: Connection -> Application
64 app = serve api . server
69 nodeAPI :: Connection -> NodeId -> Server NodeAPI
71 = liftIO (getNode conn id')
72 :<|> liftIO (getNodesWithParentId conn (toNullable id'))
76 -- TODO Is it possible to adapt the function according to iValue input ?
77 upload :: MultipartData -> Handler String
78 upload multipartData = do
81 forM_ (inputs multipartData) $ \input ->
82 putStrLn $ " " ++ show (iName input)
83 ++ " -> " ++ show (iValue input)
85 forM_ (files multipartData) $ \file -> do
86 content <- readFile (fdFilePath file)
87 putStrLn $ "Content of " ++ show (fdFileName file)
88 ++ " at " ++ fdFilePath file