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 13, 2024
1 parent 0fdaf85 commit 29b0a0d
Show file tree
Hide file tree
Showing 8 changed files with 520 additions and 181 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 @@ -61,7 +61,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 +76,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 @@ -92,10 +93,11 @@ verifyRCAsync ::
CoreMetrics m
) =>
HyperVergeTypes.HyperVergeVerificationCfg ->
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 +112,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.HyperVergeVerificationCfg ->
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 Down Expand Up @@ -157,5 +204,5 @@ validateHyperVergeGetVerificationStatusResp resp = do
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 29b0a0d

Please sign in to comment.