82 lines
2.8 KiB
Python
82 lines
2.8 KiB
Python
import logging
|
|
import json
|
|
|
|
from flask import request, make_response, Blueprint
|
|
|
|
from app import billing as stripe
|
|
from data import model
|
|
from auth.auth import process_auth
|
|
from auth.permissions import ModifyRepositoryPermission
|
|
from util.invoice import renderInvoiceToHtml
|
|
from util.email import send_invoice_email
|
|
from util.names import parse_repository_name
|
|
from util.http import abort
|
|
from endpoints.trigger import BuildTrigger, ValidationRequestException
|
|
from endpoints.common import start_build
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
webhooks = Blueprint('webhooks', __name__)
|
|
|
|
|
|
@webhooks.route('/stripe', methods=['POST'])
|
|
def stripe_webhook():
|
|
request_data = request.get_json()
|
|
logger.debug('Stripe webhook call: %s' % request_data)
|
|
|
|
event_type = request_data['type'] if 'type' in request_data else None
|
|
if event_type == 'charge.succeeded':
|
|
data = request_data['data'] if 'data' in request_data else {}
|
|
obj = data['object'] if 'object' in data else {}
|
|
invoice_id = obj['invoice'] if 'invoice' in obj else None
|
|
customer_id = obj['customer'] if 'customer' in obj else None
|
|
|
|
if invoice_id and customer_id:
|
|
# Find the user associated with the customer ID.
|
|
user = model.get_user_or_org_by_customer_id(customer_id)
|
|
if user and user.invoice_email:
|
|
# Lookup the invoice.
|
|
invoice = stripe.Invoice.retrieve(invoice_id)
|
|
if invoice:
|
|
invoice_html = renderInvoiceToHtml(invoice, user)
|
|
send_invoice_email(user.email, invoice_html)
|
|
|
|
return make_response('Okay')
|
|
|
|
|
|
@webhooks.route('/push/<path:repository>/trigger/<trigger_uuid>',
|
|
methods=['POST'])
|
|
@process_auth
|
|
@parse_repository_name
|
|
def build_trigger_webhook(namespace, repository, trigger_uuid):
|
|
logger.debug('Webhook received for %s/%s with uuid %s', namespace,
|
|
repository, trigger_uuid)
|
|
permission = ModifyRepositoryPermission(namespace, repository)
|
|
if permission.can():
|
|
try:
|
|
trigger = model.get_build_trigger(namespace, repository, trigger_uuid)
|
|
except model.InvalidBuildTriggerException:
|
|
abort(404)
|
|
|
|
handler = BuildTrigger.get_trigger_for_service(trigger.service.name)
|
|
|
|
logger.debug('Passing webhook request to handler %s', handler)
|
|
config_dict = json.loads(trigger.config)
|
|
try:
|
|
specs = handler.handle_trigger_request(request, trigger.auth_token,
|
|
config_dict)
|
|
dockerfile_id, tags, name, subdir = specs
|
|
|
|
except ValidationRequestException:
|
|
# This was just a validation request, we don't need to build anything
|
|
return make_response('Okay')
|
|
|
|
pull_robot_name = model.get_pull_robot_name(trigger)
|
|
repo = model.get_repository(namespace, repository)
|
|
start_build(repo, dockerfile_id, tags, name, subdir, False, trigger,
|
|
pull_robot_name=pull_robot_name)
|
|
|
|
return make_response('Okay')
|
|
|
|
abort(403)
|