|
| 1 | +from flask import Blueprint, request, jsonify |
| 2 | +from app import db |
| 3 | +from models import User |
| 4 | +from utils.validators import validate_email |
| 5 | + |
| 6 | +auth_bp = Blueprint('auth', __name__) |
| 7 | + |
| 8 | +# Error responses |
| 9 | +INVALID_CREDENTIALS = {"error": "Invalid email or password"}, 401 |
| 10 | +MISSING_FIELDS = {"error": "Missing required fields"}, 400 |
| 11 | +INVALID_EMAIL = {"error": "Invalid email format"}, 400 |
| 12 | +EMAIL_EXISTS = {"error": "Email already registered"}, 409 |
| 13 | + |
| 14 | +@auth_bp.route('/register', methods=['POST']) |
| 15 | +def register(): |
| 16 | + data = request.get_json() |
| 17 | + |
| 18 | + # Validate required fields |
| 19 | + if not all(k in data for k in ['email', 'password']): |
| 20 | + return jsonify(MISSING_FIELDS) |
| 21 | + |
| 22 | + # Validate email format |
| 23 | + if not validate_email(data['email']): |
| 24 | + return jsonify(INVALID_EMAIL) |
| 25 | + |
| 26 | + # Check if user already exists |
| 27 | + if User.query.filter_by(email=data['email']).first(): |
| 28 | + return jsonify(EMAIL_EXISTS) |
| 29 | + |
| 30 | + # Create new user |
| 31 | + try: |
| 32 | + user = User(email=data['email']) |
| 33 | + user.password = data['password'] # This will hash the password |
| 34 | + db.session.add(user) |
| 35 | + db.session.commit() |
| 36 | + |
| 37 | + # Generate auth token |
| 38 | + token = user.generate_auth_token() |
| 39 | + return jsonify({ |
| 40 | + 'message': 'User registered successfully', |
| 41 | + 'token': token |
| 42 | + }), 201 |
| 43 | + except Exception as e: |
| 44 | + db.session.rollback() |
| 45 | + return jsonify({'error': 'Registration failed'}), 500 |
| 46 | + |
| 47 | +@auth_bp.route('/login', methods=['POST']) |
| 48 | +def login(): |
| 49 | + data = request.get_json() |
| 50 | + |
| 51 | + # Validate required fields |
| 52 | + if not all(k in data for k in ['email', 'password']): |
| 53 | + return jsonify(MISSING_FIELDS) |
| 54 | + |
| 55 | + # Find user by email |
| 56 | + user = User.query.filter_by(email=data['email']).first() |
| 57 | + |
| 58 | + # Verify user exists and password is correct |
| 59 | + if user and user.verify_password(data['password']): |
| 60 | + token = user.generate_auth_token() |
| 61 | + return jsonify({ |
| 62 | + 'message': 'Login successful', |
| 63 | + 'token': token, |
| 64 | + 'user': { |
| 65 | + 'id': user.id, |
| 66 | + 'email': user.email |
| 67 | + } |
| 68 | + }), 200 |
| 69 | + |
| 70 | + return jsonify(INVALID_CREDENTIALS) |
0 commit comments