refactor(app.py): 抽出 /api/categories CRUD 至 category_routes Blueprint
All checks were successful
CD Pipeline / deploy (push) Successful in 1m9s
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:
49
app.py
49
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/<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
47
routes/category_routes.py
Normal 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": "分類刪除成功"})
|
||||
Reference in New Issue
Block a user