refactor(app.py): 抽出 /api/categories CRUD 至 category_routes Blueprint
All checks were successful
CD Pipeline / deploy (push) Successful in 1m9s

- 新增 routes/category_routes.py(46 行,3 routes:POST/PUT/DELETE)
- app.py 7053 → 7012(-41 行)
- 沿用 services.json_storage.load_categories/save_categories
- 註冊位置貼齊 system_bp 後方

Phase 3e route handlers Blueprint 化首棒,邊界最小、無共用狀態
This commit is contained in:
OoO
2026-04-28 21:04:40 +08:00
parent 333fc159ae
commit 8fce73bd4b
2 changed files with 51 additions and 45 deletions

49
app.py
View File

@@ -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/<int:category_id>', 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/<int:category_id>', 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: 測試網址是否有效"""

47
routes/category_routes.py Normal file
View File

@@ -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('/<int:category_id>', 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('/<int:category_id>', 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": "分類刪除成功"})