from flask import Blueprint, render_template, redirect, url_for, flash, request from flask_login import login_user, logout_user, login_required, current_user from app import db from app.models.user import User auth_bp = Blueprint('auth', __name__, url_prefix='/auth') @auth_bp.route('/register', methods=['GET', 'POST']) def register(): """User registration.""" if current_user.is_authenticated: return redirect(url_for('main.index')) if request.method == 'POST': username = request.form.get('username') email = request.form.get('email') password = request.form.get('password') confirm_password = request.form.get('confirm_password') # Validation if not all([username, email, password, confirm_password]): flash('All fields are required.', 'danger') return render_template('auth/register.html') if password != confirm_password: flash('Passwords do not match.', 'danger') return render_template('auth/register.html') if len(password) < 6: flash('Password must be at least 6 characters long.', 'danger') return render_template('auth/register.html') # Check if user already exists if User.query.filter_by(username=username).first(): flash('Username already exists.', 'danger') return render_template('auth/register.html') if User.query.filter_by(email=email).first(): flash('Email already registered.', 'danger') return render_template('auth/register.html') # Create new user user = User(username=username, email=email) user.set_password(password) db.session.add(user) db.session.commit() flash('Registration successful! Please log in.', 'success') return redirect(url_for('auth.login')) return render_template('auth/register.html') @auth_bp.route('/login', methods=['GET', 'POST']) def login(): """User login.""" if current_user.is_authenticated: return redirect(url_for('main.index')) if request.method == 'POST': username = request.form.get('username') password = request.form.get('password') remember = request.form.get('remember', False) if not username or not password: flash('Please provide both username and password.', 'danger') return render_template('auth/login.html') user = User.query.filter_by(username=username).first() if user and user.check_password(password): login_user(user, remember=bool(remember)) next_page = request.args.get('next') flash(f'Welcome back, {user.username}!', 'success') return redirect(next_page) if next_page else redirect(url_for('main.index')) else: flash('Invalid username or password.', 'danger') return render_template('auth/login.html') @auth_bp.route('/logout') @login_required def logout(): """User logout.""" logout_user() flash('You have been logged out.', 'info') return redirect(url_for('auth.login')) @auth_bp.route('/profile') @login_required def profile(): """User profile page.""" set_count = current_user.sets.count() instruction_count = current_user.instructions.count() return render_template('auth/profile.html', set_count=set_count, instruction_count=instruction_count)