from quart import Blueprint, jsonify, request from fabledassistant.auth import login_required, get_current_user_id from fabledassistant.config import Config from fabledassistant.services.caldav import CALDAV_SETTING_KEYS, get_caldav_config, test_connection from fabledassistant.services.llm import get_installed_models from fabledassistant.services.settings import get_all_settings, set_settings_batch settings_bp = Blueprint("settings", __name__, url_prefix="/api/settings") @settings_bp.route("", methods=["GET"]) @login_required async def get_settings_route(): uid = get_current_user_id() settings = await get_all_settings(uid) return jsonify(settings) @settings_bp.route("", methods=["PUT"]) @login_required async def update_settings_route(): uid = get_current_user_id() data = await request.get_json() if not isinstance(data, dict): return jsonify({"error": "Expected a JSON object"}), 400 if "default_model" in data or "intent_model" in data: installed = await get_installed_models() for key in ("default_model", "intent_model"): if key in data and data[key]: model = str(data[key]) if installed and model not in installed: return jsonify({"error": f"Model '{model}' is not installed"}), 400 await set_settings_batch(uid, {k: str(v) for k, v in data.items()}) settings = await get_all_settings(uid) return jsonify(settings) @settings_bp.route("/models", methods=["GET"]) @login_required async def get_models_route(): """Return installed Ollama models and the configured defaults.""" models = sorted(await get_installed_models()) return jsonify({ "models": models, "default_chat_model": Config.OLLAMA_MODEL, "default_intent_model": Config.OLLAMA_INTENT_MODEL, }) @settings_bp.route("/caldav", methods=["GET"]) @login_required async def get_caldav(): uid = get_current_user_id() config = await get_caldav_config(uid) if config.get("caldav_password"): config["caldav_password"] = "********" return jsonify(config) @settings_bp.route("/caldav", methods=["PUT"]) @login_required async def update_caldav(): uid = get_current_user_id() data = await request.get_json() settings_to_save = {} for key in CALDAV_SETTING_KEYS: if key in data: if key == "caldav_password" and data[key] == "********": continue settings_to_save[key] = str(data[key]) if settings_to_save: await set_settings_batch(uid, settings_to_save) return jsonify({"status": "ok"}) @settings_bp.route("/caldav/test", methods=["POST"]) @login_required async def test_caldav(): uid = get_current_user_id() result = await test_connection(uid) return jsonify(result)