[add]: eco routes, services and enums

This commit is contained in:
VivianDee
2025-07-25 15:14:30 +01:00
parent 5c99bf96c2
commit cb0d9938c6
27 changed files with 857 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
from app.eco.services.authorization import AuthorizationService
from app.eco.services.eligibility_check import EligibilityCheckService
from app.eco.services.get_offer import GetOfferService
from app.eco.services.provide_loan import ProvideLoanService
from app.eco.services.loan_information import LoanInformationService
from app.eco.services.repayment import RepaymentService
from app.eco.services.inflow_notification import InflowNotificationService
from app.eco.services.low_balance_notification import LowBalanceNotificationService
+102
View File
@@ -0,0 +1,102 @@
from flask import request, jsonify
from marshmallow import ValidationError
from app.eco.services.base_service import BaseService
from app.utils.logger import logger
from app.eco.schemas.authorization import AuthorizeRequestSchema
from app.eco.helpers.response_helper import ResponseHelper
from flask_jwt_extended import (
JWTManager,
jwt_required,
create_access_token,
create_refresh_token,
get_jwt_identity,
)
from app.config import Config
USERNAME = Config.BASIC_AUTH_USERNAME
PASSWORD = Config.BASIC_AUTH_PASSWORD
class AuthorizationService(BaseService):
@staticmethod
def process_request(data):
"""
Process the Authorization request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
logger.info("Processing Authorization request")
if not data:
return ResponseHelper.bad_request(result_description="Missing JSON in request")
# Validate input data using the Authorization schema
schema = AuthorizeRequestSchema()
validated_data = schema.load(data) # Raises ValidationError if invalid
if (
validated_data["username"] != USERNAME
or validated_data["password"] != PASSWORD
):
return ResponseHelper.unauthorized(result_description="Invalid credentials")
access_token = create_access_token(identity=validated_data["username"])
refresh_token = create_refresh_token(identity=validated_data["username"])
# Simulated processing logic
response_data = {
"access_token": access_token,
"refresh_token": refresh_token,
}
return ResponseHelper.success(
data={"data": response_data}, result_description="Authorization processed successfully"
)
except ValidationError as e:
logger.error(f"Validation error: {e}")
return ResponseHelper.bad_request(result_description=f"Validation error: {e}")
except Exception as e:
logger.error(f"Error processing Authorization request: {e}")
return ResponseHelper.internal_server_error(
result_description=f"Error processing Authorization request: {e}"
)
@staticmethod
def process_refresh_request():
"""
Process the RefreshToken request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
logger.info("Processing RefreshToken request")
identity = get_jwt_identity()
access_token = create_access_token(identity=identity)
# Simulated processing logic
response_data = {
"access_token": access_token,
}
return ResponseHelper.success(
data={"data": response_data}, result_description="RefreshToken processed successfully"
)
except Exception as e:
logger.error(f"Error processing RefreshToken request: {e}")
return ResponseHelper.internal_server_error(
result_description=f"Error processing RefreshToken request: {e}"
)
+37
View File
@@ -0,0 +1,37 @@
from app.eco.enums import TransactionType
from flask import jsonify
from marshmallow import ValidationError
import logging
from app.utils.mail import send_report_email, get_report_data
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 send_mail(cls, report_data, recipients):
send_report_email(report_data, recipients)
# @classmethod
# def log_session(cls, validated_data):
# """
# Create a new session.
# """
# channel = "USSD" if validated_data.get("channel") is None else validated_data.get("channel")
# return Session.create_session(
# session_id = validated_data.get("transactionId"),
# customer_id = validated_data.get('customerId', None),
# account_id = validated_data.get("accountId", None),
# type = cls.TRANSACTION_TYPE,
# channel = channel,
# )
+63
View File
@@ -0,0 +1,63 @@
from flask import session, jsonify
from app.utils.logger import logger
from app.eco.services.base_service import BaseService
from app.eco.schemas.eligibility_check import EligibilityCheckSchema
from marshmallow import ValidationError
from app.eco.enums import TransactionType
from app.eco.helpers.response_helper import ResponseHelper
import random
class EligibilityCheckService(BaseService):
TRANSACTION_TYPE = TransactionType.ELIGIBILITY_CHECK
@staticmethod
def process_request(data):
"""
Process the EligibilityCheck request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
# with db.session.begin():
validated_data = EligibilityCheckService.validate_data(
data, EligibilityCheckSchema()
)
account_id = validated_data.get("accountId")
customer_id = validated_data.get("customerId")
sessionId = validated_data.get("sessionId")
msisdn = validated_data.get("msisdn")
# Simulate processing
response_data = {
"minEligibleAmount": 1000.0,
"maxEligibleAmount": 50000.0,
"outstandingDebtAmount": 1000.0,
}
return ResponseHelper.success(data=response_data)
except ValidationError as err:
logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}")
# db.session.rollback()
return ResponseHelper.unprocessable_entity(
result_description="Validation exception"
)
except ValueError as err:
logger.error(f"{getattr(err, 'messages', str(err))}")
# db.session.rollback()
return ResponseHelper.error(result_description=str(err))
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
# db.session.rollback()
return ResponseHelper.internal_server_error()
+67
View File
@@ -0,0 +1,67 @@
from urllib import response
from app.utils.logger import logger
from app.eco.services.base_service import BaseService
from app.eco.schemas.get_offer import GetOfferSchema
from marshmallow import ValidationError
from app.eco.enums import TransactionType
from app.eco.helpers.response_helper import ResponseHelper
import random
class GetOfferService(BaseService):
TRANSACTION_TYPE = TransactionType.GET_OFFERS
@staticmethod
def process_request(data):
"""
Process the GetOffer request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
validated_data = GetOfferService.validate_data(
data, GetOfferSchema()
)
# Simulate processing
offers = [
{
"offerId": 14451,
"productId": "2030",
"amount": 10000.0,
"upfrontPayment": 1000.0,
"interestRate": 10.0,
"recommendedRepaymentDates": ["2022-11-30"],
"installmentAmount": 11000.0,
"totalRepaymentAmount": 11000.0
},
{
"offerId": 16645,
"productId": "2060",
"amount": 10000.0,
"upfrontPayment": 0.0,
"interestRate": 10.0,
"recommendedRepaymentDates": ["2022-11-30", "2023-12-30"],
"installmentAmount": 5761.9,
"totalRepaymentAmount": 11523.8
}
]
response_data = {
"outstandingDebtAmount": 0,
"offers": offers
}
return ResponseHelper.success(data=response_data)
except ValidationError as err:
logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}")
return ResponseHelper.unprocessable_entity(result_description="Validation exception")
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
return ResponseHelper.internal_server_error()
+38
View File
@@ -0,0 +1,38 @@
from urllib import response
from app.utils.logger import logger
from app.eco.services.base_service import BaseService
from app.eco.schemas.inflow_notification import InflowNotificationSchema
from marshmallow import ValidationError
from app.eco.enums import TransactionType
from app.eco.helpers.response_helper import ResponseHelper
import random
class InflowNotificationService(BaseService):
TRANSACTION_TYPE = TransactionType.INFLOW_NOTIFICATION
@staticmethod
def process_request(data):
"""
Process the InflowNotification request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
validated_data = InflowNotificationService.validate_data(
data, InflowNotificationSchema()
)
return ResponseHelper.success()
except ValidationError as err:
logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}")
return ResponseHelper.unprocessable_entity(result_description="Validation exception")
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
return ResponseHelper.internal_server_error()
+50
View File
@@ -0,0 +1,50 @@
from app.utils.logger import logger
from app.eco.services.base_service import BaseService
from app.eco.schemas.loan_information import LoanInformationSchema
from marshmallow import ValidationError
from app.eco.enums import TransactionType
from app.eco.helpers.response_helper import ResponseHelper
class LoanInformationService(BaseService):
TRANSACTION_TYPE = TransactionType.LOAN_INFORMATION
@staticmethod
def process_request(data):
"""
Process the LoanInformation request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
# Validate the input data
validated_data = LoanInformationService.validate_data(
data, LoanInformationSchema()
)
logger.info(f"Fetching loan information for customer {validated_data['customerId']}")
# Simulate fetching loan information
debts = LoanInformationService._generate_sample_debts(validated_data['customerId'])
response_data = {
"debts": debts,
"totalCurrentPayment": sum(debt['currentPaymentAmount'] for debt in debts),
"totalDebtAmount": sum(debt['totalRepaymentAmount'] for debt in debts),
"resultCode": "00",
"resultDescription": "Successful"
}
return ResponseHelper.success(result=loan_data)
except ValidationError as err:
logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}")
return ResponseHelper.unprocessable_entity(result_description="Validation exception")
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
return ResponseHelper.internal_server_error()
@@ -0,0 +1,38 @@
from urllib import response
from app.utils.logger import logger
from app.eco.services.base_service import BaseService
from app.eco.schemas.low_balance_notification import LowBalanceNotificationSchema
from marshmallow import ValidationError
from app.eco.enums import TransactionType
from app.eco.helpers.response_helper import ResponseHelper
import random
class LowBalanceNotificationService(BaseService):
TRANSACTION_TYPE = TransactionType.LOW_BALANCE_NOTIFICATION
@staticmethod
def process_request(data):
"""
Process the LowBalanceNotification request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
validated_data = LowBalanceNotificationService.validate_data(
data, LowBalanceNotificationSchema()
)
return ResponseHelper.success()
except ValidationError as err:
logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}")
return ResponseHelper.unprocessable_entity(result_description="Validation exception")
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
return ResponseHelper.internal_server_error()
+38
View File
@@ -0,0 +1,38 @@
from urllib import response
from app.utils.logger import logger
from app.eco.services.base_service import BaseService
from app.eco.schemas.provide_loan import ProvideLoanSchema
from marshmallow import ValidationError
from app.eco.enums import TransactionType
from app.eco.helpers.response_helper import ResponseHelper
import random
class ProvideLoanService(BaseService):
TRANSACTION_TYPE = TransactionType.PROVIDE_LOAN
@staticmethod
def process_request(data):
"""
Process the ProvideLoan request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
validated_data = ProvideLoanService.validate_data(
data, ProvideLoanSchema()
)
return ResponseHelper.success()
except ValidationError as err:
logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}")
return ResponseHelper.unprocessable_entity(result_description="Validation exception")
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
return ResponseHelper.internal_server_error()
+38
View File
@@ -0,0 +1,38 @@
from urllib import response
from app.utils.logger import logger
from app.eco.services.base_service import BaseService
from app.eco.schemas.repayment import RepaymentSchema
from marshmallow import ValidationError
from app.eco.enums import TransactionType
from app.eco.helpers.response_helper import ResponseHelper
import random
class RepaymentService(BaseService):
TRANSACTION_TYPE = TransactionType.REPAYMENT
@staticmethod
def process_request(data):
"""
Process the Repayment request.
Args:
data (dict): The request data.
Returns:
dict: A standardized response.
"""
try:
validated_data = RepaymentService.validate_data(
data, RepaymentSchema()
)
return ResponseHelper.success()
except ValidationError as err:
logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}")
return ResponseHelper.unprocessable_entity(result_description="Validation exception")
except Exception as e:
logger.error(f"An error occurred: {str(e)}", exc_info=True)
return ResponseHelper.internal_server_error()