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 FlexibleContexts #-}
14 {-# LANGUAGE FlexibleInstances #-}
15 {-# LANGUAGE FunctionalDependencies #-}
16 {-# LANGUAGE MultiParamTypeClasses #-}
17 {-# LANGUAGE NoImplicitPrelude #-}
18 {-# LANGUAGE OverloadedStrings #-}
19 {-# LANGUAGE RankNTypes #-}
20 {-# LANGUAGE TemplateHaskell #-}
21 {-# LANGUAGE TypeOperators #-}
22 {-# LANGUAGE UndecidableInstances #-}
24 module Gargantext.API.Prelude
25 ( module Gargantext.API.Prelude
31 import Control.Exception (Exception)
32 import Control.Lens (Prism', (#))
33 import Control.Lens.TH (makePrisms)
34 import Control.Monad.Error.Class (MonadError(throwError))
35 import Control.Monad.Except (ExceptT)
36 import Control.Monad.Reader (ReaderT)
37 import Crypto.JOSE.Error as Jose
38 import Data.Aeson.Types
41 import Gargantext.API.Admin.Orchestrator.Types
42 import Gargantext.API.Admin.Settings
43 import Gargantext.API.Ngrams
44 import Gargantext.Core.Types
45 import Gargantext.Database.Query.Tree
46 import Gargantext.Database.Query.Table.Node.Error (NodeError(..), HasNodeError(..))
47 import Gargantext.Database.Prelude
48 import Gargantext.Prelude
50 import Servant.Job.Async (HasJobEnv)
51 import Servant.Job.Core (HasServerError(..), serverError)
53 class HasJoseError e where
54 _JoseError :: Prism' e Jose.Error
56 joseError :: (MonadError e m, HasJoseError e) => Jose.Error -> m a
57 joseError = throwError . (_JoseError #)
59 class ThrowAll' e a | a -> e where
60 -- | 'throwAll' is a convenience function to throw errors across an entire
64 -- > throwAll err400 :: Handler a :<|> Handler b :<|> Handler c
65 -- > == throwError err400 :<|> throwError err400 :<|> err400
68 instance (ThrowAll' e a, ThrowAll' e b) => ThrowAll' e (a :<|> b) where
69 throwAll' e = throwAll' e :<|> throwAll' e
71 -- Really this shouldn't be necessary - ((->) a) should be an instance of
73 instance {-# OVERLAPPING #-} ThrowAll' e b => ThrowAll' e (a -> b) where
74 throwAll' e = const $ throwAll' e
76 instance {-# OVERLAPPABLE #-} (MonadError e m) => ThrowAll' e (m a) where
77 throwAll' = throwError
79 type GargServerC env err m =
86 , ToJSON err -- TODO this is arguable
90 , HasJobEnv env ScraperStatus ScraperStatus
93 type GargServerT env err m api = GargServerC env err m => ServerT api m
96 forall env err m. GargServerT env err m api
98 -- This is the concrete monad. It needs to be used as little as possible,
99 -- instead, prefer GargServer, GargServerT, GargServerC.
100 type GargServerM env err = ReaderT env (ExceptT err IO)
103 ( HasConnectionPool env
106 , HasJobEnv env ScraperStatus ScraperStatus
111 -------------------------------------------------------------------
112 -- | This Type is needed to prepare the function before the GargServer
113 type GargNoServer' env err m =
120 type GargNoServer t =
121 forall env err m. GargNoServer' env err m => m t
122 -------------------------------------------------------------------
125 = GargNodeError NodeError
126 | GargTreeError TreeError
127 | GargInvalidError Validation
128 | GargJoseError Jose.Error
129 | GargServerError ServerError
130 deriving (Show, Typeable)
132 makePrisms ''GargError
134 instance ToJSON GargError where
135 toJSON _ = String "SomeGargErrorPleaseReport"
137 instance Exception GargError
139 instance HasNodeError GargError where
140 _NodeError = _GargNodeError
142 instance HasInvalidError GargError where
143 _InvalidError = _GargInvalidError
145 instance HasTreeError GargError where
146 _TreeError = _GargTreeError
148 instance HasServerError GargError where
149 _ServerError = _GargServerError
151 instance HasJoseError GargError where
152 _JoseError = _GargJoseError