from flask import Blueprint, request, jsonify from app.api.services.loan import LoanService from app.api.services.transaction import TransactionService from app.api.services.auth_service import AuthService from app.api.services.dashboard_service import DashboardService from functools import wraps api = Blueprint('api', __name__) # JWT Authentication decorator def token_required(f): @wraps(f) def decorated(*args, **kwargs): token = None # Get token from header auth_header = request.headers.get('Authorization') if auth_header: if auth_header.startswith('Bearer '): token = auth_header.split(' ')[1] if not token: return jsonify({'message': 'Token is missing!'}), 401 # Verify token payload = AuthService.verify_token(token) if not payload: return jsonify({'message': 'Token is invalid or expired!'}), 401 # Add user info to request request.user = payload return f(*args, **kwargs) return decorated @api.route('/login', methods=['POST']) def login(): data = request.get_json() # Check if username and password are provided if not data or 'username' not in data or 'password' not in data: return jsonify({ 'error': 'Missing credentials', 'message': 'Username and password are required' }), 400 username = data.get('username', '') password = data.get('password', '') # Call the login method from AuthService result = AuthService.login(username, password) # Check if result is a tuple (error response) if isinstance(result, tuple): return jsonify(result[0]), result[1] return jsonify(result) @api.route('/dashboard', methods=['GET']) @token_required def get_dashboard(): # Call the dashboard service result = DashboardService.get_dashboard_data() return jsonify(result) @api.route('/loans', methods=['GET']) @token_required def get_loans(): # Extract query parameters customer_id = request.args.get('customer_id') loan_id = request.args.get('loan_id') status = request.args.get('status') offer_id = request.args.get('offer_id') product_id = request.args.get('product_id') start_date = request.args.get('start_date') end_date = request.args.get('end_date') # Call the loan service result = LoanService.process_request( customer_id=customer_id, loan_id=loan_id, status=status, offer_id=offer_id, product_id=product_id, start_date=start_date, end_date=end_date ) return jsonify(result) @api.route('/transactions', methods=['GET']) @token_required def get_transactions(): # Extract query parameters account_id = request.args.get('account_id') transaction_id = request.args.get('transaction_id') type = request.args.get('type') channel = request.args.get('channel') start_date = request.args.get('start_date') end_date = request.args.get('end_date') # Call the transaction service result = TransactionService.process_request( account_id=account_id, transaction_id=transaction_id, type=type, channel=channel, start_date=start_date, end_date=end_date ) return jsonify(result)