from flask import request, jsonify from models import get_user_by_email, bcrypt import logging from flask_jwt_extended import create_access_token from datetime import timedelta import os import traceback logging.basicConfig( filename=os.path.join('/tmp', 'app.log'), level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s' ) def login_route(): try: if request.method == 'POST': if request.is_json: data = request.get_json() email = data.get('email') password = data.get('password') else: email = request.form.get('email') password = request.form.get('password') logging.info("Attempted login with Email: %s", email) if not email or not password: logging.warning("Missing email or password for login attempt.") return jsonify({'message': 'Please enter both email and password.', 'status': 'danger'}), 400 try: user = get_user_by_email(email) logging.info("User found: %s", user) if not user: logging.warning("No account found with this email: %s", email) return jsonify({'message': 'No account found with this email', 'status': 'danger'}), 400 if not bcrypt.check_password_hash(user['password'], password): logging.warning("Incorrect password attempt for email: %s", email) return jsonify({'message': 'Incorrect password. Please try again.', 'status': 'danger'}), 400 except Exception as db_error: logging.error("Error retrieving user from database: %s", traceback.format_exc()) return jsonify({'message': 'Internal server error while processing login.', 'status': 'danger'}), 500 try: expires = timedelta(minutes=600) access_token = create_access_token(identity=user['id'],expires_delta=expires) except Exception as token_error: logging.error("Error creating access token: %s", traceback.format_exc()) return jsonify({'message': 'Internal server error while generating token.', 'status': 'danger'}), 500 logging.info("Login successful for user: %s", user['username']) return jsonify({'token': access_token, 'message': f'Welcome, {user["username"]}!', 'status': 'success'}), 200 logging.error("Method not allowed: %s", request.method) return jsonify({'message': 'Method not allowed', 'status': 'danger'}), 405 except Exception as e: logging.error("Unexpected error in login: %s", traceback.format_exc()) return jsonify({'message': 'Internal server error', 'status': 'danger'}), 500