[errors] better handling of garg job errors

JSON should now be better so that the UI can handle it in task async
handler.
parent a9c8116f
Pipeline #4242 failed with stages
in 43 minutes and 59 seconds
...@@ -48,6 +48,7 @@ import qualified Gargantext.Utils.Jobs.Monad as Jobs ...@@ -48,6 +48,7 @@ import qualified Gargantext.Utils.Jobs.Monad as Jobs
import Servant import Servant
import Servant.Job.Async import Servant.Job.Async
import Servant.Job.Core (HasServerError(..), serverError) import Servant.Job.Core (HasServerError(..), serverError)
import qualified Servant.Job.Types as SJ
class HasJoseError e where class HasJoseError e where
_JoseError :: Prism' e Jose.Error _JoseError :: Prism' e Jose.Error
...@@ -120,6 +121,15 @@ data GargError ...@@ -120,6 +121,15 @@ data GargError
makePrisms ''GargError makePrisms ''GargError
instance ToJSON GargError where instance ToJSON GargError where
toJSON (GargJobError s) =
object [ ("status", toJSON SJ.IsFailure)
, ("log", emptyArray)
, ("id", String id)
, ("error", String $ Text.pack $ show s) ]
where
id = case s of
Jobs.InvalidMacID i -> i
_ -> ""
toJSON err = object [("error", String $ Text.pack $ show err)] toJSON err = object [("error", String $ Text.pack $ show err)]
instance Exception GargError instance Exception GargError
......
...@@ -18,7 +18,7 @@ import Control.Lens ((^.)) ...@@ -18,7 +18,7 @@ import Control.Lens ((^.))
import Control.Monad.Except (withExceptT) import Control.Monad.Except (withExceptT)
import Control.Monad.Reader (runReaderT) import Control.Monad.Reader (runReaderT)
import qualified Data.Aeson as Aeson import qualified Data.Aeson as Aeson
import Data.Text (Text, pack) import Data.Text (Text)
import Data.Version (showVersion) import Data.Version (showVersion)
import Servant import Servant
import Servant.Swagger.UI (swaggerSchemaUIServer) import Servant.Swagger.UI (swaggerSchemaUIServer)
...@@ -95,4 +95,4 @@ showAsServantJSONErr (GargNodeError err@NoCorpusFound) = err404 { errBody = Aeso ...@@ -95,4 +95,4 @@ showAsServantJSONErr (GargNodeError err@NoCorpusFound) = err404 { errBody = Aeso
showAsServantJSONErr (GargNodeError err@NoUserFound) = err404 { errBody = Aeson.encode err } showAsServantJSONErr (GargNodeError err@NoUserFound) = err404 { errBody = Aeson.encode err }
showAsServantJSONErr (GargNodeError err@(DoesNotExist {})) = err404 { errBody = Aeson.encode err } showAsServantJSONErr (GargNodeError err@(DoesNotExist {})) = err404 { errBody = Aeson.encode err }
showAsServantJSONErr (GargServerError err) = err showAsServantJSONErr (GargServerError err) = err
showAsServantJSONErr a = err500 { errBody = Aeson.encode $ Aeson.object [ ( "error", Aeson.String $ pack $ show a ) ] } showAsServantJSONErr a = err500 { errBody = Aeson.encode a }
...@@ -113,7 +113,7 @@ findJob jid = do ...@@ -113,7 +113,7 @@ findJob jid = do
data JobError data JobError
= InvalidIDType = InvalidIDType
| IDExpired | IDExpired
| InvalidMacID | InvalidMacID T.Text
| UnknownJob | UnknownJob
| JobException SomeException | JobException SomeException
deriving Show deriving Show
...@@ -127,7 +127,7 @@ checkJID (SJ.PrivateID tn n t d) = do ...@@ -127,7 +127,7 @@ checkJID (SJ.PrivateID tn n t d) = do
js <- getJobsSettings js <- getJobsSettings
if | tn /= "job" -> return (Left InvalidIDType) if | tn /= "job" -> return (Left InvalidIDType)
| now > addUTCTime (fromIntegral $ jsIDTimeout js) t -> return (Left IDExpired) | now > addUTCTime (fromIntegral $ jsIDTimeout js) t -> return (Left IDExpired)
| d /= SJ.macID tn (jsSecretKey js) t n -> return (Left InvalidMacID) | d /= SJ.macID tn (jsSecretKey js) t n -> return (Left $ InvalidMacID $ T.pack d)
| otherwise -> return $ Right (SJ.PrivateID tn n t d) | otherwise -> return $ Right (SJ.PrivateID tn n t d)
withJob withJob
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment