Skip to content

Commit

Permalink
Backend/enhancement: HyperVerge DL API Integration.
Browse files Browse the repository at this point in the history
  • Loading branch information
ratnadeep-99 committed Nov 18, 2024
1 parent 0fdaf85 commit 00d26ed
Show file tree
Hide file tree
Showing 11 changed files with 567 additions and 202 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ data HyperVergeError
| HVBadRequestError Text
| HVError Text
| HVBadInputError Text
| HVMissingPayloadError
| HVMissingPayloadError Text
deriving (Eq, Show, IsBecknAPIError)

instanceExceptionWithParent 'HTTPException ''HyperVergeError
Expand All @@ -36,21 +36,21 @@ instance IsBaseError HyperVergeError where
HVBadRequestError msg -> Just $ "Bad Request with message: " <> msg
HVError msg -> Just $ "HyperVerge Error with message: " <> msg
HVBadInputError msg -> Just $ "Bad Input with message: " <> msg
HVMissingPayloadError -> Just "Missing payload in a 200 Hyperverge Response !!!!!"
HVMissingPayloadError msg -> Just $ "Missing payload in a 200 Hyperverge Response !!!!! Due to : " <> msg

instance IsHTTPError HyperVergeError where
toErrorCode = \case
HVUnauthorizedError -> "HV_UNAUTHORIZED"
HVBadRequestError _ -> "HV_BAD_REQUEST"
HVError _ -> "HV_ERROR"
HVBadInputError _ -> "HV_BAD_INPUT"
HVMissingPayloadError -> "HV_MISSING_PAYLOAD_ERROR"
HVMissingPayloadError _ -> "HV_MISSING_PAYLOAD_ERROR"

toHttpCode = \case
HVUnauthorizedError -> E401
HVBadRequestError _ -> E400
HVError _ -> E400
HVBadInputError _ -> E400
HVMissingPayloadError -> E400
HVMissingPayloadError _ -> E400

instance IsAPIError HyperVergeError
2 changes: 2 additions & 0 deletions lib/mobility-core/src/Kernel/External/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ instance ToHttpApiData Language where

type ServiceFlow m r = (EncFlow m r, EsqDBFlow m r, CacheFlow m r)

type VerificationFlow m r = (MonadFlow m, CacheFlow m r, EsqDBFlow m r, MonadReader r m, EncFlow m r)

data SchedulerType = RedisBased | DbBased deriving (Show, Enum, Eq, Read, Generic, FromDhall)

type HasSchedulerName r = HasField "schedulerSetName" r Text
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ verifyRC req = do
pucValidityUpto = Nothing,
manufacturerModel = res.manufacturerModel,
mYManufacturing = Nothing,
colour = Nothing,
color = Nothing,
fuelType = res.fuelType,
bodyType = res.bodyType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

module Kernel.External.Verification.HyperVerge.Flow where

import qualified Data.Aeson as DA
import qualified Data.Text as DT
import EulerHS.Types (EulerClient, ManagerSelector (..), client)
import Kernel.External.Encryption
Expand All @@ -24,8 +25,9 @@ import Kernel.Prelude
import Kernel.Tools.Metrics.CoreMetrics (CoreMetrics)
import Kernel.Types.Error (ExternalAPICallError (..))
import Kernel.Utils.Common
import qualified Kernel.Utils.Text as KUT
import Servant hiding (throwError)
import Servant.Client.Core (ClientError)
import Servant.Client.Core

type HyperVergeSdkVerificationAPI =
"v1"
Expand Down Expand Up @@ -61,7 +63,7 @@ checkHyperVergeSdkVerificationResponse ::
checkHyperVergeSdkVerificationResponse url resp = fromEitherM (hyperVergeError url) resp >>= validateHyperVergeSdkVerificationResponse

hyperVergeError :: BaseUrl -> ClientError -> ExternalAPICallError
hyperVergeError = ExternalAPICallError (Just "HYPERVERGE_SDK_VERIFICATION_API_ERROR")
hyperVergeError = ExternalAPICallError (Just "HYPERVERGE_API_ERROR")

validateHyperVergeSdkVerificationResponse :: (MonadThrow m, Log m) => HyperVergeTypes.HyperVergeSdkVerificationRes -> m HyperVergeTypes.HyperVergeSdkVerificationRes
validateHyperVergeSdkVerificationResponse resp = do
Expand All @@ -76,13 +78,14 @@ validateHyperVergeSdkVerificationResponse resp = do
type VerifyRCAsyncAPI =
"v1"
:> "async"
:> "fetchDetailedRC"
:> "RCVerification"
:> Header "appId" Text
:> Header "appKey" Text
:> Header "transactionId" Text
:> ReqBody '[JSON] HyperVergeTypes.VerifyRCAsyncReq
:> Post '[JSON] HyperVergeTypes.VerifyRCAsyncResp

