diff --git a/__pycache__/main.cpython-311.pyc b/__pycache__/main.cpython-311.pyc index dc9179a..0abaada 100644 Binary files a/__pycache__/main.cpython-311.pyc and b/__pycache__/main.cpython-311.pyc differ diff --git a/main.py b/main.py index a11c3f9..b3a7575 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,9 @@ import services.campaign as campaigns import services.creative as creatives import services.advertiser as advertisers +import services.deal as deals +import services.buyer as buyers +import services.seller as sellers load_dotenv() # This loads the environment variables from .env @@ -82,14 +85,15 @@ def process_creative(creative_name): @app.route('/submit-advertiser', methods=['POST','PUT']) @requires_auth - def submit_advertiser(): + def submit_advertiser(*args, **kwargs): + buyer_id = kwargs.get('buyer_id', None) if request.method == 'POST': #retrieve advertiser - return advertisers.post_advertiser(request,client) + return advertisers.post_advertiser(buyer_id,request,client) elif request.method == 'PUT': # Update a advertiser advertiser_id=request.args.get('_id') - return advertisers.put_advertiser(advertiser_id,request,client) + return advertisers.put_advertiser(buyer_id,advertiser_id,request,client) @app.route('/advertisers', methods=['GET']) @requires_auth def manage_advertiser(): @@ -109,6 +113,98 @@ def process_advertiser(): # Delete a advertiser return advertisers.delete_advertiser(advertiser_name,client) + @app.route('/submit-buyer', methods=['POST','PUT']) + @requires_auth + def submit_buyer(): + if request.method == 'POST': + #retrieve buyer + return buyers.post_buyer(request,client) + elif request.method == 'PUT': + # Update a buyer + buyer_id=request.args.get('_id') + return buyers.put_buyer(buyer_id,request,client) + @app.route('/buyers', methods=['GET']) + @requires_auth + def manage_buyer(): + return buyers.list_all_buyers(client) + + @app.route('/buyer', methods=['GET', 'PUT', 'DELETE']) + @requires_auth + def process_buyer(): + if request.method == 'GET': + #retrieve buyer + return buyers.get_buyer(request.args['_id'],client) + elif request.method == 'PUT': + # Update a buyer + return buyers.put_buyer(request.args['_id'],request.json,client) + + elif request.method == 'DELETE': + # Delete a buyer + return buyers.delete_buyer(buyer_name,client) + + @app.route('/submit-deal', methods=['POST','PUT']) + @requires_auth + def submit_deal(): + if request.method == 'POST': + #retrieve deal + return deals.post_deal(request,client) + elif request.method == 'PUT': + # Update a deal + deal_id=request.args.get('_id') + return deals.put_deal(deal_id,request,client) + @app.route('/deals', methods=['GET']) + @requires_auth + def manage_deal(): + return deals.list_all_deals(client) + + @app.route('/deal', methods=['GET', 'PUT', 'DELETE']) + @requires_auth + def process_deal(): + if request.method == 'GET': + #retrieve deal + return deals.get_deal(request.args['_id'],client) + elif request.method == 'PUT': + # Update a deal + return deals.put_deal(request.args['_id'],request.json,client) + + elif request.method == 'DELETE': + # Delete a deal + return deals.delete_deal(deal_name,client) + + + @app.route('/submit-seller', methods=['POST','PUT']) + @requires_auth + def submit_seller(): + if request.method == 'POST': + #retrieve seller + return sellers.post_seller(request,client) + elif request.method == 'PUT': + # Update a seller + seller_id=request.args.get('_id') + return sellers.put_seller(seller_id,request,client) + @app.route('/sellers', methods=['GET']) + @requires_auth + def manage_seller(): + return sellers.list_all_sellers(client) + + @app.route('/seller', methods=['GET', 'PUT', 'DELETE']) + @requires_auth + def process_seller(): + if request.method == 'GET': + #retrieve seller + return sellers.get_seller(request.args['_id'],client) + elif request.method == 'PUT': + # Update a seller + return sellers.put_seller(request.args['_id'],request.json,client) + + elif request.method == 'DELETE': + # Delete a seller + return sellers.delete_seller(seller_name,client) + + + + + # Example of a protected route @app.route('/') def your_protected_route(): diff --git a/services/__pycache__/advertiser.cpython-311.pyc b/services/__pycache__/advertiser.cpython-311.pyc index 1cbb663..f35f8f9 100644 Binary files a/services/__pycache__/advertiser.cpython-311.pyc and b/services/__pycache__/advertiser.cpython-311.pyc differ diff --git a/services/__pycache__/buyer.cpython-311.pyc b/services/__pycache__/buyer.cpython-311.pyc new file mode 100644 index 0000000..b04ce8a Binary files /dev/null and b/services/__pycache__/buyer.cpython-311.pyc differ diff --git a/services/__pycache__/deal.cpython-311.pyc b/services/__pycache__/deal.cpython-311.pyc new file mode 100644 index 0000000..c88da5d Binary files /dev/null and b/services/__pycache__/deal.cpython-311.pyc differ diff --git a/services/__pycache__/seller.cpython-311.pyc b/services/__pycache__/seller.cpython-311.pyc new file mode 100644 index 0000000..eda419d Binary files /dev/null and b/services/__pycache__/seller.cpython-311.pyc differ diff --git a/services/advertiser.py b/services/advertiser.py index 447930a..d64a52f 100644 --- a/services/advertiser.py +++ b/services/advertiser.py @@ -14,12 +14,12 @@ def get_advertiser(advertiser_id,client): else: return jsonify({"message": "advertiser not found" }), 404 -def put_advertiser(advertiser_id,request,client): +def put_advertiser(buyer_id,advertiser_id,request,client): db = client['advertisers'] advertisers = db.advertisers advertiser_id=ObjectId(advertiser_id) payload = prepare_data(request.get_json())[0] - result = advertisers.update_one({"_id": advertiser_id}, {"$set": payload}) + result = advertisers.update_one({"_id": advertiser_id, "buyer_id":buyer_id}, {"$set": payload}) if result.matched_count: print("updated") return jsonify({"message": "advertiser updated"}) @@ -45,13 +45,13 @@ def list_all_advertisers(client): item["_id"] = str(item["_id"]) return jsonify(all_advertisers_with_id) -def post_advertiser(request,client): +def post_advertiser(buyer_id,request,client): db = client['advertisers'] advertisers = db.advertisers print("Submitting advertiser") try: - advertiser_data = prepare_data(request.get_json()) + advertiser_data = prepare_data(buyer_id,request.get_json()) try: advertisers.insert_one(advertiser_data[0]) return jsonify({"message": "advertiser added"}), 201 @@ -64,13 +64,14 @@ def post_advertiser(request,client): print(e) return str(e), 500 -def prepare_data(data): +def prepare_data(buyer_id,data): # Extract form data name = data['name'] default_brand_url = data['default_brand_url'] # Create the data payload in the required format payload = [{ "name": name, + "buyer_id":buyer_id, "default_brand_url":default_brand_url }] return payload diff --git a/services/buyer.py b/services/buyer.py new file mode 100644 index 0000000..7d49b31 --- /dev/null +++ b/services/buyer.py @@ -0,0 +1,74 @@ +from flask import Flask, request, jsonify, request, render_template, redirect,url_for +import requests +from bson import ObjectId + +def get_buyer(buyer_id,client): + # Get a single buyer + # Select the database + db = client['buyers'] + buyers = db.buyers + buyer_id = ObjectId(buyer_id) + buyer = buyers.find_one({"_id": buyer_id}, {'_id': 0}) + if buyer: + return jsonify(buyer) + else: + return jsonify({"message": "buyer not found" }), 404 + +def put_buyer(buyer_id,request,client): + db = client['buyers'] + buyers = db.buyers + buyer_id=ObjectId(buyer_id) + payload = prepare_data(request.get_json())[0] + result = buyers.update_one({"_id": buyer_id}, {"$set": payload}) + if result.matched_count: + print("updated") + return jsonify({"message": "buyer updated"}) + else: + print("error)") + return jsonify({"message": "buyer not found"}), 404 + +def delete_buyer(buyer_name,client): + db = client['buyers'] + buyers = db.buyers + result = buyers.delete_one({"buyer_name": buyer_name}) + if result.deleted_count: + return jsonify({"message": "buyer deleted"}) + else: + return jsonify({"message": "buyer not found"}), 404 + +def list_all_buyers(client): + db = client['buyers'] + buyers = db.buyers + all_buyers_with_id = list(buyers.find({})) + for item in all_buyers_with_id: + print(item) + item["_id"] = str(item["_id"]) + return jsonify(all_buyers_with_id) + +def post_buyer(request,client): + db = client['buyers'] + buyers = db.buyers + print("Submitting buyer") + try: + + buyer_data = prepare_data(request.get_json()) + try: + buyers.insert_one(buyer_data[0]) + return jsonify({"message": "buyer added"}), 201 + except Exception as e: + # If an error occurs, print the error and return an appropriate response + print("Error occurred:", e) + return jsonify({"error": str(e)}), 500 + except Exception as e: + # Handle exceptions + print(e) + return str(e), 500 + +def prepare_data(data): + # Extract form data + name = data['name'] + # Create the data payload in the required format + payload = [{ + "name": name, + }] + return payload diff --git a/services/deal.py b/services/deal.py new file mode 100644 index 0000000..d3e0f1f --- /dev/null +++ b/services/deal.py @@ -0,0 +1,87 @@ +from flask import Flask, request, jsonify, request, render_template, redirect,url_for +import requests +from bson import ObjectId + +def get_deal(deal_id,client): + # Get a single deal + # Select the database + db = client['deals'] + deals = db.deals + deal_id = ObjectId(deal_id) + deal = deals.find_one({"_id": deal_id}, {'_id': 0}) + if deal: + return jsonify(deal) + else: + return jsonify({"message": "deal not found" }), 404 + +def put_deal(deal_id,request,client): + db = client['deals'] + deals = db.deals + deal_id=ObjectId(deal_id) + payload = prepare_data(request.get_json())[0] + result = deals.update_one({"_id": deal_id}, {"$set": payload}) + if result.matched_count: + print("updated") + return jsonify({"message": "deal updated"}) + else: + print("error)") + return jsonify({"message": "deal not found"}), 404 + +def delete_deal(deal_name,client): + db = client['deals'] + deals = db.deals + result = deals.delete_one({"deal_name": deal_name}) + if result.deleted_count: + return jsonify({"message": "deal deleted"}) + else: + return jsonify({"message": "deal not found"}), 404 + +def list_all_deals(client): + db = client['deals'] + deals = db.deals + all_deals_with_id = list(deals.find({})) + for item in all_deals_with_id: + print(item) + item["_id"] = str(item["_id"]) + return jsonify(all_deals_with_id) + +def post_deal(request,client): + db = client['deals'] + deals = db.deals + print("Submitting deal") + try: + + deal_data = prepare_data(request.get_json()) + try: + deals.insert_one(deal_data[0]) + return jsonify({"message": "deal added"}), 201 + except Exception as e: + # If an error occurs, print the error and return an appropriate response + print("Error occurred:", e) + return jsonify({"error": str(e)}), 500 + except Exception as e: + # Handle exceptions + print(e) + return str(e), 500 + +def prepare_data(data): + # Extract form data + name = data['name'] + seller_id = data['seller_id'] + buyer_id = data['buyer_id'] + deal_floor = data['deal_floor'] + deal_floor_curr = data['deal_floor_curr'] + price_type=data['price_type'] + code = data['code'] + + # Create the data payload in the required format + payload = [{ + "name": name, + "seller_id": seller_id, + "code": code, + "buyer_id": buyer_id, + "deal_floor": deal_floor, + "prive_type": price_type, + "deal_floor_curr": deal_floor_curr + }] + return payload diff --git a/services/seller.py b/services/seller.py new file mode 100644 index 0000000..5cb7881 --- /dev/null +++ b/services/seller.py @@ -0,0 +1,74 @@ +from flask import Flask, request, jsonify, request, render_template, redirect,url_for +import requests +from bson import ObjectId + +def get_seller(seller_id,client): + # Get a single seller + # Select the database + db = client['sellers'] + sellers = db.sellers + seller_id = ObjectId(seller_id) + seller = sellers.find_one({"_id": seller_id}, {'_id': 0}) + if seller: + return jsonify(seller) + else: + return jsonify({"message": "seller not found" }), 404 + +def put_seller(seller_id,request,client): + db = client['sellers'] + sellers = db.sellers + seller_id=ObjectId(seller_id) + payload = prepare_data(request.get_json())[0] + result = sellers.update_one({"_id": seller_id}, {"$set": payload}) + if result.matched_count: + print("updated") + return jsonify({"message": "seller updated"}) + else: + print("error)") + return jsonify({"message": "seller not found"}), 404 + +def delete_seller(seller_name,client): + db = client['sellers'] + sellers = db.sellers + result = sellers.delete_one({"seller_name": seller_name}) + if result.deleted_count: + return jsonify({"message": "seller deleted"}) + else: + return jsonify({"message": "seller not found"}), 404 + +def list_all_sellers(client): + db = client['sellers'] + sellers = db.sellers + all_sellers_with_id = list(sellers.find({})) + for item in all_sellers_with_id: + print(item) + item["_id"] = str(item["_id"]) + return jsonify(all_sellers_with_id) + +def post_seller(request,client): + db = client['sellers'] + sellers = db.sellers + print("Submitting seller") + try: + + seller_data = prepare_data(request.get_json()) + try: + sellers.insert_one(seller_data[0]) + return jsonify({"message": "seller added"}), 201 + except Exception as e: + # If an error occurs, print the error and return an appropriate response + print("Error occurred:", e) + return jsonify({"error": str(e)}), 500 + except Exception as e: + # Handle exceptions + print(e) + return str(e), 500 + +def prepare_data(data): + # Extract form data + name = data['name'] + # Create the data payload in the required format + payload = [{ + "name": name, + }] + return payload diff --git a/utils/__pycache__/auth.cpython-311.pyc b/utils/__pycache__/auth.cpython-311.pyc index df767eb..36e3433 100644 Binary files a/utils/__pycache__/auth.cpython-311.pyc and b/utils/__pycache__/auth.cpython-311.pyc differ diff --git a/utils/auth.py b/utils/auth.py index 1cca211..6fcd610 100644 --- a/utils/auth.py +++ b/utils/auth.py @@ -54,6 +54,7 @@ def verify_decode_jwt(token): jsonurl = urlopen(f"https://{AUTH0_DOMAIN}/.well-known/jwks.json") jwks = json.loads(jsonurl.read()) unverified_header = jwt.get_unverified_header(token) + claims = jwt.get_unverified_claims(token) rsa_key = {} for key in jwks["keys"]: if key["kid"] == unverified_header["kid"]: @@ -72,8 +73,11 @@ def verify_decode_jwt(token): audience=API_AUDIENCE, issuer=f"https://{AUTH0_DOMAIN}/" ) - return payload - except ExpiredSignatureError: + namespace = 'https://anotherdsp.com/claims' # Must match the namespace in the Auth0 Rule + app_metadata = payload.get(namespace + 'app_metadata', {}) + print(claims) + print(app_metadata) + return payload, app_metadata # Return both payload and app_metadata raise AuthError({"code": "token_expired", "description": "Token expired"}, 401) except JWTError as e: # Catching JWTError for other JWT related issues @@ -92,8 +96,10 @@ def decorated_function(*args, **kwargs): # For example, getting and verifying the token try: token = get_token_auth_header() - payload = verify_decode_jwt(token) - # Any additional checks you want to perform + payload, app_metadata = verify_decode_jwt(token) + if 'buyer_id' in app_metadata: + buyer_id = app_metadata['buyer_id'] + kwargs['buyer_id'] = buyer_id except AuthError as auth_error: # Handle authentication errors return handle_auth_error(auth_error)