from flask import request, jsonify, url_for, redirect, current_app from flask_login import login_user, logout_user, login_required, current_user from app import db, oauth from app.models import User from . import auth @auth.route('/register', methods=['POST']) def register(): data = request.get_json() if User.query.filter_by(email=data['email']).first(): return jsonify({'error': 'Email already registered'}), 400 if User.query.filter_by(username=data['username']).first(): return jsonify({'error': 'Username already taken'}), 400 if len(data.get('password', '')) < 9: return jsonify({'error': 'Password must be at least 9 characters long'}), 400 user = User(username=data['username'], email=data['email']) user.set_password(data['password']) db.session.add(user) db.session.commit() return jsonify({'message': 'User registered successfully'}), 201 @auth.route('/login', methods=['POST']) def login(): data = request.get_json() user = User.query.filter_by(email=data['email']).first() if user is None or not user.check_password(data['password']): return jsonify({'error': 'Invalid email or password'}), 401 login_user(user) return jsonify({'message': 'Logged in successfully', 'user': {'username': user.username, 'email': user.email, 'is_admin': user.is_admin}}) @auth.route('/logout', methods=['POST']) @login_required def logout(): logout_user() return jsonify({'message': 'Logged out successfully'}) @auth.route('/me', methods=['GET']) @login_required def get_current_user(): return jsonify({ 'id': current_user.id, 'username': current_user.username, 'email': current_user.email, 'is_admin': current_user.is_admin, 'profile_pic_url': current_user.profile_pic_url, 'is_probation': current_user.is_probation }) # Google OAuth @auth.route('/google') def google_login(): google = oauth.register( name='google', client_id=current_app.config.get('GOOGLE_CLIENT_ID'), client_secret=current_app.config.get('GOOGLE_CLIENT_SECRET'), access_token_url='https://accounts.google.com/o/oauth2/token', access_token_params=None, authorize_url='https://accounts.google.com/o/oauth2/auth', authorize_params=None, api_base_url='https://www.googleapis.com/oauth2/v1/', client_kwargs={'scope': 'openid email profile'}, ) redirect_uri = url_for('auth.google_authorize', _external=True) return google.authorize_redirect(redirect_uri) @auth.route('/google/authorize') def google_authorize(): google = oauth.create_client('google') token = google.authorize_access_token() resp = google.get('userinfo') user_info = resp.json() user = User.query.filter_by(email=user_info['email']).first() if not user: # Create new user # Note: Username might need to be handled if it conflicts or just use email prefix base_username = user_info['email'].split('@')[0] username = base_username counter = 1 while User.query.filter_by(username=username).first(): username = f"{base_username}{counter}" counter += 1 user = User( email=user_info['email'], username=username, google_id=user_info['id'], profile_pic_url=user_info.get('picture') ) db.session.add(user) db.session.commit() login_user(user) # Redirect to frontend return redirect('http://localhost:3000/') # Should be configurable