Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions source/RewardsService/rewardsservice/handlers/rewards_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)})
3 changes: 2 additions & 1 deletion source/RewardsService/rewardsservice/url_patterns.py
Original file line number Diff line number Diff line change
@@ -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,)
]
8 changes: 8 additions & 0 deletions source/RewardsUI/rewards/clients/rewards_service_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

35 changes: 34 additions & 1 deletion source/RewardsUI/rewards/tests.py
Original file line number Diff line number Diff line change
@@ -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)
34 changes: 33 additions & 1 deletion source/RewardsUI/rewards/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,36 @@ def get(self, request, *args, **kwargs):
request,
self.template_name,
context
)
)


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
)