diff --git a/app.py b/app.py index 1788d41..fb19488 100644 --- a/app.py +++ b/app.py @@ -317,6 +317,10 @@ app.register_blueprint(system_bp) csrf.exempt(system_bp) # n8n API 需要豁免 CSRF sys_log.info("[Blueprint] ✅ 系統管理 Blueprint 已註冊 (CSRF 已豁免)") +from routes.category_routes import category_bp +app.register_blueprint(category_bp) +sys_log.info("[Blueprint] ✅ 分類 CRUD Blueprint 已註冊") + # ========================================== # 通知模板管理 Blueprint # ========================================== @@ -1018,51 +1022,6 @@ def system_settings_page(): """系統設定與匯入頁面""" return render_template('system_settings.html', system_version=SYSTEM_VERSION) -@app.route('/api/categories', methods=['POST']) -def add_category(): - """API: 新增分類""" - name = request.form.get('name') - url = request.form.get('url') - if not name or not url: - return jsonify({"status": "error", "message": "名稱和 URL 皆不可為空"}), 400 - - categories = load_categories() - new_id = int(time.time() * 1000) # 使用時間戳作為簡易唯一 ID - categories.append({'id': new_id, 'name': name, 'url': url}) - save_categories(categories) - - return jsonify({"status": "success", "message": "分類新增成功"}) - -@app.route('/api/categories/', methods=['PUT']) -def update_category(category_id): - """API: 更新分類""" - name = request.form.get('name') - url = request.form.get('url') - if not name or not url: - return jsonify({"status": "error", "message": "名稱和 URL 皆不可為空"}), 400 - - categories = load_categories() - category_found = False - for cat in categories: - if cat.get('id') == category_id: - cat['name'] = name - cat['url'] = url - category_found = True - break - - if not category_found: - return jsonify({"status": "error", "message": "找不到指定的分類 ID"}), 404 - - save_categories(categories) - return jsonify({"status": "success", "message": "分類更新成功"}) - -@app.route('/api/categories/', methods=['DELETE']) -def delete_category(category_id): - """API: 刪除分類""" - categories = [cat for cat in load_categories() if cat.get('id') != category_id] - save_categories(categories) - return jsonify({"status": "success", "message": "分類刪除成功"}) - @app.route('/api/test_url', methods=['POST']) def test_url(): """API: 測試網址是否有效""" diff --git a/routes/category_routes.py b/routes/category_routes.py new file mode 100644 index 0000000..0db8a93 --- /dev/null +++ b/routes/category_routes.py @@ -0,0 +1,47 @@ +"""分類 CRUD Blueprint。從 app.py 抽離(Phase 3e)。""" +import time + +from flask import Blueprint, jsonify, request + +from services.json_storage import load_categories, save_categories + +category_bp = Blueprint('category', __name__, url_prefix='/api/categories') + + +@category_bp.route('', methods=['POST']) +def add_category(): + name = request.form.get('name') + url = request.form.get('url') + if not name or not url: + return jsonify({"status": "error", "message": "名稱和 URL 皆不可為空"}), 400 + + categories = load_categories() + new_id = int(time.time() * 1000) + categories.append({'id': new_id, 'name': name, 'url': url}) + save_categories(categories) + return jsonify({"status": "success", "message": "分類新增成功"}) + + +@category_bp.route('/', methods=['PUT']) +def update_category(category_id): + name = request.form.get('name') + url = request.form.get('url') + if not name or not url: + return jsonify({"status": "error", "message": "名稱和 URL 皆不可為空"}), 400 + + categories = load_categories() + for cat in categories: + if cat.get('id') == category_id: + cat['name'] = name + cat['url'] = url + save_categories(categories) + return jsonify({"status": "success", "message": "分類更新成功"}) + + return jsonify({"status": "error", "message": "找不到指定的分類 ID"}), 404 + + +@category_bp.route('/', methods=['DELETE']) +def delete_category(category_id): + categories = [cat for cat in load_categories() if cat.get('id') != category_id] + save_categories(categories) + return jsonify({"status": "success", "message": "分類刪除成功"})