diff --git a/.gitignore b/.gitignore index 1541da5..b316843 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ __pycache__/ -.env \ No newline at end of file +.env +app.log +.DS_Store \ No newline at end of file diff --git a/app.log b/app.log deleted file mode 100644 index cc06c06..0000000 --- a/app.log +++ /dev/null @@ -1,138 +0,0 @@ -2025-03-21 08:07:50,689 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5000 - * Running on http://172.21.0.2:5000 -2025-03-21 08:07:50,689 - INFO - Press CTRL+C to quit -2025-03-21 08:25:00,902 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5000 - * Running on http://172.21.0.2:5000 -2025-03-21 08:25:00,903 - INFO - Press CTRL+C to quit -2025-03-21 08:27:59,768 - INFO - before_request middleware triggered -2025-03-21 08:27:59,772 - ERROR - Unauthorized access: Missing API key. -2025-03-21 08:27:59,774 - INFO - 172.21.0.1 - - [21/Mar/2025 08:27:59] "GET /health HTTP/1.1" 200 - -2025-03-21 08:27:59,921 - INFO - 172.21.0.1 - - [21/Mar/2025 08:27:59] "GET /favicon.ico HTTP/1.1" 404 - -2025-03-21 08:28:47,107 - INFO - before_request middleware triggered -2025-03-21 08:28:47,108 - ERROR - Unauthorized access: Missing API key. -2025-03-21 08:28:47,111 - INFO - 172.21.0.1 - - [21/Mar/2025 08:28:47] "POST /Disbursement HTTP/1.1" 200 - -2025-03-21 08:30:01,346 - INFO - before_request middleware triggered -2025-03-21 08:30:01,350 - INFO - Processing Disbursement request -2025-03-21 08:30:01,352 - ERROR - Validation Error: {'countryId': ['Missing data for required field.'], 'collectAmountMgtFee': ['Missing data for required field.'], 'requestId': ['Missing data for required field.'], 'debtId': ['Missing data for required field.'], 'provideAmount': ['Missing data for required field.'], 'collectAmountVAT': ['Missing data for required field.'], 'collectAmountInsurance': ['Missing data for required field.'], 'productId': ['Missing data for required field.'], 'msisdn': ['Unknown field.'], 'channel': ['Unknown field.'], 'lienAmount': ['Unknown field.'], '$type': ['Unknown field.'], 'countryCode': ['Unknown field.']} -2025-03-21 08:30:01,353 - INFO - 172.21.0.1 - - [21/Mar/2025 08:30:01] "POST /Disbursement HTTP/1.1" 200 - -2025-03-21 08:34:16,957 - INFO - before_request middleware triggered -2025-03-21 08:34:16,960 - INFO - Processing Disbursement request -2025-03-21 08:34:16,970 - ERROR - Validation Error: {'countryId': ['Missing data for required field.'], 'collectAmountMgtFee': ['Missing data for required field.'], 'requestId': ['Missing data for required field.'], 'debtId': ['Missing data for required field.'], 'provideAmount': ['Missing data for required field.'], 'collectAmountVAT': ['Missing data for required field.'], 'collectAmountInsurance': ['Missing data for required field.'], 'productId': ['Missing data for required field.'], 'msisdn': ['Unknown field.'], 'channel': ['Unknown field.'], 'lienAmount': ['Unknown field.'], '$type': ['Unknown field.'], 'countryCode': ['Unknown field.']} -2025-03-21 08:34:16,973 - INFO - 172.21.0.1 - - [21/Mar/2025 08:34:16] "POST /Disbursement HTTP/1.1" 200 - -2025-03-21 08:38:52,829 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5000 - * Running on http://172.21.0.2:5000 -2025-03-21 08:38:52,829 - INFO - Press CTRL+C to quit -2025-03-21 08:44:44,426 - INFO - before_request middleware triggered -2025-03-21 08:44:44,430 - ERROR - Exception on /Disbursement [POST] -Traceback (most recent call last): - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2190, in wsgi_app - response = self.full_dispatch_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1486, in full_dispatch_request - rv = self.handle_user_exception(e) - File "/usr/local/lib/python3.9/site-packages/flask_cors/extension.py", line 165, in wrapped_function - return cors_after_request(app.make_response(f(*args, **kwargs))) - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1482, in full_dispatch_request - rv = self.preprocess_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1974, in preprocess_request - rv = self.ensure_sync(before_func)() - File "/app/app/routes/routes.py", line 24, in require_api_key_middleware - return require_api_key() -TypeError: require_api_key() missing 1 required positional argument: 'f' -2025-03-21 08:44:44,446 - INFO - 172.21.0.1 - - [21/Mar/2025 08:44:44] "POST /Disbursement HTTP/1.1" 500 - -2025-03-21 09:02:19,681 - INFO - before_request middleware triggered -2025-03-21 09:02:19,683 - ERROR - Exception on /Disbursement [POST] -Traceback (most recent call last): - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2190, in wsgi_app - response = self.full_dispatch_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1486, in full_dispatch_request - rv = self.handle_user_exception(e) - File "/usr/local/lib/python3.9/site-packages/flask_cors/extension.py", line 165, in wrapped_function - return cors_after_request(app.make_response(f(*args, **kwargs))) - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1482, in full_dispatch_request - rv = self.preprocess_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1974, in preprocess_request - rv = self.ensure_sync(before_func)() - File "/app/app/routes/routes.py", line 24, in require_api_key_middleware - return require_api_key() -TypeError: require_api_key() missing 1 required positional argument: 'f' -2025-03-21 09:02:19,685 - INFO - 172.21.0.1 - - [21/Mar/2025 09:02:19] "POST /Disbursement HTTP/1.1" 500 - -2025-03-21 09:02:24,680 - INFO - before_request middleware triggered -2025-03-21 09:02:24,681 - ERROR - Exception on /Disbursement [POST] -Traceback (most recent call last): - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2190, in wsgi_app - response = self.full_dispatch_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1486, in full_dispatch_request - rv = self.handle_user_exception(e) - File "/usr/local/lib/python3.9/site-packages/flask_cors/extension.py", line 165, in wrapped_function - return cors_after_request(app.make_response(f(*args, **kwargs))) - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1482, in full_dispatch_request - rv = self.preprocess_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1974, in preprocess_request - rv = self.ensure_sync(before_func)() - File "/app/app/routes/routes.py", line 24, in require_api_key_middleware - return require_api_key() -TypeError: require_api_key() missing 1 required positional argument: 'f' -2025-03-21 09:02:24,683 - INFO - 172.21.0.1 - - [21/Mar/2025 09:02:24] "POST /Disbursement HTTP/1.1" 500 - -2025-03-21 09:03:00,120 - INFO - before_request middleware triggered -2025-03-21 09:03:00,121 - ERROR - Exception on /Disbursement [POST] -Traceback (most recent call last): - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2190, in wsgi_app - response = self.full_dispatch_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1486, in full_dispatch_request - rv = self.handle_user_exception(e) - File "/usr/local/lib/python3.9/site-packages/flask_cors/extension.py", line 165, in wrapped_function - return cors_after_request(app.make_response(f(*args, **kwargs))) - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1482, in full_dispatch_request - rv = self.preprocess_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1974, in preprocess_request - rv = self.ensure_sync(before_func)() - File "/app/app/routes/routes.py", line 24, in require_api_key_middleware - return require_api_key() -TypeError: require_api_key() missing 1 required positional argument: 'f' -2025-03-21 09:03:00,122 - INFO - 172.21.0.1 - - [21/Mar/2025 09:03:00] "POST /Disbursement HTTP/1.1" 500 - -2025-03-21 09:03:03,022 - INFO - before_request middleware triggered -2025-03-21 09:03:03,023 - ERROR - Exception on /Disbursement [POST] -Traceback (most recent call last): - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2190, in wsgi_app - response = self.full_dispatch_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1486, in full_dispatch_request - rv = self.handle_user_exception(e) - File "/usr/local/lib/python3.9/site-packages/flask_cors/extension.py", line 165, in wrapped_function - return cors_after_request(app.make_response(f(*args, **kwargs))) - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1482, in full_dispatch_request - rv = self.preprocess_request() - File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1974, in preprocess_request - rv = self.ensure_sync(before_func)() - File "/app/app/routes/routes.py", line 24, in require_api_key_middleware - return require_api_key() -TypeError: require_api_key() missing 1 required positional argument: 'f' -2025-03-21 09:03:03,024 - INFO - 172.21.0.1 - - [21/Mar/2025 09:03:03] "POST /Disbursement HTTP/1.1" 500 - -2025-03-21 09:03:36,056 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5000 - * Running on http://172.21.0.2:5000 -2025-03-21 09:03:36,056 - INFO - Press CTRL+C to quit -2025-03-21 09:03:43,372 - INFO - before_request middleware triggered -2025-03-21 09:03:43,373 - INFO - Processing Disbursement request -2025-03-21 09:03:43,374 - ERROR - Validation Error: {'collectAmountMgtFee': ['Missing data for required field.'], 'collectAmountVAT': ['Missing data for required field.'], 'collectAmountInsurance': ['Missing data for required field.'], 'productId': ['Missing data for required field.'], 'countryId': ['Missing data for required field.'], 'provideAmount': ['Missing data for required field.'], 'debtId': ['Missing data for required field.'], 'requestId': ['Missing data for required field.'], 'countryCode': ['Unknown field.'], 'lienAmount': ['Unknown field.'], 'msisdn': ['Unknown field.'], '$type': ['Unknown field.'], 'channel': ['Unknown field.']} -2025-03-21 09:03:43,375 - INFO - 172.21.0.1 - - [21/Mar/2025 09:03:43] "POST /Disbursement HTTP/1.1" 200 - -2025-03-21 09:16:24,496 - INFO - before_request middleware triggered -2025-03-21 09:16:24,496 - INFO - Processing Disbursement request -2025-03-21 09:16:24,498 - ERROR - Validation Error: {'productId': ['Missing data for required field.'], 'debtId': ['Missing data for required field.'], 'collectAmountMgtFee': ['Missing data for required field.'], 'collectAmountVAT': ['Missing data for required field.'], 'provideAmount': ['Missing data for required field.'], 'requestId': ['Missing data for required field.'], 'collectAmountInsurance': ['Missing data for required field.'], 'countryId': ['Missing data for required field.'], 'channel': ['Unknown field.'], '$type': ['Unknown field.'], 'msisdn': ['Unknown field.'], 'countryCode': ['Unknown field.'], 'lienAmount': ['Unknown field.']} -2025-03-21 09:40:40,601 - ERROR - Unauthorized access: Invalid API key. -2025-03-21 09:41:09,390 - INFO - Processing Disbursement request -2025-03-21 09:41:09,396 - ERROR - Validation Error: {'requestId': ['Missing data for required field.'], 'productId': ['Missing data for required field.'], 'collectAmountMgtFee': ['Missing data for required field.'], 'collectAmountVAT': ['Missing data for required field.'], 'provideAmount': ['Missing data for required field.'], 'countryId': ['Missing data for required field.'], 'debtId': ['Missing data for required field.'], 'collectAmountInsurance': ['Missing data for required field.'], 'channel': ['Unknown field.'], 'lienAmount': ['Unknown field.'], '$type': ['Unknown field.'], 'msisdn': ['Unknown field.'], 'countryCode': ['Unknown field.']} -2025-03-21 09:41:13,582 - ERROR - Unauthorized access: Missing App-ID. -2025-03-21 09:41:16,993 - INFO - Processing Disbursement request -2025-03-21 09:41:16,995 - ERROR - Validation Error: {'requestId': ['Missing data for required field.'], 'productId': ['Missing data for required field.'], 'collectAmountMgtFee': ['Missing data for required field.'], 'collectAmountVAT': ['Missing data for required field.'], 'provideAmount': ['Missing data for required field.'], 'countryId': ['Missing data for required field.'], 'debtId': ['Missing data for required field.'], 'collectAmountInsurance': ['Missing data for required field.'], 'channel': ['Unknown field.'], 'lienAmount': ['Unknown field.'], '$type': ['Unknown field.'], 'msisdn': ['Unknown field.'], 'countryCode': ['Unknown field.']} -2025-03-21 09:48:19,845 - ERROR - Unauthorized access: Missing API key. -2025-03-21 10:32:19,196 - ERROR - Unauthorized access: Missing API key. -2025-03-21 10:46:47,209 - ERROR - Unauthorized access: Missing API key. -2025-03-21 11:05:50,287 - INFO - Processing Disbursement request -2025-03-21 11:05:50,290 - ERROR - Validation Error: {'debtId': ['Missing data for required field.'], 'requestId': ['Missing data for required field.'], 'productId': ['Missing data for required field.'], 'provideAmount': ['Missing data for required field.'], 'collectAmountInsurance': ['Missing data for required field.'], 'collectAmountVAT': ['Missing data for required field.'], 'countryId': ['Missing data for required field.'], 'collectAmountMgtFee': ['Missing data for required field.'], 'msisdn': ['Unknown field.'], 'channel': ['Unknown field.'], 'lienAmount': ['Unknown field.'], 'countryCode': ['Unknown field.'], '$type': ['Unknown field.']} diff --git a/app/blueprints/__init__.py b/app/blueprints/__init__.py deleted file mode 100644 index f877f51..0000000 --- a/app/blueprints/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from app.blueprints.rac_check import RACCheckService -from app.blueprints.disbursement import DisbursementService -from app.blueprints.collect_loan import CollectLoanService -from app.blueprints.transaction_verify import TransactionVerifyService -from app.blueprints.penal_charge import PenalChargeService -from app.blueprints.revoke_enable_consent import RevokeEnableConsentService -from app.blueprints.token_validation import TokenValidationService -from app.blueprints.lien_check import LienCheckService -from app.blueprints.new_transaction_check import NewTransactionCheckService diff --git a/app/errors/handlers.py b/app/errors/handlers.py index 8f7a945..0b4cbdf 100644 --- a/app/errors/handlers.py +++ b/app/errors/handlers.py @@ -2,13 +2,13 @@ from flask import jsonify from app.helpers.response_helper import ResponseHelper def method_not_allowed(error): - return ResponseHelper.method_not_allowed(message="Method Not Allowed") + return jsonify({"message": "Method Not Allowed"}), 405 def not_found(error): - return ResponseHelper.not_found(message="URL Not Found") + return jsonify({"message": "Resource not found"}), 404 def bad_request(error): - return ResponseHelper.bad_request(message="Bad Request") + return jsonify({"message": "Bad Request"}), 400 def unsupported_media_type(error): - return ResponseHelper.error(message="Unsupported Media Type", status_code=415) + return jsonify({"message": "Unsupported Media Type"}), 415 diff --git a/app/middlewares/__init__.py b/app/middlewares/__init__.py index d9c542e..c439164 100644 --- a/app/middlewares/__init__.py +++ b/app/middlewares/__init__.py @@ -1,4 +1,3 @@ from .verify_api_key import require_api_key from .app_id_checker import require_app_id -from .request_validator import validate_json from .cors import enforce_json \ No newline at end of file diff --git a/app/middlewares/app_id_checker.py b/app/middlewares/app_id_checker.py index dd74af5..18797b0 100644 --- a/app/middlewares/app_id_checker.py +++ b/app/middlewares/app_id_checker.py @@ -1,6 +1,5 @@ from functools import wraps -from flask import request -from app.helpers.response_helper import ResponseHelper +from flask import request, jsonify from app.utils.logger import logger import os @@ -15,11 +14,12 @@ def require_app_id(f): if not app_id: logger.error("Unauthorized access: Missing App-ID.") - return ResponseHelper.unauthorized("Missing App-ID") + return jsonify({"message": "Invalid request parameters"}), 400 + if app_id not in VALID_APP_ID: logger.error(f"Unauthorized access: Invalid App-ID {app_id}.") - return ResponseHelper.unauthorized("Invalid App-ID") + return jsonify({"message": "Invalid request parameters"}), 400 return f(*args, **kwargs) diff --git a/app/middlewares/cors.py b/app/middlewares/cors.py index 4e87ed7..7df0844 100644 --- a/app/middlewares/cors.py +++ b/app/middlewares/cors.py @@ -1,8 +1,7 @@ -from flask import request -from app.helpers.response_helper import ResponseHelper +from flask import request, jsonify def enforce_json(): """Middleware to enforce JSON Content-Type for incoming requests""" if request.method in ["POST", "PUT", "PATCH"] and request.content_type != "application/json": - return ResponseHelper.error( message="Content-Type must be application/json") + return jsonify({"message": "Invalid request parameters"}), 400 diff --git a/app/middlewares/encryption.py b/app/middlewares/encryption.py deleted file mode 100644 index d41931f..0000000 --- a/app/middlewares/encryption.py +++ /dev/null @@ -1,14 +0,0 @@ -# app/middlewares/encryption.py -# from cryptography.fernet import Fernet -# import os - -# ENCRYPTION_KEY = os.getenv("ENCRYPTION_KEY", Fernet.generate_key()) -# cipher = Fernet(ENCRYPTION_KEY) - -# def encryptdata(data): -# """Encrypt sensitive data""" -# return cipher.encrypt(data.encode()).decode() - -# def decrypt_data(data): -# """Decrypt sensitive data""" -# return cipher.decrypt(data.encode()).decode() diff --git a/app/middlewares/request_validator.py b/app/middlewares/request_validator.py deleted file mode 100644 index a5f2dbc..0000000 --- a/app/middlewares/request_validator.py +++ /dev/null @@ -1,16 +0,0 @@ -from functools import wraps -from flask import request -from app.helpers.response_helper import ResponseHelper -from app.utils.logger import logger - -def validate_json(f): - """Decorator to ensure the request has a valid JSON body.""" - @wraps(f) - def decorated_function(*args, **kwargs): - if not request.is_json: - logger.error("Invalid request: Request must be JSON.") - return ResponseHelper.error(message="Request must be JSON", status_code=415) - - return f(*args, **kwargs) - - return decorated_function diff --git a/app/middlewares/verify_api_key.py b/app/middlewares/verify_api_key.py index 12099e0..81644b1 100644 --- a/app/middlewares/verify_api_key.py +++ b/app/middlewares/verify_api_key.py @@ -1,6 +1,5 @@ from functools import wraps -from flask import request -from app.helpers.response_helper import ResponseHelper +from flask import request, jsonify from app.utils.logger import logger import os @@ -15,11 +14,11 @@ def require_api_key(f): if not api_key: logger.error("Unauthorized access: Missing API key.") - return ResponseHelper.unauthorized("Missing API key") + return jsonify({"message": "Invalid request parameters"}), 400 if api_key != VALID_API_KEY: logger.error("Unauthorized access: Invalid API key.") - return ResponseHelper.unauthorized("Invalid API key") + return jsonify({"message": "Invalid request parameters"}), 400 return f(*args, **kwargs) diff --git a/app/routes/routes.py b/app/routes/routes.py index 6b60be4..4629a00 100644 --- a/app/routes/routes.py +++ b/app/routes/routes.py @@ -1,5 +1,5 @@ from flask import Blueprint, request, jsonify -from app.blueprints import ( +from app.services import ( RACCheckService, DisbursementService, CollectLoanService, diff --git a/app/schemas/disbursement.py b/app/schemas/disbursement.py index b9ffe39..16f7aa1 100644 --- a/app/schemas/disbursement.py +++ b/app/schemas/disbursement.py @@ -2,16 +2,16 @@ from marshmallow import Schema, fields # Disbursement Schema class DisbursementSchema(Schema): - requestId = fields.Str(required=True, data_key="requestId") - debtId = fields.Str(required=True, data_key="debtId") - transactionId = fields.Str(required=True, data_key="transactionId") - customerId = fields.Str(required=True, data_key="customerId") - accountId = fields.Str(required=True, data_key="accountId") - productId = fields.Str(required=True, data_key="productId") - provideAmount = fields.Float(required=True, data_key="provideAmount") - collectAmountInterest = fields.Float(required=False, data_key="collectAmountInterest") # Optional - collectAmountMgtFee = fields.Float(required=True, data_key="collectAmountMgtFee") - collectAmountInsurance = fields.Float(required=True, data_key="collectAmountInsurance") - collectAmountVAT = fields.Float(required=True, data_key="collectAmountVAT") - countryId = fields.Str(required=True, data_key="countryId") - comment = fields.Str(required=False, data_key="comment") # Optional \ No newline at end of file + requestId = fields.Str(required=True) + debtId = fields.Str(required=True) + transactionId = fields.Str(required=True) + customerId = fields.Str(required=True) + accountId = fields.Str(required=True) + productId = fields.Str(required=True) + provideAmount = fields.Float(required=True) + collectAmountInterest = fields.Float(required=False) # Optional + collectAmountMgtFee = fields.Float(required=True) + collectAmountInsurance = fields.Float(required=True) + collectAmountVAT = fields.Float(required=True) + countryId = fields.Str(required=True) + comment = fields.Str(required=False) # Optional \ No newline at end of file diff --git a/app/schemas/lien_check.py b/app/schemas/lien_check.py index 79c509e..7a0912a 100644 --- a/app/schemas/lien_check.py +++ b/app/schemas/lien_check.py @@ -2,7 +2,7 @@ from marshmallow import Schema, fields # Lien Check Schema class LienCheckSchema(Schema): - transactionId = fields.Str(required=True, metadata={"description": "Unique Identifier in Simbrella system"}) - customerId = fields.Str(required=True, metadata={"description": "Unique identifier of customer"}) - accountId = fields.Str(required=True, metadata={"description": "Unique identifier of account"}) - countryId = fields.Str(required=True, metadata={"description": 'Set to static value "01"'}) \ No newline at end of file + transactionId = fields.Str(required=True) + customerId = fields.Str(required=True) + accountId = fields.Str(required=True) + countryId = fields.Str(required=True) \ No newline at end of file diff --git a/app/schemas/penal_charge.py b/app/schemas/penal_charge.py index cb04e4e..40d6d0a 100644 --- a/app/schemas/penal_charge.py +++ b/app/schemas/penal_charge.py @@ -3,12 +3,12 @@ from marshmallow import Schema, fields # Penal Charge Schema class PenalChargeSchema(Schema): - transactionId = fields.Str(required=True, metadata={"description": "Unique identifier of transaction in Simbrella system"}) - fbnTransactionId = fields.Str(required=True, metadata={"description": "Unique id of the transaction received from FBN in Eligibility or Provision requests"}) - debtId = fields.Str(required=True, metadata={"description": "Unique identifier of providing loan in Simbrella system"}) - customerId = fields.Str(required=True, metadata={"description": "Unique identifier of a user"}) - accountId = fields.Str(required=True, metadata={"description": "Specific identifier of a user’s account"}) - penalCharge = fields.Decimal(required=True, metadata={"description": "Penalty amount that needs to be collected from user’s account"}) - lienAmount = fields.Decimal(required=True, metadata={"description": "Aggregated (summed up) lien amount"}) - countryId = fields.Str(required=True, metadata={"description": 'Set to static value "01"'}) - comment = fields.Str(required=False, metadata={"description": "Any additional comment for provided loan operation"}) + transactionId = fields.Str(required=True) + fbnTransactionId = fields.Str(required=True) + debtId = fields.Str(required=True) + customerId = fields.Str(required=True) + accountId = fields.Str(required=True) + penalCharge = fields.Decimal(required=True) + lienAmount = fields.Decimal(required=True) + countryId = fields.Str(required=True) + comment = fields.Str(required=False) diff --git a/app/schemas/revoke_enable_consent.py b/app/schemas/revoke_enable_consent.py index fd617eb..ce1a5f5 100644 --- a/app/schemas/revoke_enable_consent.py +++ b/app/schemas/revoke_enable_consent.py @@ -3,11 +3,11 @@ from marshmallow import Schema, fields # Revoke Enable Consent Schema class RevokeEnableConsentSchema(Schema): - transactionId = fields.Str(required=True, metadata={"description": "Unique identifier of transaction in Simbrella system"}) - fbnTransactionId = fields.Str(required=True, metadata={"description": "Unique id of the transaction received from FBN in CustomerConsentRequest"}) - customerId = fields.Str(required=True, metadata={"description": "Unique identifier of a user"}) - accountId = fields.Str(required=True, metadata={"description": "Specific identifier of a user’s account"}) - processTime = fields.DateTime(required=True, metadata={"description": "Date and time when consent request was processed"}) - consentType = fields.Str(required=True, metadata={"description": '“Enable” or “Revoke”'}) - countryId = fields.Str(required=True, metadata={"description": 'Set to static value "01"'}) - comment = fields.Str(required=False, metadata={"description": "Any additional comment for consent operation"}) + transactionId = fields.Str(required=True) + fbnTransactionId = fields.Str(required=True) + customerId = fields.Str(required=True) + accountId = fields.Str(required=True) + processTime = fields.DateTime(required=True) + consentType = fields.Str(required=True) + countryId = fields.Str(required=True) + comment = fields.Str(required=False) diff --git a/app/schemas/transaction_verify.py b/app/schemas/transaction_verify.py index 021ded4..221e2b6 100644 --- a/app/schemas/transaction_verify.py +++ b/app/schemas/transaction_verify.py @@ -4,7 +4,7 @@ from marshmallow import Schema, fields # Transaction Verify Schema class TransactionVerifySchema(Schema): counter = fields.Str(required=True) - TransactionId = fields.Str(required=True) + transactionId = fields.Str(required=True) requestID = fields.Str(required=True) customerId = fields.Str(required=True) accountId = fields.Str(required=True) diff --git a/app/services/__init__.py b/app/services/__init__.py new file mode 100644 index 0000000..deedc7a --- /dev/null +++ b/app/services/__init__.py @@ -0,0 +1,9 @@ +from app.services.rac_check import RACCheckService +from app.services.disbursement import DisbursementService +from app.services.collect_loan import CollectLoanService +from app.services.transaction_verify import TransactionVerifyService +from app.services.penal_charge import PenalChargeService +from app.services.revoke_enable_consent import RevokeEnableConsentService +from app.services.token_validation import TokenValidationService +from app.services.lien_check import LienCheckService +from app.services.new_transaction_check import NewTransactionCheckService diff --git a/app/blueprints/collect_loan.py b/app/services/collect_loan.py similarity index 85% rename from app/blueprints/collect_loan.py rename to app/services/collect_loan.py index d777a54..cb0d17e 100644 --- a/app/blueprints/collect_loan.py +++ b/app/services/collect_loan.py @@ -1,4 +1,4 @@ -from flask import request +from flask import request, jsonify from marshmallow import ValidationError from app.utils.logger import logger from app.helpers.response_helper import ResponseHelper @@ -44,18 +44,18 @@ class CollectLoanService: # data=response_data, # message="Loan collection completed successfully" # ) + return response_data except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 + except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/customer_consent.py b/app/services/customer_consent.py similarity index 83% rename from app/blueprints/customer_consent.py rename to app/services/customer_consent.py index 17f9858..1164c94 100644 --- a/app/blueprints/customer_consent.py +++ b/app/services/customer_consent.py @@ -40,14 +40,12 @@ class CustomerConsentService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/disbursement.py b/app/services/disbursement.py similarity index 86% rename from app/blueprints/disbursement.py rename to app/services/disbursement.py index f4d9374..4005077 100644 --- a/app/blueprints/disbursement.py +++ b/app/services/disbursement.py @@ -1,4 +1,4 @@ -from flask import request +from flask import request, jsonify from marshmallow import ValidationError from app.utils.logger import logger from app.helpers.response_helper import ResponseHelper @@ -51,14 +51,12 @@ class DisbursementService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/lien_check.py b/app/services/lien_check.py similarity index 82% rename from app/blueprints/lien_check.py rename to app/services/lien_check.py index 358882e..2265adb 100644 --- a/app/blueprints/lien_check.py +++ b/app/services/lien_check.py @@ -39,14 +39,12 @@ class LienCheckService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/new_transaction_check.py b/app/services/new_transaction_check.py similarity index 86% rename from app/blueprints/new_transaction_check.py rename to app/services/new_transaction_check.py index 688d6ed..35382a9 100644 --- a/app/blueprints/new_transaction_check.py +++ b/app/services/new_transaction_check.py @@ -46,14 +46,12 @@ class NewTransactionCheckService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/penal_charge.py b/app/services/penal_charge.py similarity index 83% rename from app/blueprints/penal_charge.py rename to app/services/penal_charge.py index d8db5f8..41aa9de 100644 --- a/app/blueprints/penal_charge.py +++ b/app/services/penal_charge.py @@ -40,14 +40,12 @@ class PenalChargeService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/rac_check.py b/app/services/rac_check.py similarity index 86% rename from app/blueprints/rac_check.py rename to app/services/rac_check.py index 5940569..aa40dab 100644 --- a/app/blueprints/rac_check.py +++ b/app/services/rac_check.py @@ -52,14 +52,12 @@ class RACCheckService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/revoke_enable_consent.py b/app/services/revoke_enable_consent.py similarity index 84% rename from app/blueprints/revoke_enable_consent.py rename to app/services/revoke_enable_consent.py index 9da5b2e..0cf89d7 100644 --- a/app/blueprints/revoke_enable_consent.py +++ b/app/services/revoke_enable_consent.py @@ -43,14 +43,12 @@ class RevokeEnableConsentService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/token_validation.py b/app/services/token_validation.py similarity index 85% rename from app/blueprints/token_validation.py rename to app/services/token_validation.py index 5369928..9147ee5 100644 --- a/app/blueprints/token_validation.py +++ b/app/services/token_validation.py @@ -43,14 +43,12 @@ class TokenValidationService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500 diff --git a/app/blueprints/transaction_verify.py b/app/services/transaction_verify.py similarity index 86% rename from app/blueprints/transaction_verify.py rename to app/services/transaction_verify.py index 3920e02..37c39cb 100644 --- a/app/blueprints/transaction_verify.py +++ b/app/services/transaction_verify.py @@ -46,14 +46,12 @@ class TransactionVerifyService: except ValidationError as err: logger.error(f"Validation Error: {err.messages}") - return ResponseHelper.error( - message="Invalid input data", - status_code=400, - error=err.messages - ) + return jsonify({ + "message": "Validation exception" + }) , 422 except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) - return ResponseHelper.internal_server_error( - error=str(e) - ) + return jsonify({ + "message": "Internal Server Error" + }) , 500