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
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -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/
1 change: 1 addition & 0 deletions source/RewardsService/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ 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/
2 changes: 1 addition & 1 deletion source/RewardsService/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
fabric==1.10.2
motor==1.1.0
tornado==3.2
tornado==3.2
10 changes: 7 additions & 3 deletions source/RewardsService/rewardsservice/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
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__)

tornado.web.Application.__init__(self, urls, **settings)


app = App(url_patterns)


Expand All @@ -34,5 +34,9 @@ def main():
logger.info("\nStopping server on port {}".format(options.port))


if __name__ == "__main__":
main()
# if __name__ == "__main__":
# app = tornado.httpserver.HTTPServer(app, xheaders=True)
# port = 7050
# app.listen(port)
# print('Hello Its running')
# tornado.ioloop.IOLoop.current().start()
115 changes: 113 additions & 2 deletions source/RewardsService/rewardsservice/handlers/rewards_handler.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import json
import tornado.web

from pymongo import MongoClient
from tornado.gen import coroutine


class RewardsHandler(tornado.web.RequestHandler):

@coroutine
Expand All @@ -13,3 +11,116 @@ def get(self):
db = client["Rewards"]
rewards = list(db.rewards.find({}, {"_id": 0}))
self.write(json.dumps(rewards))


class AddCustomerDatahandler(tornado.web.RequestHandler):

@coroutine
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[0]:
customer_data.update({
"next_reward_tier_progress":str(points_list[0]-customer_data.get('order'))+"%",
})
elif 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):

@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")
rewards = list(collection.find({}, {"_id": 0}))
if rewards:
self.write(json.dumps(rewards))
else:
self.write("No Customer Records Found")

@coroutine
def delete(self):
# to delete the collection
client = MongoClient("mongodb", 27017)
db = client.get_database("Rewards")
collection = db.get_collection("Customer")
collection.drop()
self.write("DELETE collection successful")

class FetchCustomerDatahandler(tornado.web.RequestHandler):

@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")
7 changes: 5 additions & 2 deletions source/RewardsService/rewardsservice/url_patterns.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
from handlers.rewards_handler import RewardsHandler
from handlers.rewards_handler import *

url_patterns = [
(r'/rewards', RewardsHandler),
(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
]