From 175b2497ba22dbe345b1fe946f2b2c86f3bfae9d Mon Sep 17 00:00:00 2001 From: sweta-sv Date: Sat, 10 Feb 2024 22:17:32 +0530 Subject: [PATCH 1/7] feat(#RewardHandler): Added RewardPointsHandler in rewardservices --- .../handlers/rewards_handler.py | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/source/RewardsService/rewardsservice/handlers/rewards_handler.py b/source/RewardsService/rewardsservice/handlers/rewards_handler.py index 4f2aea6e..34b13907 100644 --- a/source/RewardsService/rewardsservice/handlers/rewards_handler.py +++ b/source/RewardsService/rewardsservice/handlers/rewards_handler.py @@ -13,3 +13,52 @@ def get(self): db = client["Rewards"] rewards = list(db.rewards.find({}, {"_id": 0})) self.write(json.dumps(rewards)) + + + +class RewardPointsHandler(tornado.web.RequestHandler): + async def post(self): + try: + # Extract data from request + email = self.get_body_argument("email") + order_total = float(self.get_body_argument("order_total")) + + # Calculate rewards data + reward_points = int(order_total) + reward_tier = chr((reward_points // 100) + 65) # Convert points to tier using ASCII + reward_tier_name = f"{reward_points}% off purchase" + next_reward_tier = chr((reward_points // 100) + 66) if reward_points // 100 < 5 else None + next_reward_tier_name = f"{(reward_points + 100)}% off purchase" if next_reward_tier else None + next_reward_tier_progress = (reward_points % 100) / 100 if next_reward_tier else None + + # Store data in MongoDB + client = MongoClient("mongodb", 27017) + db = client["Rewards"] + collection = db["reward_data"] + customer_data = { + "email": email, + "reward_points": reward_points, + "reward_tier": reward_tier, + "reward_tier_name": reward_tier_name, + "next_reward_tier": next_reward_tier, + "next_reward_tier_name": next_reward_tier_name, + "next_reward_tier_progress": next_reward_tier_progress + } + result = collection.insert_one(customer_data) + + # Response + self.set_status(201) + self.write({"message": "Reward data stored successfully.", "customer_id": str(result.inserted_id)}) + + except tornado.web.MissingArgumentError as e: + # Handle missing argument error + self.set_status(400) + self.write({"error": "Missing argument", "message": str(e)}) + except ValueError as e: + # Handle value conversion error + self.set_status(400) + self.write({"error": "Invalid value", "message": str(e)}) + except Exception as e: + # Handle other exceptions + self.set_status(500) + self.write({"error": "Internal server error", "message": str(e)}) From 9a16026b9230b5daa843a4699bb7e27bfae4836d Mon Sep 17 00:00:00 2001 From: sweta-sv Date: Sat, 10 Feb 2024 22:34:20 +0530 Subject: [PATCH 2/7] Updated url_patterns.py with new handler endpoint --- source/RewardsService/rewardsservice/url_patterns.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/RewardsService/rewardsservice/url_patterns.py b/source/RewardsService/rewardsservice/url_patterns.py index 55e471d6..8dbbce23 100644 --- a/source/RewardsService/rewardsservice/url_patterns.py +++ b/source/RewardsService/rewardsservice/url_patterns.py @@ -1,5 +1,6 @@ -from handlers.rewards_handler import RewardsHandler +from handlers.rewards_handler import RewardsHandler, RewardPointsHandler url_patterns = [ (r'/rewards', RewardsHandler), + (r'/rewardpoint', RewardPointsHandler,) ] From d23c285f9a3871ef070d4a9bfaeb9653c1e6964e Mon Sep 17 00:00:00 2001 From: sweta-sv Date: Sat, 10 Feb 2024 22:35:28 +0530 Subject: [PATCH 3/7] Updated rewards_service_client.py file with new addition RewardsServiceClient.add_orders() --- source/RewardsUI/rewards/clients/rewards_service_client.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/RewardsUI/rewards/clients/rewards_service_client.py b/source/RewardsUI/rewards/clients/rewards_service_client.py index 70b56545..fc852477 100644 --- a/source/RewardsUI/rewards/clients/rewards_service_client.py +++ b/source/RewardsUI/rewards/clients/rewards_service_client.py @@ -5,7 +5,13 @@ class RewardsServiceClient: def __init__(self): self.rewards_url = "http://rewardsservice:7050/rewards" + self.add_orders_url = "http://rewardsservice:7050/rewardpoint" def get_rewards(self): response = requests.get(self.rewards_url) return response.json() + + def add_orders(self, email, order_total): + response = requests.post(self.add_orders_url, data={"email": email , "order_total": order_total}) + return response.json() + From c004582294c05b98a4f170ebe013fc75e5674f2f Mon Sep 17 00:00:00 2001 From: sweta-sv Date: Sat, 10 Feb 2024 22:37:36 +0530 Subject: [PATCH 4/7] Error handling block text modification --- .../rewardsservice/handlers/rewards_handler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/RewardsService/rewardsservice/handlers/rewards_handler.py b/source/RewardsService/rewardsservice/handlers/rewards_handler.py index 34b13907..73eeb318 100644 --- a/source/RewardsService/rewardsservice/handlers/rewards_handler.py +++ b/source/RewardsService/rewardsservice/handlers/rewards_handler.py @@ -53,12 +53,12 @@ async def post(self): except tornado.web.MissingArgumentError as e: # Handle missing argument error self.set_status(400) - self.write({"error": "Missing argument", "message": str(e)}) + self.write({"error": "Missing argument.", "message": str(e)}) except ValueError as e: # Handle value conversion error self.set_status(400) - self.write({"error": "Invalid value", "message": str(e)}) + self.write({"error": "Invalid value.", "message": str(e)}) except Exception as e: # Handle other exceptions self.set_status(500) - self.write({"error": "Internal server error", "message": str(e)}) + self.write({"error": "Internal server error.", "message": str(e)}) From c9876f6820120faf15a9e6cc6e00098e26084d3a Mon Sep 17 00:00:00 2001 From: sweta-sv Date: Sat, 10 Feb 2024 22:56:38 +0530 Subject: [PATCH 5/7] updated args of class RewardsServiceClient with error handling --- .../rewards/clients/rewards_service_client.py | 4 ++- source/RewardsUI/rewards/views.py | 34 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/source/RewardsUI/rewards/clients/rewards_service_client.py b/source/RewardsUI/rewards/clients/rewards_service_client.py index fc852477..41a1edb2 100644 --- a/source/RewardsUI/rewards/clients/rewards_service_client.py +++ b/source/RewardsUI/rewards/clients/rewards_service_client.py @@ -11,7 +11,9 @@ def get_rewards(self): response = requests.get(self.rewards_url) return response.json() - def add_orders(self, email, order_total): + def add_orders(self, data={}): + email = data.get("email") + order_total = data.get("order_total") response = requests.post(self.add_orders_url, data={"email": email , "order_total": order_total}) return response.json() diff --git a/source/RewardsUI/rewards/views.py b/source/RewardsUI/rewards/views.py index 1d5dd537..3c746858 100644 --- a/source/RewardsUI/rewards/views.py +++ b/source/RewardsUI/rewards/views.py @@ -23,4 +23,36 @@ def get(self, request, *args, **kwargs): request, self.template_name, context - ) \ No newline at end of file + ) + + + def post(self, request, *args, **kwargs): + email = request.POST.get('email') + order_total = request.POST.get('order_total') + + data = { + 'email': email, + 'order_total': order_total + } + + # Making the POST request to the endpoint + response = self.rewards_service_client.add_orders(data) + + if response.status_code == 201: + print("Customer order data stored successfully.") + rewards_data = response.json() + context = self.get_context_data(**kwargs) + context['rewards_data'] = rewards_data + return TemplateResponse( + request, + self.template_name, + context + ) + else: + context = self.get_context_data(**kwargs) + context['error_message'] = "Failed to store customer order data." + return TemplateResponse( + request, + self.template_name, + context + ) From 372e400051c846dfc7c761d47ed8a45c10c929d1 Mon Sep 17 00:00:00 2001 From: sweta-sv Date: Sat, 10 Feb 2024 23:15:32 +0530 Subject: [PATCH 6/7] Added unit testcase for post request for RewardView --- source/RewardsUI/rewards/tests.py | 35 ++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/source/RewardsUI/rewards/tests.py b/source/RewardsUI/rewards/tests.py index 7ce503c2..58eca111 100644 --- a/source/RewardsUI/rewards/tests.py +++ b/source/RewardsUI/rewards/tests.py @@ -1,3 +1,36 @@ from django.test import TestCase - +from unittest.mock import patch, MagicMock +from .views import RewardsView # Create your tests here. + + + +class TestRewardsViewClass(TestCase): + + @patch('pymongo.MongoClient') + def test_post_success(self, mock_mongo_client): + mock_collection = MagicMock() + mock_collection.insert_one.return_value.inserted_id = '123' + + mock_db = MagicMock() + mock_db.__getitem__.return_value = mock_collection + mock_client = MagicMock() + mock_client.__getitem__.return_value = mock_db + mock_mongo_client.return_value = mock_client + + reward_view = RewardsView() + + response = reward_view.post('/^$', {'email': 'sweta@example.com', 'order_total': '2024'}) + + # Check response status code + self.assertEqual(response.status_code, 201) + + @patch('pymongo.MongoClient') + def test_post_failure(self, mock_mongo_client): + mock_mongo_client.side_effect = Exception("MongoDB connection error") + reward_view = RewardsView() + + response = reward_view.post('/^$', {'email': 'sweta@gmail.com', 'order_total': '100'}) + + # Check response status code + self.assertEqual(response.status_code, 500) From 50cd6784ac68027717b376c4ec1710d3d2b6ea8e Mon Sep 17 00:00:00 2001 From: sweta-sv Date: Sat, 10 Feb 2024 23:17:50 +0530 Subject: [PATCH 7/7] Updated mock data --- source/RewardsUI/rewards/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/RewardsUI/rewards/tests.py b/source/RewardsUI/rewards/tests.py index 58eca111..17712f57 100644 --- a/source/RewardsUI/rewards/tests.py +++ b/source/RewardsUI/rewards/tests.py @@ -30,7 +30,7 @@ def test_post_failure(self, mock_mongo_client): mock_mongo_client.side_effect = Exception("MongoDB connection error") reward_view = RewardsView() - response = reward_view.post('/^$', {'email': 'sweta@gmail.com', 'order_total': '100'}) + response = reward_view.post('/^$', {'email': 'sweta@example.com', 'order_total': '2024'}) # Check response status code self.assertEqual(response.status_code, 500)