63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
from app.models import Customer, Account, Transaction
|
|
from app.api.enums import TransactionType
|
|
from flask import jsonify
|
|
from marshmallow import ValidationError
|
|
import logging
|
|
from app.api.integrations import KafkaIntegration
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class BaseService:
|
|
TRANSACTION_TYPE = None
|
|
|
|
@classmethod
|
|
def validate_data(cls, data, schema):
|
|
"""
|
|
Validate input data based on the provided schema.
|
|
"""
|
|
logger.info(f"Processing {cls.TRANSACTION_TYPE} request")
|
|
return schema.load(data)
|
|
|
|
@classmethod
|
|
def get_or_create_customer(cls, validated_data):
|
|
|
|
"""
|
|
Check if a customer exists; if not, create one.
|
|
"""
|
|
|
|
customer = Customer.query.filter_by(id=validated_data.get("customerId")).first()
|
|
if not customer:
|
|
customer = Customer.create_customer(
|
|
id=validated_data.get("customerId"),
|
|
msisdn=validated_data.get("msisdn"),
|
|
country_code=validated_data.get("countryCode"),
|
|
account_id=validated_data.get("accountId"),
|
|
)
|
|
return customer
|
|
|
|
@classmethod
|
|
def validate_account_ownership(cls, account_id, customer_id):
|
|
"""
|
|
Check if the provided account belongs to the customer.
|
|
"""
|
|
is_valid = Account.is_valid_account(account_id, customer_id)
|
|
return is_valid
|
|
|
|
@classmethod
|
|
def log_transaction(cls, validated_data):
|
|
"""
|
|
Create a new transaction.
|
|
"""
|
|
return Transaction.create_transaction(
|
|
transaction_id = validated_data.get("transactionId"),
|
|
ref_id = validated_data.get("refId") or validated_data.get("accountId"),
|
|
ref_model = validated_data.get("refModel", "account"),
|
|
type = cls.TRANSACTION_TYPE,
|
|
channel = validated_data.get("channel"),
|
|
)
|
|
|
|
@classmethod
|
|
def async_send_to_kafka(cls, loan_data, request_id, topic):
|
|
KafkaIntegration.send_loan_request(loan_data = loan_data, request_id = request_id, topic = topic)
|
|
KafkaIntegration.flush()
|