from quart import Blueprint, jsonify, request, session from fabledassistant.auth import login_required, get_current_user_id from fabledassistant.services.auth import ( authenticate, create_user, get_user_by_id, get_user_count, ) auth_bp = Blueprint("auth", __name__, url_prefix="/api/auth") @auth_bp.route("/register", methods=["POST"]) async def register(): data = await request.get_json() username = (data.get("username") or "").strip() password = data.get("password") or "" email = (data.get("email") or "").strip() or None if not username: return jsonify({"error": "Username is required"}), 400 if len(password) < 8: return jsonify({"error": "Password must be at least 8 characters"}), 400 try: user = await create_user(username, password, email) except Exception: return jsonify({"error": "Username already taken"}), 409 session["user_id"] = user.id return jsonify(user.to_dict()), 201 @auth_bp.route("/login", methods=["POST"]) async def login(): data = await request.get_json() username = (data.get("username") or "").strip() password = data.get("password") or "" if not username or not password: return jsonify({"error": "Username and password are required"}), 400 user = await authenticate(username, password) if not user: return jsonify({"error": "Invalid username or password"}), 401 session["user_id"] = user.id return jsonify(user.to_dict()) @auth_bp.route("/logout", methods=["POST"]) async def logout(): session.clear() return jsonify({"status": "ok"}) @auth_bp.route("/me", methods=["GET"]) @login_required async def me(): user = await get_user_by_id(get_current_user_id()) if not user: return jsonify({"error": "User not found"}), 404 return jsonify(user.to_dict()) @auth_bp.route("/status", methods=["GET"]) async def status(): count = await get_user_count() return jsonify({"has_users": count > 0})