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()