Merge backend/micro-services-restructuring into main #69

Open
kscheidecker wants to merge 34 commits from backend/micro-services-restructuring into main
2 changed files with 29 additions and 13 deletions
Showing only changes of commit 40e5ba084b - Show all commits

View File

@@ -5,6 +5,7 @@ from datetime import datetime, timedelta
import requests import requests
from pydantic import BaseModel, Field, field_validator from pydantic import BaseModel, Field, field_validator
from fastapi.responses import RedirectResponse
from ..configuration.environment import Environment from ..configuration.environment import Environment
from ..cache import CreditCache, make_credit_cache_key from ..cache import CreditCache, make_credit_cache_key
@@ -268,8 +269,11 @@ class PaypalClient:
} }
} }
], ],
# No redirect from paypal
'application_context': { 'application_context': {
'return_url': return_url_success, # 'return_url': f'https://anydev.info/orders/{json.loads(order_response.text)["id"]}/{order_request.user_id}capture', # This returns to backend capture-payment URL
# 'cancel_url': return_url_failure
'return_url': 'https://anydev.info/api/paypal/capture',
'cancel_url': return_url_failure 'cancel_url': return_url_failure
} }
} }
@@ -289,10 +293,16 @@ class PaypalClient:
self.logger.error(f'Error creating PayPal order: {exc}') self.logger.error(f'Error creating PayPal order: {exc}')
return None return None
order_response.raise_for_status() try:
order_response.raise_for_status()
except:
return RedirectResponse(url=return_url_failure)
user_id = order_request.user_id
order_id = json.loads(order_response.text)["id"]
# TODO Now that we have the order ID, we can inscribe the details in sql database using the order id given by paypal # TODO Now that we have the order ID, we can inscribe the details in sql database using the order id given by paypal
# DB for storing the transactions: # DB for storing the transaction records:
# order_id (key): json.loads(order_response.text)["id"] # order_id (key): json.loads(order_response.text)["id"]
# user_id : order_request.user_id # user_id : order_request.user_id
@@ -305,12 +315,13 @@ class PaypalClient:
# Create a cache item for credits to be granted to user # Create a cache item for credits to be granted to user
CreditCache.set_credits( CreditCache.set_credits(
user_id = order_request.user_id, user_id = user_id,
order_id = json.loads(order_response.text)["id"], order_id = order_id,
credits_to_grant = order_request.total_credits) credits_to_grant = order_request.total_credits)
return order_response.json() # return order_response.json()
return RedirectResponse(url=f'https://anydev.info/orders/{order_id}/{user_id}capture')
# Standalone function to capture a payment # Standalone function to capture a payment

View File

@@ -2,6 +2,7 @@ import logging
from typing import Literal from typing import Literal
from fastapi import APIRouter, Query, Body from fastapi import APIRouter, Query, Body
from fastapi.responses import RedirectResponse
from ..payments import PaypalClient, OrderRequest from ..payments import PaypalClient, OrderRequest
from ..supabase.supabase import SupabaseClient from ..supabase.supabase import SupabaseClient
from ..cache import CreditCache, make_credit_cache_key from ..cache import CreditCache, make_credit_cache_key
@@ -24,8 +25,8 @@ def create_order(
user_id: str = Query(...), user_id: str = Query(...),
basket: list = Query(...), basket: list = Query(...),
currency: str = Query(...), currency: str = Query(...),
return_url_success: str = Query('https://anydev.info'), return_url_success: str = Query('https://anydev.info/orders/success'),
return_url_failure: str = Query('https://anydev.info') return_url_failure: str = Query('https://anydev.info/orders/failed')
): ):
""" """
Creates a new PayPal order. Creates a new PayPal order.
@@ -47,7 +48,10 @@ def create_order(
) )
# Process the order and return the details # Process the order and return the details
return paypal_client.order(order_request=order, return_url_success=return_url_success, return_url_failure=return_url_failure) return paypal_client.order(
order_request=order,
return_url_success=return_url_success,
return_url_failure=return_url_failure)
@@ -72,11 +76,12 @@ def capture_order(order_id: str, user_id: str):
user_id=user_id, user_id=user_id,
amount=credits amount=credits
) )
logger.info('Payment capture succeeded: incrementing balance of user {user_id} by {credits}.') logger.info(f'Payment capture succeeded: incrementing balance of user {user_id} by {credits}.')
else: return RedirectResponse(url='https://anydev.info/orders/success')
logger.error('Capture payment failed. Could not find cache key for user {user_id} and order {order_id}')
logger.error(f'Capture payment failed. Could not find cache key for user {user_id} and order {order_id}')
return result return RedirectResponse(url='https://anydev.info/orders/failed')