2 Module : Gargantext.API.Prelude
3 Description : Server API main Types
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
12 {-# LANGUAGE ConstraintKinds #-}
13 {-# LANGUAGE TemplateHaskell #-}
14 {-# LANGUAGE MonoLocalBinds #-}
16 module Gargantext.API.Prelude
17 ( module Gargantext.API.Prelude
23 import Control.Concurrent (threadDelay)
24 import Control.Exception (Exception)
25 import Control.Lens (Prism', (#))
26 import Control.Lens.TH (makePrisms)
27 import Control.Monad.Error.Class (MonadError(..))
28 import Control.Monad.Except (ExceptT)
29 import Control.Monad.Reader (ReaderT)
30 import Crypto.JOSE.Error as Jose
31 import Data.Aeson.Types
34 import Gargantext.API.Admin.Orchestrator.Types
35 import Gargantext.API.Admin.Types
36 import Gargantext.Core.NodeStory
37 import Gargantext.Core.Types
38 import Gargantext.Database.Prelude
39 import Gargantext.Database.Query.Table.Node.Error (NodeError(..), HasNodeError(..))
40 import Gargantext.Database.Query.Tree
41 import Gargantext.Prelude
43 import Servant.Job.Async
44 import Servant.Job.Core (HasServerError(..), serverError)
46 class HasJoseError e where
47 _JoseError :: Prism' e Jose.Error
49 joseError :: (MonadError e m, HasJoseError e) => Jose.Error -> m a
50 joseError = throwError . (_JoseError #)
53 ( HasConnectionPool env
54 , HasSettings env -- TODO rename HasDbSettings
55 , HasJobEnv env JobLog JobLog
66 , ToJSON err -- TODO this is arguable
70 type GargServerC env err m =
72 , HasNodeStory env err m
78 type GargServerT env err m api = GargServerC env err m => ServerT api m
80 type GargServer api = forall env err m. GargServerT env err m api
82 -- This is the concrete monad. It needs to be used as little as possible.
83 type GargM env err = ReaderT env (ExceptT err IO)
84 -- This is the server type using GargM. It needs to be used as little as possible.
85 -- Instead, prefer GargServer, GargServerT.
86 type GargServerM env err api = (EnvC env, ErrC err) => ServerT api (GargM env err)
88 -------------------------------------------------------------------
89 -- | This Type is needed to prepare the function before the GargServer
91 forall env err m. GargNoServer' env err m => m t
93 type GargNoServer' env err m =
95 , HasNodeStory env err m
100 -------------------------------------------------------------------
103 = GargNodeError NodeError
104 | GargTreeError TreeError
105 | GargInvalidError Validation
106 | GargJoseError Jose.Error
107 | GargServerError ServerError
108 deriving (Show, Typeable)
110 makePrisms ''GargError
112 instance ToJSON GargError where
113 toJSON _ = String "SomeGargErrorPleaseReport"
115 instance Exception GargError
117 instance HasNodeError GargError where
118 _NodeError = _GargNodeError
120 instance HasInvalidError GargError where
121 _InvalidError = _GargInvalidError
123 instance HasTreeError GargError where
124 _TreeError = _GargTreeError
126 instance HasServerError GargError where
127 _ServerError = _GargServerError
129 instance HasJoseError GargError where
130 _JoseError = _GargJoseError
133 ------------------------------------------------------------------------
136 simuLogs :: MonadBase IO m
140 simuLogs logStatus t = do
141 _ <- mapM (\n -> simuTask logStatus n t) $ take t [0,1..]
142 pure $ JobLog { _scst_succeeded = Just t
143 , _scst_failed = Just 0
144 , _scst_remaining = Just 0
145 , _scst_events = Just []
148 simuTask :: MonadBase IO m
153 simuTask logStatus cur total = do
154 let m = (10 :: Int) ^ (6 :: Int)
155 liftBase $ threadDelay (m*5)
157 let status = JobLog { _scst_succeeded = Just cur
158 , _scst_failed = Just 0
159 , _scst_remaining = (-) <$> Just total <*> Just cur
160 , _scst_events = Just []
162 printDebug "status" status