From c67d5d4f03ab771b75143f342f21c123fef8626c Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 31 Mar 2024 11:37:56 +0530 Subject: [PATCH 1/5] Initial Setup with Test Handler with template --- .gitignore | 6 +++++ source/RewardsService/Dockerfile | 3 ++- source/RewardsService/requirements.txt | 13 ++++++--- source/RewardsService/rewardsservice/app.py | 27 +++++++++++-------- .../handlers/rewards_handler.py | 6 +++++ .../rewardsservice/templates/base_page.html | 11 ++++++++ .../rewardsservice/url_patterns.py | 3 ++- 7 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 .gitignore create mode 100644 source/RewardsService/rewardsservice/templates/base_page.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f7989456 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.venv +source/RewardsService/rewardsservice/__pycache__/ +source/RewardsService/rewardsservice/handlers/__pycache__/ +source/RewardsService/requirements.txt +source/RewardsService/requirements_bkp.txt +source/RewardsService/data/ \ No newline at end of file diff --git a/source/RewardsService/Dockerfile b/source/RewardsService/Dockerfile index 99c06781..ac0f79bc 100644 --- a/source/RewardsService/Dockerfile +++ b/source/RewardsService/Dockerfile @@ -1,8 +1,9 @@ -FROM python:3.5 +FROM python:3.12 ENV PYTHONUNBUFFERED 1 ENV PYTHONPATH=$PYTHONPATH:/code/ RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ +RUN python -m pip install --upgrade pip RUN pip install -r requirements.txt ADD ./ /code/ diff --git a/source/RewardsService/requirements.txt b/source/RewardsService/requirements.txt index c6db96e9..aa14a9cb 100644 --- a/source/RewardsService/requirements.txt +++ b/source/RewardsService/requirements.txt @@ -1,3 +1,10 @@ -fabric==1.10.2 -motor==1.1.0 -tornado==3.2 +bcrypt==4.1.2 +cffi==1.15.1 +cryptography==42.0.5 +Fabric==1.10.2 +motor==1.1 +paramiko==3.4.0 +pycparser==2.21 +pymongo==3.13.0 +PyNaCl==1.5.0 +tornado==3.2 \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/app.py b/source/RewardsService/rewardsservice/app.py index d2bd28fb..6fcb1149 100644 --- a/source/RewardsService/rewardsservice/app.py +++ b/source/RewardsService/rewardsservice/app.py @@ -17,22 +17,27 @@ def __init__(self, urls): tornado.web.Application.__init__(self, urls, **settings) + app = App(url_patterns) -def main(): - logger = logging.getLogger() - tornado.options.parse_command_line() - http_server = tornado.httpserver.HTTPServer(app, xheaders=True) - http_server.listen(options.port) +# def main(): +# logger = logging.getLogger() +# tornado.options.parse_command_line() +# http_server = tornado.httpserver.HTTPServer(app, xheaders=True) +# http_server.listen(options.port) - logger.info('Tornado server started on port {}'.format(options.port)) +# logger.info('Tornado server started on port {}'.format(options.port)) - try: - tornado.ioloop.IOLoop.instance().start() - except KeyboardInterrupt: - logger.info("\nStopping server on port {}".format(options.port)) +# try: +# tornado.ioloop.IOLoop.instance().start() +# except KeyboardInterrupt: +# logger.info("\nStopping server on port {}".format(options.port)) if __name__ == "__main__": - main() + app = tornado.httpserver.HTTPServer(app, xheaders=True) + port = 7050 + app.listen(port) + print('Hello Its running') + tornado.ioloop.IOLoop.current().start() \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/handlers/rewards_handler.py b/source/RewardsService/rewardsservice/handlers/rewards_handler.py index 4f2aea6e..bc4ca30c 100644 --- a/source/RewardsService/rewardsservice/handlers/rewards_handler.py +++ b/source/RewardsService/rewardsservice/handlers/rewards_handler.py @@ -13,3 +13,9 @@ def get(self): db = client["Rewards"] rewards = list(db.rewards.find({}, {"_id": 0})) self.write(json.dumps(rewards)) + +class TestHandler(tornado.web.RequestHandler): + + @coroutine + def get(self): + self.render('base_page.html') \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/templates/base_page.html b/source/RewardsService/rewardsservice/templates/base_page.html new file mode 100644 index 00000000..f440c6ac --- /dev/null +++ b/source/RewardsService/rewardsservice/templates/base_page.html @@ -0,0 +1,11 @@ + + + +Tornado + + + +

Home Page

