from flask import Blueprint, request, jsonify from utils.auth import hash_password, check_password, generate_token, verify_token import pymongo from bson import ObjectId # Define a Blueprint for authentication routes auth_bp = Blueprint('auth', __name__, url_prefix='/auth') # MongoDB connection client = pymongo.MongoClient("mongodb+srv://pmsankheb23:KnjSAJM9oB1OMtud@eloquence.yal88.mongodb.net/") db = client["Eloquence"] collections_user = db["user"] # ROUTE 1: Create a user using POST: auth/create, no auth required @auth_bp.route('/create', methods=['POST']) def create_user(): try: data = request.get_json() username = data['username'] email = data['email'] password = data['password'] # Check if user already exists if collections_user.find_one({'email': email}): return jsonify({"error": "User with this email already exists"}), 400 # Hash the password hashed_password = hash_password(password) # Insert the new user result = collections_user.insert_one({'username': username, 'password': hashed_password, 'email': email}) user_id = str(result.inserted_id) # Generate JWT token token = generate_token(username) # Or email, depending on your token strategy return jsonify({ "message": "User created", "authToken": token, "userId": user_id, "username": username }), 201 except Exception as e: return jsonify({"error": str(e)}), 500 # ROUTE 2: Authenticate a user using POST: auth/login, no login required @auth_bp.route('/login', methods=['POST']) def login_user(): try: data = request.get_json() email = data['email'] password = data['password'] user = collections_user.find_one({'email': email}) if not user: return jsonify({"error": "User not found"}), 404 if not check_password(user['password'], password): return jsonify({"error": "Invalid password"}), 401 user_id = str(user['_id']) username = user['username'] # Generate JWT token token = generate_token(username) # Or email, consistent with your token strategy return jsonify({ "message": "Login successful", "token": token, "userId": user_id, "username": username }), 200 except Exception as e: return jsonify({"error": str(e)}), 500 # ROUTE 3: Get logged-in user details using POST: auth/protected, login required @auth_bp.route('/protected', methods=['POST']) def protected(): # Get token from the body as it's a post method token = request.json.get("token", None) if not token: return jsonify({"error": "Token missing"}), 401 # Remove 'Bearer ' from the token string if it's present token = token.replace("Bearer ", "") username = verify_token(token) # Verify the token if not username: return jsonify({"error": "Invalid or expired token"}), 401 return jsonify({"message": f"Hello, {username}! This is a protected route."})