rcAsyncVerificationClient :: Maybe Text -> Maybe Text -> HyperVergeTypes.VerifyRCAsyncReq -> EulerClient HyperVergeTypes.VerifyRCAsyncResp
rcAsyncVerificationClient :: Maybe Text -> Maybe Text -> Maybe Text -> HyperVergeTypes.VerifyRCAsyncReq -> EulerClient HyperVergeTypes.VerifyRCAsyncResp
rcAsyncVerificationClient = client (Proxy :: Proxy VerifyRCAsyncAPI)

verifyRCAsync ::
Expand All @@ -91,11 +94,12 @@ verifyRCAsync ::
MonadFlow m,
CoreMetrics m
) =>
HyperVergeTypes.HyperVergeVerificationCfg ->
HyperVergeTypes.HyperVergeRCDLVerificationConfig ->
Text ->
HyperVergeTypes.VerifyRCAsyncReq ->
m HyperVergeTypes.VerifyRCAsyncResp
verifyRCAsync cfg req = do
decrypt cfg.appKey >>= \key -> callAPI' (Just $ ManagerSelector $ DT.pack hyperVergeHttpManagerKey) cfg.url (rcAsyncVerificationClient (Just cfg.appId) (Just key) req) "HV-RC_ASYNC_VERIFICATION-API" (Proxy @VerifyRCAsyncAPI) >>= checkHyperVergeRCAsyncVerificationResp cfg.url
verifyRCAsync cfg transactionId req = do
decrypt cfg.appKey >>= \key -> callAPI' (Just $ ManagerSelector $ DT.pack hyperVergeHttpManagerKey) cfg.url (rcAsyncVerificationClient (Just cfg.appId) (Just key) (Just transactionId) req) "HV-RC_ASYNC_VERIFICATION-API" (Proxy @VerifyRCAsyncAPI) >>= checkHyperVergeRCAsyncVerificationResp cfg.url

