Skip to content

Commit

Permalink
API Services refactor to use generic service structure
Browse files Browse the repository at this point in the history
  • Loading branch information
marsan02 committed Jan 23, 2024
1 parent 1baaaad commit 940c7e0
Show file tree
Hide file tree
Showing 23 changed files with 292 additions and 653 deletions.
Binary file modified __pycache__/main.cpython-311.pyc
Binary file not shown.
285 changes: 92 additions & 193 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@
import requests
from utils.auth import requires_auth, handle_auth_error, AuthError
import os
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
import services.reporting as reporting
from services.sellers import SellersService
from services.buyers import BuyersService
from services.deals import DealsService
from services.creatives import CreativesService
from services.campaigns import CampaignsService
from services.advertisers import AdvertisersService



load_dotenv() # This loads the environment variables from .env

Expand All @@ -25,241 +27,138 @@ def configure_routes(app):
mongo_uri = os.environ.get("MONGO_URI")
client = MongoClient(mongo_uri)
app.register_error_handler(AuthError, handle_auth_error)
sellers = SellersService(client)
buyers = BuyersService(client)
deals = DealsService(client)
creatives = CreativesService(client)
campaigns = CampaignsService(client)
advertisers = AdvertisersService(client)

@app.route('/countries')
@requires_auth
def get_countries(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
return geo_api.get_countries()

@app.route('/submit-campaign', methods=['POST','PUT'])
@app.route('/reporting', methods=['POST'])
@requires_auth
def submit_campaign(*args, **kwargs):
def submit_report(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'POST':
#retrieve campaign
return campaigns.post_campaign(buyer_id,request,client)
elif request.method == 'PUT':
# Update a campaign
campaign_id=request.args.get('_id')
return campaigns.put_campaign(buyer_id,campaign_id,request,client)
@app.route('/campaigns', methods=['GET'])
@requires_auth
def manage_campaigns(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
return campaigns.list_all_campaigns(buyer_id,client,request.args)
payload = request.json
return reporting.run_report(buyer_id,payload['dimensions'],payload['metrics'],payload['filters'])

@app.route('/campaign', methods=['GET', 'PUT', 'DELETE'])
@app.route('/campaign-monitoring', methods=['GET'])
@requires_auth
def process_campaign(*args, **kwargs):
def process_campaign_monitoring(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'GET':
#retrieve campaign
return campaigns.get_campaign(buyer_id,request.args['_id'],client)
elif request.method == 'PUT':
# Update a campaign
return campaigns.put_campaign(buyer_id,request.args['_id'],request,client)

elif request.method == 'DELETE':
# Delete a campaign
return campaigns.delete_campaign(buyer_id,request.args['_id'],client)
all_campaigns = campaigns.get(request.args, request.args.get('_id'))
payload = {
"dimensions": ["campaign_id"],
"metrics": ["bids", "imps", "clicks", "viewable_imps", "spend", "revenue"],
"filters": []
}
reporting_data = reporting.run_report(buyer_id, payload['dimensions'], payload['metrics'], payload['filters'])
all_campaigns = all_campaigns.json

@app.route('/submit-creative', methods=['POST','PUT'])
@requires_auth
def submit_creative(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method =='POST':
return creatives.post_creative(buyer_id,request,client)
elif request.method == 'PUT':
return creatives.put_creative(buyer_id,request.args['_id'],request,client)

# Create a lookup for campaign reporting data
reporting_lookup = {report['campaign_id']: report for report in reporting_data}

@app.route('/creatives', methods=['GET'])
@requires_auth
def manage_creatives(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
return creatives.list_all_creatives(buyer_id,client,request.args)
stitched_data = []
for campaign in all_campaigns:
campaign_id = campaign['_id']
if campaign_id in reporting_lookup:
# Merge the dictionaries (Python 3.5+)
merged = {**campaign, **reporting_lookup[campaign_id]}
else:
# Create a record with all metrics set to 0 for campaigns without reporting data
metrics_zero = {metric: 0 for metric in payload['metrics']}
metrics_zero['campaign_id'] = campaign_id
merged = {**campaign, **metrics_zero}

@app.route('/creative', methods=['GET', 'PUT', 'DELETE'])
stitched_data.append(merged)

return stitched_data

@app.route('/campaigns', methods=['POST','GET', 'PUT', 'DELETE'])
@requires_auth
def process_creative(*args, **kwargs):
def campaigns_service(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'GET':
#retrieve creative
return creatives.get_creative(buyer_id,client,request.args)
return campaigns.get(request.args,request.args.get('_id'))
elif request.method == 'PUT':
# Update a creative
return creatives.put_creative(buyer_id,request.args['_id'],request.json,client)

return campaigns.put(request.args['_id'],request.json,buyer_id)
elif request.method == 'DELETE':
# Delete a creative
return creatives.delete_creative(buyer_id,request.args['_id'],client)
return campaigns.delete(request.args['_id'],buyer_id)
elif request.method == 'POST':
return campaigns.post(request.json,buyer_id)

@app.route('/submit-advertiser', methods=['POST','PUT'])
@requires_auth
def submit_advertiser(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'POST':
#retrieve advertiser
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(buyer_id,advertiser_id,request,client)
@app.route('/advertisers', methods=['GET'])
@requires_auth
def manage_advertiser(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
return advertisers.list_all_advertisers(buyer_id,client)

@app.route('/advertiser', methods=['GET', 'PUT', 'DELETE'])
@app.route('/advertisers', methods=['POST','GET', 'PUT', 'DELETE'])
@requires_auth
def process_advertiser(*args, **kwargs):
def advertisers_service(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'GET':
#retrieve advertiser
return advertisers.get_advertiser(buyer_id,request.args['_id'],client)
return advertisers.get(request.args,request.args.get('_id'))
elif request.method == 'PUT':
# Update a advertiser
return advertisers.put_advertisers(buyer_id,request.args['_id'],request.json,client)

return advertisers.put(request.args['_id'],request.json,buyer_id)
elif request.method == 'DELETE':
# Delete a advertiser
return advertisers.delete_advertiser(buyer_id,request.args['_id'],client)

@app.route('/submit-buyer', methods=['POST','PUT'])
@requires_auth
def submit_buyer(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'POST':
#retrieve buyer
return buyers.post_buyer(buyer_id,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'])
return advertisers.delete(request.args['_id'],buyer_id)
elif request.method == 'POST':
return advertisers.post(request.json,buyer_id)

@app.route('/deals', methods=['POST','GET', 'PUT', 'DELETE'])
@requires_auth
def manage_buyer(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
return buyers.list_all_buyers(buyer_id,client)

@app.route('/buyer', methods=['GET', 'PUT', 'DELETE'])
@requires_auth
def process_buyer(*args, **kwargs):
def deals_service(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'GET':
#retrieve buyer
return buyers.get_buyer(buyer_id,request.args['_id'],client)
return deals.get(request.args,request.args.get('_id'))
elif request.method == 'PUT':
# Update a buyer
return buyers.put_buyer(buyer_id,request.args['_id'],request.json,client)

return deals.put(request.args['_id'],request.json,buyer_id)
elif request.method == 'DELETE':
# Delete a buyer
return buyers.delete_buyer(buyer_id,buyer_name,client)

@app.route('/submit-deal', methods=['POST','PUT'])
@requires_auth
def submit_deal(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'POST':
#retrieve deal
return deals.post_deal(buyer_id,request,client)
elif request.method == 'PUT':
# Update a deal
deal_id=request.args.get('_id')
return deals.put_deal(buyer_id,deal_id,request,client)


@app.route('/reporting', methods=['POST'])
@requires_auth
def submit_report(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'POST':
payload = request.json
return reporting.run_report(buyer_id,payload['dimensions'],payload['metrics'],payload['filters'])

@app.route('/campaign-monitoring', methods=['GET'])
@requires_auth
def process_campaign_monitoring(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
buyer_id = kwargs.get('buyer_id', None)
all_campaigns = campaigns.list_all_campaigns(buyer_id,client,request.args)
payload = {"dimensions":["campaign_id"],"metrics":["bids","imps","clicks","viewable_imps","spend","revenue"],"filters":[]}
reporting_data = reporting.run_report(buyer_id,payload['dimensions'],payload['metrics'],payload['filters'])
campaign_lookup = {campaign['_id']: campaign for campaign in all_campaigns}
stitched_data = []
print(reporting_data)
for report in reporting_data:
print(report)
campaign_id = report['campaign_id']
if campaign_id in campaign_lookup:
# Merge the dictionaries (Python 3.5+)
merged = {**campaign_lookup[campaign_id], **report}
stitched_data.append(merged)
return stitched_data


@app.route('/deals', methods=['GET'])
@requires_auth
def manage_deal(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
return deals.list_all_deals(buyer_id,client)

@app.route('/deal', methods=['GET', 'PUT', 'DELETE'])
return deals.delete(request.args['_id'],buyer_id)
elif request.method == 'POST':
return deals.post(request.json,buyer_id)

@app.route('/creatives', methods=['POST','GET', 'PUT', 'DELETE'])
@requires_auth
def process_deal(*args, **kwargs):
def creatives_service(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'GET':
#retrieve deal
return deals.get_deal(buyer_id,request.args['_id'],client)
return creatives.get(request.args,request.args.get('_id'))
elif request.method == 'PUT':
# Update a deal
return deals.put_deal(buyer_id,request.args['_id'],request.json,client)

return creatives.put(request.args['_id'],request.json,buyer_id)
elif request.method == 'DELETE':
# Delete a deal
return deals.delete_deal(buyer_id,request.args['_id'],client)
return creatives.delete(request.args['_id'],buyer_id)
elif request.method == 'POST':
return creatives.post(request.json,buyer_id)


@app.route('/submit-seller', methods=['POST','PUT'])
@app.route('/sellers', methods=['POST','GET', 'PUT', 'DELETE'])
@requires_auth
def submit_seller(*args, **kwargs):
def sellers_service(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'POST':
#retrieve seller
return sellers.post_seller(buyer_id,request,client)
if request.method == 'GET':
return sellers.get(request.args,request.args.get('_id'))
elif request.method == 'PUT':
# Update a seller
seller_id=request.args.get('_id')
return sellers.put_seller(buyer_id,seller_id,request,client)
@app.route('/sellers', methods=['GET'])
@requires_auth
def manage_seller(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
return sellers.list_all_sellers(buyer_id,client)
return sellers.put(request.args['_id'],request.json,buyer_id)
elif request.method == 'DELETE':
return sellers.delete(request.args['_id'],buyer_id)
elif request.method == 'POST':
return sellers.post(request.json,buyer_id)

@app.route('/seller', methods=['GET', 'PUT', 'DELETE'])
@app.route('/buyers', methods=['POST','GET', 'PUT', 'DELETE'])
@requires_auth
def process_seller(*args, **kwargs):
def buyers_service(*args, **kwargs):
buyer_id = kwargs.get('buyer_id', None)
if request.method == 'GET':
#retrieve seller
return sellers.get_seller(buyer_id,request.args['_id'],client)
return buyers.get(request.args,request.args.get('_id'))
elif request.method == 'PUT':
# Update a seller
return sellers.put_seller(buyer_id,request.args['_id'],request.json,client)

return buyers.put(request.args['_id'],request.json,buyer_id)
elif request.method == 'DELETE':
# Delete a seller
return sellers.delete_seller(buyer_id,seller_name,client)





return buyers.delete(request.args['_id'],buyer_id)
elif request.method == 'POST':
return buyers.post(request.json,buyer_id)
# Example of a protected route

@app.route('/')
def your_protected_route():
# Now this route only requires the user to be authenticated
Expand Down
Binary file added services/__pycache__/advertisers.cpython-311.pyc
Binary file not shown.
Binary file added services/__pycache__/buyers.cpython-311.pyc
Binary file not shown.
Binary file added services/__pycache__/campaigns.cpython-311.pyc
Binary file not shown.
Binary file added services/__pycache__/creatives.cpython-311.pyc
Binary file not shown.
Binary file added services/__pycache__/deals.cpython-311.pyc
Binary file not shown.
Binary file not shown.
Binary file modified services/__pycache__/seller.cpython-311.pyc
Binary file not shown.
Binary file not shown.
Binary file added services/__pycache__/sellers.cpython-311.pyc
Binary file not shown.
12 changes: 12 additions & 0 deletions services/advertisers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from flask import Flask, request, jsonify, request, render_template, redirect,url_for
import requests
from bson import ObjectId
from services.generic_service import BaseAPIService

class AdvertisersService(BaseAPIService):
def __init__(self,client):
super().__init__(
database = "advertisers",
schema = {"name":str,"default_brand_url":str},
client = client
)
Loading

0 comments on commit 940c7e0

Please sign in to comment.