| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- 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
|