{-| Module : Gargantext.API.Types Description : Server API main Types Copyright : (c) CNRS, 2017-Present License : AGPL + CECILL v3 Maintainer : team@gargantext.org Stability : experimental Portability : POSIX -} {-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE UndecidableInstances #-} module Gargantext.API.Types where import Control.Lens (Prism', (#)) import Control.Lens.TH (makePrisms) import Control.Monad.Error.Class (MonadError(throwError)) import Crypto.JOSE.Error as Jose import Data.Validity import Servant import Gargantext.Prelude import Gargantext.API.Settings import Gargantext.API.Ngrams import Gargantext.Database.Tree import Gargantext.Core.Types import Gargantext.Database.Utils import Gargantext.Database.Schema.Node class HasServerError e where _ServerError :: Prism' e ServerError serverError :: (MonadError e m, HasServerError e) => ServerError -> m a serverError e = throwError $ _ServerError # e class HasJoseError e where _JoseError :: Prism' e Jose.Error joseError :: (MonadError e m, HasJoseError e) => Jose.Error -> m a joseError = throwError . (_JoseError #) class ThrowAll' e a | a -> e where -- | 'throwAll' is a convenience function to throw errors across an entire -- sub-API -- -- -- > throwAll err400 :: Handler a :<|> Handler b :<|> Handler c -- > == throwError err400 :<|> throwError err400 :<|> err400 throwAll' :: e -> a instance (ThrowAll' e a, ThrowAll' e b) => ThrowAll' e (a :<|> b) where throwAll' e = throwAll' e :<|> throwAll' e -- Really this shouldn't be necessary - ((->) a) should be an instance of -- MonadError, no? instance {-# OVERLAPPING #-} ThrowAll' e b => ThrowAll' e (a -> b) where throwAll' e = const $ throwAll' e instance {-# OVERLAPPABLE #-} (MonadError e m) => ThrowAll' e (m a) where throwAll' = throwError type GargServerC env err m = ( CmdM env err m , HasNodeError err , HasInvalidError err , HasTreeError err , HasServerError err , HasJoseError err , HasRepo env , HasSettings env ) type GargServerT env err m api = GargServerC env err m => ServerT api m type GargServer api = forall env err m. GargServerT env err m api data GargError = GargNodeError NodeError | GargTreeError TreeError | GargInvalidError Validation | GargJoseError Jose.Error | GargServerError ServerError deriving (Show) makePrisms ''GargError instance HasNodeError GargError where _NodeError = _GargNodeError instance HasInvalidError GargError where _InvalidError = _GargInvalidError instance HasTreeError GargError where _TreeError = _GargTreeError instance HasServerError GargError where _ServerError = _GargServerError instance HasJoseError GargError where _JoseError = _GargJoseError