checkHyperVergeRCAsyncVerificationResp ::
( HasCallStack,
Expand All @@ -110,6 +114,51 @@ checkHyperVergeRCAsyncVerificationResp url resp = fromEitherM (hyperVergeError u
validateHyperVergeRCAsyncVerificationResponse :: (MonadThrow m, Log m) => HyperVergeTypes.VerifyRCAsyncResp -> m HyperVergeTypes.VerifyRCAsyncResp
validateHyperVergeRCAsyncVerificationResponse resp = do
logDebug $ "HyperVerge RC Verification Response: " <> show resp
case resp.statusCode of
401 -> throwError HVUnauthorizedError
400 -> throwError $ HVBadRequestError (fromMaybe "No Message found in resp or Failed to parse error !!!!" resp.message)
200 -> return resp
_ -> throwError $ HVError ("The response from HV is : " <> show resp)

type VerifyDLAsyncAPI =
"v1"
:> "async"
:> "checkDL"
:> Header "appId" Text
:> Header "appKey" Text
:> Header "transactionId" Text
:> ReqBody '[JSON] HyperVergeTypes.HyperVergeDLVerificationReq
:> Post '[JSON] HyperVergeTypes.HyperVergeDLVerificationResp

dlAsyncVerificationClient :: Maybe Text -> Maybe Text -> Maybe Text -> HyperVergeTypes.HyperVergeDLVerificationReq -> EulerClient HyperVergeTypes.HyperVergeDLVerificationResp
dlAsyncVerificationClient = client (Proxy :: Proxy VerifyDLAsyncAPI)

verifyDLAsync ::
( HasCallStack,
EncFlow m r,
MonadFlow m,
CoreMetrics m
) =>
HyperVergeTypes.HyperVergeRCDLVerificationConfig ->
Text ->
HyperVergeTypes.HyperVergeDLVerificationReq ->
m HyperVergeTypes.HyperVergeDLVerificationResp
verifyDLAsync cfg transactionId req = do
decrypt cfg.appKey >>= \key -> callAPI' (Just $ ManagerSelector $ DT.pack hyperVergeHttpManagerKey) cfg.url (dlAsyncVerificationClient (Just cfg.appId) (Just key) (Just transactionId) req) "HV-DL_ASYNC_VERIFICATION-API" (Proxy @VerifyDLAsyncAPI) >>= checkHyperVergeDLAsyncVerificationResp cfg.url

checkHyperVergeDLAsyncVerificationResp ::
( HasCallStack,
MonadFlow m,
CoreMetrics m
) =>
BaseUrl ->
Either ClientError HyperVergeTypes.HyperVergeDLVerificationResp ->
m HyperVergeTypes.HyperVergeDLVerificationResp
checkHyperVergeDLAsyncVerificationResp url resp = fromEitherM (hyperVergeError url) resp >>= validateHyperVergeDLAsyncVerificationResponse

validateHyperVergeDLAsyncVerificationResponse :: (MonadThrow m, Log m) => HyperVergeTypes.HyperVergeDLVerificationResp -> m HyperVergeTypes.HyperVergeDLVerificationResp
validateHyperVergeDLAsyncVerificationResponse resp = do
logDebug $ "HyperVerge DL Verification Response: " <> show resp
case resp.statusCode of
401 -> throwError HVUnauthorizedError
400 -> throwError $ HVBadRequestError (fromMaybe "No Message found in resp or Failed to parse error !!!!" resp.error)
Expand All @@ -123,9 +172,9 @@ type GetVerificationStatusAPI =
:> Header "appKey" Text
:> Capture "workflowId" Text
:> MandatoryQueryParam "requestId" Text
:> Get '[JSON] HyperVergeTypes.GetVerificationStatusResp
:> Get '[JSON] DA.Value

getVerificationStatusClient :: Maybe Text -> Maybe Text -> Text -> Text -> EulerClient HyperVergeTypes.GetVerificationStatusResp
getVerificationStatusClient :: Maybe Text -> Maybe Text -> Text -> Text -> EulerClient DA.Value
getVerificationStatusClient = client (Proxy :: Proxy GetVerificationStatusAPI)

getVerificationStatus ::
Expand All @@ -134,10 +183,10 @@ getVerificationStatus ::
MonadFlow m,
CoreMetrics m
) =>
HyperVergeTypes.HyperVergeVerificationCfg ->
HyperVergeTypes.HyperVergeRCDLVerificationConfig ->
Text ->
Text ->
m HyperVergeTypes.GetVerificationStatusResp
m (HyperVergeTypes.GetVerificationStatusResp, Text)
getVerificationStatus cfg workflowId reqId = do
decrypt cfg.appKey >>= \key -> callAPI' (Just $ ManagerSelector $ DT.pack hyperVergeHttpManagerKey) cfg.url (getVerificationStatusClient (Just cfg.appId) (Just key) workflowId reqId) "HV-GET_VERIFICATION_RESULT-API" (Proxy @GetVerificationStatusAPI) >>= checkHyperVergeGetVerificationStatusResp cfg.url

Expand All @@ -147,15 +196,20 @@ checkHyperVergeGetVerificationStatusResp ::
CoreMetrics m
) =>
BaseUrl ->
Either ClientError HyperVergeTypes.GetVerificationStatusResp ->
m HyperVergeTypes.GetVerificationStatusResp
checkHyperVergeGetVerificationStatusResp url resp = fromEitherM (hyperVergeError url) resp >>= validateHyperVergeGetVerificationStatusResp
Either ClientError DA.Value ->
m (HyperVergeTypes.GetVerificationStatusResp, Text)
checkHyperVergeGetVerificationStatusResp url resp = fromEitherM (hyperVergeError url) resp >>= \rsp -> (,KUT.encodeToText rsp) <$> (validateHyperVergeGetVerificationStatusResp =<< convertValueToRespType rsp)
where
convertValueToRespType :: (MonadThrow m, Log m) => DA.Value -> m HyperVergeTypes.GetVerificationStatusResp
convertValueToRespType rsp = case DA.fromJSON rsp of
DA.Error err -> throwError $ HVError ("Could not parse HyperVerge getVerificationStatus resp. Reason: " <> DT.pack err <> "Resp: " <> show rsp)
DA.Success pyload -> return pyload

validateHyperVergeGetVerificationStatusResp :: (MonadThrow m, Log m) => HyperVergeTypes.GetVerificationStatusResp -> m HyperVergeTypes.GetVerificationStatusResp
validateHyperVergeGetVerificationStatusResp resp = do
logDebug $ "HyperVerge getVerificationStatus Response: " <> show resp
case resp.statusCode of
401 -> throwError HVUnauthorizedError
400 -> throwError $ HVBadRequestError (fromMaybe "No Message found in resp or Failed to parse error !!!!" resp.message)
200 -> return resp
200 -> if isNothing resp.result then throwError (HVMissingPayloadError $ fromMaybe ("Unknown reason !!!!! Resp : " <> show resp) resp.message) else return resp
_ -> throwError $ HVError ("The response from HV is : " <> show resp)
Loading

0 comments on commit 00d26ed

Please sign in to comment.