+ + + \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/url_patterns.py b/source/RewardsService/rewardsservice/url_patterns.py index 55e471d6..775c71ec 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 * url_patterns = [ (r'/rewards', RewardsHandler), + (r'/test', TestHandler), ] From 3e93b0bb321eeb4fad7ed97d3920e45fa597f05d Mon Sep 17 00:00:00 2001 From: Aditya Date: Tue, 2 Apr 2024 23:44:21 +0530 Subject: [PATCH 2/5] Implemented and need to test --- source/RewardsService/rewardsservice/app.py | 1 - .../handlers/rewards_handler.py | 28 +++++++++++++++++-- .../rewardsservice/templates/index.html | 20 +++++++++++++ .../rewardsservice/url_patterns.py | 2 ++ 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 source/RewardsService/rewardsservice/templates/index.html diff --git a/source/RewardsService/rewardsservice/app.py b/source/RewardsService/rewardsservice/app.py index 6fcb1149..50ee950d 100644 --- a/source/RewardsService/rewardsservice/app.py +++ b/source/RewardsService/rewardsservice/app.py @@ -10,7 +10,6 @@ from settings import settings from url_patterns import url_patterns - class App(tornado.web.Application): def __init__(self, urls): self.logger = logging.getLogger(self.__class__.__name__) diff --git a/source/RewardsService/rewardsservice/handlers/rewards_handler.py b/source/RewardsService/rewardsservice/handlers/rewards_handler.py index bc4ca30c..8d0d8ef3 100644 --- a/source/RewardsService/rewardsservice/handlers/rewards_handler.py +++ b/source/RewardsService/rewardsservice/handlers/rewards_handler.py @@ -1,10 +1,9 @@ import json import tornado.web - +import motor from pymongo import MongoClient from tornado.gen import coroutine - class RewardsHandler(tornado.web.RequestHandler): @coroutine @@ -18,4 +17,27 @@ class TestHandler(tornado.web.RequestHandler): @coroutine def get(self): - self.render('base_page.html') \ No newline at end of file + self.render('base_page.html') + + +class FetchCustomerDataHandler(tornado.web.RequestHandler): + @coroutine + def get(self): + client = MongoClient("mongodb", 27017) + db = client.get_database("Rewards") + collection = db.get_collection("Customer") + customers = list(collection.find()) + self.render("index.html", customers=customers) + +class AddCustomerDataHandler(tornado.web.RedirectHandler): + @coroutine + def post(self): + customer_email = self.get_argument("customer_email") + order = self.get_argument("order") + client = MongoClient("mongodb", 27017) + db = client.get_database("Rewards") + collection = db.get_collection("Customer") + collection.insert_one({"customer_email": customer_email, "order": order,}) + self.redirect("/") + + \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/templates/index.html b/source/RewardsService/rewardsservice/templates/index.html new file mode 100644 index 00000000..4d73adef --- /dev/null +++ b/source/RewardsService/rewardsservice/templates/index.html @@ -0,0 +1,20 @@ + + + + + Customer Data + + +

Customer List

