diff --git a/source/RewardsService/rewardsservice/handlers/rewards_handler.py b/source/RewardsService/rewardsservice/handlers/rewards_handler.py index 4f2aea6e..73eeb318 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)}) 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,) ] diff --git a/source/RewardsUI/rewards/clients/rewards_service_client.py b/source/RewardsUI/rewards/clients/rewards_service_client.py index 70b56545..41a1edb2 100644 --- a/source/RewardsUI/rewards/clients/rewards_service_client.py +++ b/source/RewardsUI/rewards/clients/rewards_service_client.py @@ -5,7 +5,15 @@ 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, 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/tests.py b/source/RewardsUI/rewards/tests.py index 7ce503c2..17712f57 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@example.com', 'order_total': '2024'}) + + # Check response status code + self.assertEqual(response.status_code, 500) 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 + )