|  | @@ -0,0 +1,85 @@
 | 
	
		
			
				|  |  | +import stripe
 | 
	
		
			
				|  |  | +import os
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +from flask_restful import Resource, reqparse
 | 
	
		
			
				|  |  | +from flask_login import current_user
 | 
	
		
			
				|  |  | +from flask import current_app, request
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +from controllers.console import api
 | 
	
		
			
				|  |  | +from controllers.console.setup import setup_required
 | 
	
		
			
				|  |  | +from controllers.console.wraps import account_initialization_required
 | 
	
		
			
				|  |  | +from controllers.console.wraps import only_edition_cloud
 | 
	
		
			
				|  |  | +from libs.login import login_required
 | 
	
		
			
				|  |  | +from services.billing_service import BillingService
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class BillingInfo(Resource):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @setup_required
 | 
	
		
			
				|  |  | +    @login_required
 | 
	
		
			
				|  |  | +    @account_initialization_required
 | 
	
		
			
				|  |  | +    def get(self):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        edition = current_app.config['EDITION']
 | 
	
		
			
				|  |  | +        if edition != 'CLOUD':
 | 
	
		
			
				|  |  | +            return {"enabled": False}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return BillingService.get_info(current_user.current_tenant_id)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class Subscription(Resource):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @setup_required
 | 
	
		
			
				|  |  | +    @login_required
 | 
	
		
			
				|  |  | +    @account_initialization_required
 | 
	
		
			
				|  |  | +    @only_edition_cloud
 | 
	
		
			
				|  |  | +    def get(self):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        parser = reqparse.RequestParser()
 | 
	
		
			
				|  |  | +        parser.add_argument('plan', type=str, required=True, location='args', choices=['professional', 'team'])
 | 
	
		
			
				|  |  | +        parser.add_argument('interval', type=str, required=True, location='args', choices=['month', 'year'])
 | 
	
		
			
				|  |  | +        args = parser.parse_args()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return BillingService.get_subscription(args['plan'], args['interval'], current_user.email, current_user.name, current_user.current_tenant_id)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class Invoices(Resource):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @setup_required
 | 
	
		
			
				|  |  | +    @login_required
 | 
	
		
			
				|  |  | +    @account_initialization_required
 | 
	
		
			
				|  |  | +    @only_edition_cloud
 | 
	
		
			
				|  |  | +    def get(self):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return BillingService.get_invoices(current_user.email)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class StripeBillingWebhook(Resource):
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @setup_required
 | 
	
		
			
				|  |  | +    @only_edition_cloud
 | 
	
		
			
				|  |  | +    def post(self):
 | 
	
		
			
				|  |  | +        payload = request.data
 | 
	
		
			
				|  |  | +        sig_header = request.headers.get('STRIPE_SIGNATURE')
 | 
	
		
			
				|  |  | +        webhook_secret = os.environ.get('STRIPE_WEBHOOK_BILLING_SECRET', 'STRIPE_WEBHOOK_BILLING_SECRET')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        try:
 | 
	
		
			
				|  |  | +            event = stripe.Webhook.construct_event(
 | 
	
		
			
				|  |  | +                payload, sig_header, webhook_secret
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +        except ValueError as e:
 | 
	
		
			
				|  |  | +            # Invalid payload
 | 
	
		
			
				|  |  | +            return 'Invalid payload', 400
 | 
	
		
			
				|  |  | +        except stripe.error.SignatureVerificationError as e:
 | 
	
		
			
				|  |  | +            # Invalid signature
 | 
	
		
			
				|  |  | +            return 'Invalid signature', 400
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        BillingService.process_event(event)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return 'success', 200
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +api.add_resource(BillingInfo, '/billing/info')
 | 
	
		
			
				|  |  | +api.add_resource(Subscription, '/billing/subscription')
 | 
	
		
			
				|  |  | +api.add_resource(Invoices, '/billing/invoices')
 | 
	
		
			
				|  |  | +api.add_resource(StripeBillingWebhook, '/billing/webhook/stripe')
 |