diff --git a/craftgate/adapter/fraud_adapter.py b/craftgate/adapter/fraud_adapter.py index a2ff176..e14465a 100644 --- a/craftgate/adapter/fraud_adapter.py +++ b/craftgate/adapter/fraud_adapter.py @@ -5,10 +5,12 @@ from craftgate.request.fraud_add_card_fingerprint_to_list_request import FraudAddCardFingerprintToListRequest from craftgate.request.fraud_value_list_request import FraudValueListRequest from craftgate.request.search_fraud_checks_request import SearchFraudChecksRequest +from craftgate.request.search_fraud_rule_request import SearchFraudRuleRequest from craftgate.request.update_fraud_check_request import UpdateFraudCheckRequest from craftgate.request_options import RequestOptions from craftgate.response.fraud_all_value_lists_response import FraudAllValueListsResponse from craftgate.response.fraud_check_list_response import FraudCheckListResponse +from craftgate.response.fraud_rule_response import FraudRuleResponse from craftgate.response.fraud_value_list_response import FraudValueListResponse from craftgate.utils.request_query_params_builder import RequestQueryParamsBuilder @@ -30,6 +32,18 @@ def search_fraud_checks(self, request: SearchFraudChecksRequest) -> FraudCheckLi response_type=FraudCheckListResponse ) + def search_fraud_rules(self, request: SearchFraudRuleRequest) -> FraudRuleResponse: + query = RequestQueryParamsBuilder.build_query_params(request) + path = "/fraud/v1/rules" + query + headers = self._create_headers(None, path) + return self._http_client.request( + method="GET", + url=self.request_options.base_url + path, + headers=headers, + body=None, + response_type=FraudCheckListResponse + ) + def update_fraud_check_status(self, id: int, fraud_check_status: FraudCheckStatus) -> None: path = "/fraud/v1/fraud-checks/{}/check-status".format(id) body = UpdateFraudCheckRequest(check_status=fraud_check_status) diff --git a/craftgate/request/search_fraud_rule_request.py b/craftgate/request/search_fraud_rule_request.py new file mode 100644 index 0000000..4fc03ae --- /dev/null +++ b/craftgate/request/search_fraud_rule_request.py @@ -0,0 +1,24 @@ +from datetime import datetime +from typing import Optional + +from craftgate.model.fraud_action import FraudAction +from craftgate.model.fraud_operation import FraudOperation + +class SearchFraudRuleRequest(object): + def __init__( + self, + name: Optional[str] = None, + min_created_date: Optional[datetime] = None, + max_created_date: Optional[datetime] = None, + action: Optional[FraudAction] = None, + operation: Optional[FraudOperation] = None, + page: Optional[int] = None, + size: Optional[int] = None, + ) -> None: + self.page = page + self.size = size + self.action = action + self.operation = operation + self.name = name + self.min_created_date = min_created_date + self.max_created_date = max_created_date diff --git a/craftgate/response/common/base_payment_response.py b/craftgate/response/common/base_payment_response.py index e0f0949..1612aa4 100644 --- a/craftgate/response/common/base_payment_response.py +++ b/craftgate/response/common/base_payment_response.py @@ -62,6 +62,7 @@ def __init__( fraud_id: Optional[int] = None, fraud_action: Optional[FraudAction] = None, fraud_score: Optional[float] = None, + fraud_rule_id: Optional[int] = None, pos: Optional[MerchantPos] = None, loyalty: Optional[Loyalty] = None, payment_error: Optional[PaymentError] = None @@ -108,6 +109,7 @@ def __init__( self.fraud_id = fraud_id self.fraud_action = fraud_action self.fraud_score = fraud_score + self.fraud_rule_id = fraud_rule_id self.pos = pos self.loyalty = loyalty self.payment_error = payment_error diff --git a/craftgate/response/dto/fraud_rule.py b/craftgate/response/dto/fraud_rule.py new file mode 100644 index 0000000..5059b18 --- /dev/null +++ b/craftgate/response/dto/fraud_rule.py @@ -0,0 +1,22 @@ +from typing import Optional, List + +from craftgate.model.fraud_action import FraudAction +from craftgate.model.fraud_operation import FraudOperation +from craftgate.model.status import Status + +class FraudRule(object): + def __init__( + self, + id: Optional[int] = None, + status: Optional[Status] = None, + name: Optional[str] = None, + action: Optional[FraudAction] = None, + conditions: Optional[str] = None, + operations: Optional[List[FraudOperation]] = None + ) -> None: + self.id = id + self.status = status + self.action = action + self.name = name + self.conditions = conditions + self.operations = operations diff --git a/craftgate/response/fraud_rule_response.py b/craftgate/response/fraud_rule_response.py new file mode 100644 index 0000000..708f481 --- /dev/null +++ b/craftgate/response/fraud_rule_response.py @@ -0,0 +1,5 @@ +from craftgate.response.common.list_response import ListResponse +from craftgate.response.dto.fraud_rule import FraudRule + +class FraudRuleResponse(ListResponse[FraudRule]): + item_type = FraudRule diff --git a/tests/test_fraud_adapter.py b/tests/test_fraud_adapter.py index 1ef8e57..424dd90 100644 --- a/tests/test_fraud_adapter.py +++ b/tests/test_fraud_adapter.py @@ -8,6 +8,7 @@ from craftgate.model.fraud_operation import FraudOperation from craftgate.request import FraudValueListRequest, SearchFraudChecksRequest from craftgate.request.fraud_add_card_fingerprint_to_list_request import FraudAddCardFingerprintToListRequest +from craftgate.request.search_fraud_rule_request import SearchFraudRuleRequest class FraudAdapterSample(unittest.TestCase): @@ -80,6 +81,18 @@ def test_search_fraud_checks(self): self.assertIsNotNone(resp) self.assertTrue(resp.items) + def test_search_fraud_rules(self): + now = datetime.now() + req = SearchFraudRuleRequest( + min_created_date=now - timedelta(days=25), + max_created_date=now, + ) + resp = self.fraud.search_fraud_rules(req) + print(resp) + + self.assertIsNotNone(resp) + self.assertTrue(resp.items) + def test_update_fraud_check_status(self): self.fraud.update_fraud_check_status(int(2613), FraudCheckStatus.FRAUD)