+ +
+ + + +
+ + \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/url_patterns.py b/source/RewardsService/rewardsservice/url_patterns.py index 775c71ec..94961f9f 100644 --- a/source/RewardsService/rewardsservice/url_patterns.py +++ b/source/RewardsService/rewardsservice/url_patterns.py @@ -2,5 +2,7 @@ url_patterns = [ (r'/rewards', RewardsHandler), + (r'/customerdata',FetchCustomerDataHandler), + (r'/add', AddCustomerDataHandler), (r'/test', TestHandler), ] From 7ef0b07d7d5e867dded0549c68cec8e56213f208 Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 3 Apr 2024 17:00:54 +0530 Subject: [PATCH 3/5] Final End points --- source/RewardsService/Dockerfile | 2 +- source/RewardsService/requirements.txt | 11 +- .../handlers/rewards_handler.py | 114 +++++++++++++++--- .../rewardsservice/url_patterns.py | 8 +- 4 files changed, 106 insertions(+), 29 deletions(-) diff --git a/source/RewardsService/Dockerfile b/source/RewardsService/Dockerfile index ac0f79bc..575f7bc8 100644 --- a/source/RewardsService/Dockerfile +++ b/source/RewardsService/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12 +FROM python:3.5 ENV PYTHONUNBUFFERED 1 ENV PYTHONPATH=$PYTHONPATH:/code/ RUN mkdir /code diff --git a/source/RewardsService/requirements.txt b/source/RewardsService/requirements.txt index aa14a9cb..1ca236fd 100644 --- a/source/RewardsService/requirements.txt +++ b/source/RewardsService/requirements.txt @@ -1,10 +1,3 @@ -bcrypt==4.1.2 -cffi==1.15.1 -cryptography==42.0.5 -Fabric==1.10.2 -motor==1.1 -paramiko==3.4.0 -pycparser==2.21 -pymongo==3.13.0 -PyNaCl==1.5.0 +fabric==1.10.2 +motor==1.1.0 tornado==3.2 \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/handlers/rewards_handler.py b/source/RewardsService/rewardsservice/handlers/rewards_handler.py index 8d0d8ef3..9b72949d 100644 --- a/source/RewardsService/rewardsservice/handlers/rewards_handler.py +++ b/source/RewardsService/rewardsservice/handlers/rewards_handler.py @@ -13,31 +13,115 @@ def get(self): rewards = list(db.rewards.find({}, {"_id": 0})) self.write(json.dumps(rewards)) -class TestHandler(tornado.web.RequestHandler): + +class AddCustomerDatahandler(tornado.web.RequestHandler): @coroutine - def get(self): - self.render('base_page.html') + def post(self): + # Handle the POST request + + def inner_wrapper(rewards_list,points): + for reward in rewards_list: + if reward['points']==points: + return reward + + # to calculate the rewards for an existing and new customer as well + def calculate_rewards(customer_data): + rewards = list(db.rewards.find({}, {"_id": 0})) + points_list = [i.get('points') for i in rewards ] + reward_points = customer_data.get('reward_points') + if reward_points=points_list[-1]: + customer_data.update({ + "reward_points" : points_list[-1], + "next_reward_tier":"The customer already reached to peak rewards", + "next_reward_tier_progress":"N/A", + "next_reward_name":"N/A" + }) + return customer_data + else: + for i in range(0,len(points_list)-1): + if points_list[i]<=int(reward_points)<=points_list[i+1]: + rewards_data = inner_wrapper(rewards,points_list[0]) + reward_tier,reward_name = rewards_data.get('tier'),rewards_data.get('rewardName') + next_rewards_data = inner_wrapper(rewards,points_list[1]) + next_reward_tier,next_reward_name = next_rewards_data.get('tier'),next_rewards_data.get('rewardName') + next_reward_tier_progress=str(points_list[i+1]-customer_data.get('order'))+"%" + customer_data.update( + { + "reward_tier":reward_tier, + "reward_name":reward_name, + "next_reward_tier":next_reward_tier, + "next_reward_name":next_reward_name, + "next_reward_tier_progress":next_reward_tier_progress + }) + return customer_data + + client = MongoClient("mongodb", 27017) + db = client.get_database("Rewards") + collection = db.get_collection("Customer") + data = tornado.escape.json_decode(self.request.body) + + customer_data ={ + 'customer_email':data.get('customer_email'), + 'order':data.get('order'), + 'reward_points' : round(data.get('order')) + } + + data_exists = list(collection.find({"customer_email":customer_data.get('customer_email')})) + if len(data_exists)>0: + for existed_data in data_exists: + customer_data.update({ + 'customer_email':data.get('customer_email'), + 'order': customer_data.get('order') + int(existed_data.get('order')), + 'reward_points': customer_data.get('reward_points') + int(existed_data.get('reward_points')) + } + ) + result = calculate_rewards(customer_data) + collection.update_one({"customer_email" : customer_data.get('customer_email')},{"$set": result},upsert=True) + self.write("Customer Data has been successful updated") + else: + result = calculate_rewards(customer_data) + collection.insert_one(result) + self.write("Customer Data has been successful registered") + +class FetchAllCustomerDatahandler(tornado.web.RequestHandler): -class FetchCustomerDataHandler(tornado.web.RequestHandler): @coroutine def get(self): + # to fetch all the records in collection client = MongoClient("mongodb", 27017) - db = client.get_database("Rewards") - collection = db.get_collection("Customer") - customers = list(collection.find()) - self.render("index.html", customers=customers) + db = client.get_database("Rewards") + collection = db.get_collection("Customer") + rewards = list(collection.find({}, {"_id": 0})) + if rewards: + self.write(json.dumps(rewards)) + else: + self.write("No Customer Records Found") -class AddCustomerDataHandler(tornado.web.RedirectHandler): @coroutine - def post(self): - customer_email = self.get_argument("customer_email") - order = self.get_argument("order") + def delete(self): + # to delete the collection client = MongoClient("mongodb", 27017) db = client.get_database("Rewards") collection = db.get_collection("Customer") - collection.insert_one({"customer_email": customer_email, "order": order,}) - self.redirect("/") + collection.drop() + self.write("DELETE collection successful") + +class FetchCustomerDatahandler(tornado.web.RequestHandler): - \ No newline at end of file + @coroutine + def get(self,slug): + # to fetch one customer data from collection + client = MongoClient("mongodb", 27017) + db = client.get_database("Rewards") + collection = db.get_collection("Customer") + data_exists = list(collection.find({"customer_email":slug},{"_id": 0})) + if data_exists: + self.write(json.dumps(data_exists)) + else: + self.write("No Customer Records Found") \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/url_patterns.py b/source/RewardsService/rewardsservice/url_patterns.py index 94961f9f..72e95c87 100644 --- a/source/RewardsService/rewardsservice/url_patterns.py +++ b/source/RewardsService/rewardsservice/url_patterns.py @@ -1,8 +1,8 @@ from handlers.rewards_handler import * url_patterns = [ - (r'/rewards', RewardsHandler), - (r'/customerdata',FetchCustomerDataHandler), - (r'/add', AddCustomerDataHandler), - (r'/test', TestHandler), + (r"/rewards", RewardsHandler), # default rewards handler + (r"/customer_data/add", AddCustomerDatahandler), # End point to add/update the customer data wrt customer email and order + (r"/customer_data/fetch/([^/]+)", FetchCustomerDatahandler), # End point to fetch one customer data from DB + (r"/customer_data/fetch/all", FetchAllCustomerDatahandler), # End point to fetch all the customer data from DB ] From 99d50e7cdf0cb34a1218480623b5af39125a311c Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 3 Apr 2024 17:08:04 +0530 Subject: [PATCH 4/5] Final End points v2 --- .../rewardsservice/templates/base_page.html | 11 ---------- .../rewardsservice/templates/index.html | 20 ------------------- 2 files changed, 31 deletions(-) delete mode 100644 source/RewardsService/rewardsservice/templates/base_page.html delete mode 100644 source/RewardsService/rewardsservice/templates/index.html diff --git a/source/RewardsService/rewardsservice/templates/base_page.html b/source/RewardsService/rewardsservice/templates/base_page.html deleted file mode 100644 index f440c6ac..00000000 --- a/source/RewardsService/rewardsservice/templates/base_page.html +++ /dev/null @@ -1,11 +0,0 @@ - - - -Tornado - - - -

