Spaces:
Runtime error
Runtime error
| from flask import Blueprint, request, jsonify | |
| from models.user import User | |
| from utils.jwt_helper import generate_jwt | |
| import re | |
| auth_bp = Blueprint('auth', __name__) | |
| def validate_email(email): | |
| pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' | |
| return re.match(pattern, email) is not None | |
| def validate_password(password): | |
| return len(password) >= 6 | |
| def signup(): | |
| try: | |
| data = request.get_json() | |
| if not data: | |
| return jsonify({"error": "No data provided"}), 400 | |
| username = data.get('username', '').strip() | |
| email = data.get('email', '').strip().lower() | |
| password = data.get('password', '') | |
| preferences = data.get('preferences', {"genres": [], "types": []}) | |
| # Validation | |
| if not username or not email or not password: | |
| return jsonify({"error": "Username, email, and password are required"}), 400 | |
| if len(username) < 3: | |
| return jsonify({"error": "Username must be at least 3 characters long"}), 400 | |
| if not validate_email(email): | |
| return jsonify({"error": "Invalid email format"}), 400 | |
| if not validate_password(password): | |
| return jsonify({"error": "Password must be at least 6 characters long"}), 400 | |
| # Check if user already exists | |
| if User.find_by_email(email): | |
| return jsonify({"error": "Email already registered"}), 409 | |
| if User.find_by_username(username): | |
| return jsonify({"error": "Username already taken"}), 409 | |
| # Create new user | |
| user = User(username=username, email=email, password=password, preferences=preferences) | |
| user_id = user.save() | |
| # Generate JWT token | |
| token = generate_jwt(user_id, username, email) | |
| return jsonify({ | |
| "message": "User created successfully", | |
| "token": token, | |
| "user": { | |
| "id": user_id, | |
| "username": username, | |
| "email": email, | |
| "preferences": preferences | |
| } | |
| }), 201 | |
| except Exception as e: | |
| print(f"Signup error: {e}") | |
| return jsonify({"error": "Internal server error"}), 500 | |
| def login(): | |
| try: | |
| data = request.get_json() | |
| if not data: | |
| return jsonify({"error": "No data provided"}), 400 | |
| email = data.get('email', '').strip().lower() | |
| password = data.get('password', '') | |
| if not email or not password: | |
| return jsonify({"error": "Email and password are required"}), 400 | |
| # Find user by email | |
| user = User.find_by_email(email) | |
| if not user or not user.check_password(password): | |
| return jsonify({"error": "Invalid email or password"}), 401 | |
| # Update last login | |
| user.update_last_login() | |
| # Generate JWT token | |
| token = generate_jwt(user._id, user.username, user.email) | |
| return jsonify({ | |
| "message": "Login successful", | |
| "token": token, | |
| "user": { | |
| "id": str(user._id), | |
| "username": user.username, | |
| "email": user.email, | |
| "preferences": user.preferences, | |
| "last_login": user.last_login.isoformat() if user.last_login else None | |
| } | |
| }), 200 | |
| except Exception as e: | |
| print(f"Login error: {e}") | |
| return jsonify({"error": "Internal server error"}), 500 | |