Home Page

- - - \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/templates/index.html b/source/RewardsService/rewardsservice/templates/index.html deleted file mode 100644 index 4d73adef..00000000 --- a/source/RewardsService/rewardsservice/templates/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Customer Data - - -

Customer List

-
    - {% for customer in customers %} -
  • {{ customer[1] }} - Order: {{ employee[2] }}
  • - {% end %} -
-
- - - -
- - \ No newline at end of file From ad10aa270ffb8429ac99b4aaa76d03f671137360 Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 3 Apr 2024 17:09:51 +0530 Subject: [PATCH 5/5] Task completed --- source/RewardsService/rewardsservice/app.py | 40 +++++++++---------- .../handlers/rewards_handler.py | 1 - 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/source/RewardsService/rewardsservice/app.py b/source/RewardsService/rewardsservice/app.py index 50ee950d..3f667d11 100644 --- a/source/RewardsService/rewardsservice/app.py +++ b/source/RewardsService/rewardsservice/app.py @@ -20,23 +20,23 @@ def __init__(self, urls): app = App(url_patterns) -# def main(): -# logger = logging.getLogger() -# tornado.options.parse_command_line() -# http_server = tornado.httpserver.HTTPServer(app, xheaders=True) -# http_server.listen(options.port) - -# logger.info('Tornado server started on port {}'.format(options.port)) - -# try: -# tornado.ioloop.IOLoop.instance().start() -# except KeyboardInterrupt: -# logger.info("\nStopping server on port {}".format(options.port)) - - -if __name__ == "__main__": - app = tornado.httpserver.HTTPServer(app, xheaders=True) - port = 7050 - app.listen(port) - print('Hello Its running') - tornado.ioloop.IOLoop.current().start() \ No newline at end of file +def main(): + logger = logging.getLogger() + tornado.options.parse_command_line() + http_server = tornado.httpserver.HTTPServer(app, xheaders=True) + http_server.listen(options.port) + + logger.info('Tornado server started on port {}'.format(options.port)) + + try: + tornado.ioloop.IOLoop.instance().start() + except KeyboardInterrupt: + logger.info("\nStopping server on port {}".format(options.port)) + + +# if __name__ == "__main__": +# app = tornado.httpserver.HTTPServer(app, xheaders=True) +# port = 7050 +# app.listen(port) +# print('Hello Its running') +# tornado.ioloop.IOLoop.current().start() \ No newline at end of file diff --git a/source/RewardsService/rewardsservice/handlers/rewards_handler.py b/source/RewardsService/rewardsservice/handlers/rewards_handler.py index 9b72949d..a231fd23 100644 --- a/source/RewardsService/rewardsservice/handlers/rewards_handler.py +++ b/source/RewardsService/rewardsservice/handlers/rewards_handler.py @@ -1,6 +1,5 @@ import json import tornado.web -import motor from pymongo import MongoClient from tornado.gen import coroutine