Files
ewoooc/routes/market_intel_routes.py

194 lines
6.3 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""市場情報頁面與 API 路由。"""
from datetime import datetime, timedelta, timezone
from flask import Blueprint, jsonify, render_template, request
from auth import login_required
from config import SYSTEM_VERSION
from services.market_intel import MarketIntelService
TAIPEI_TZ = timezone(timedelta(hours=8))
market_intel_bp = Blueprint("market_intel", __name__)
def _service():
return MarketIntelService()
@market_intel_bp.route("/market_intel")
@market_intel_bp.route("/market_intel/campaigns")
@login_required
def campaigns():
service = _service()
status = service.get_runtime_status()
return render_template(
"market_intel/disabled.html",
active_page="market_intel",
datetime_now=datetime.now(TAIPEI_TZ).strftime("%Y-%m-%d %H:%M:%S"),
system_version=SYSTEM_VERSION,
status=status,
adapter_count=len(service.get_adapter_summaries()),
manual_fetch_allowed=service.manual_fetch_allowed(),
current_section="campaigns",
)
@market_intel_bp.route("/market_intel/products")
@market_intel_bp.route("/market_intel/matches")
@market_intel_bp.route("/market_intel/opportunities")
@login_required
def disabled_section():
service = _service()
status = service.get_runtime_status()
return render_template(
"market_intel/disabled.html",
active_page="market_intel",
datetime_now=datetime.now(TAIPEI_TZ).strftime("%Y-%m-%d %H:%M:%S"),
system_version=SYSTEM_VERSION,
status=status,
adapter_count=len(service.get_adapter_summaries()),
manual_fetch_allowed=service.manual_fetch_allowed(),
current_section="disabled",
)
@market_intel_bp.route("/api/market_intel/status")
@login_required
def market_intel_status():
return jsonify(_service().get_runtime_status().to_dict())
@market_intel_bp.route("/api/market_intel/schema")
@login_required
def market_intel_schema():
return jsonify({"tables": _service().get_schema_tables()})
@market_intel_bp.route("/api/market_intel/schema_smoke")
@login_required
def market_intel_schema_smoke():
return jsonify(_service().build_schema_smoke())
@market_intel_bp.route("/api/market_intel/schema_db_probe")
@login_required
def market_intel_schema_db_probe():
execute_requested = request.args.get("execute", "false").lower() == "true"
return jsonify(_service().build_schema_db_probe(execute_requested=execute_requested))
@market_intel_bp.route("/api/market_intel/platform_seed_db_diff")
@login_required
def market_intel_platform_seed_db_diff():
platform_code = request.args.get("platform", "all")
execute_requested = request.args.get("execute", "false").lower() == "true"
return jsonify(
_service().build_platform_seed_db_diff(
platform_code=platform_code,
execute_requested=execute_requested,
)
)
@market_intel_bp.route("/api/market_intel/adapters")
@login_required
def market_intel_adapters():
return jsonify({"adapters": _service().get_adapter_summaries()})
@market_intel_bp.route("/api/market_intel/dry_run_plan")
@login_required
def market_intel_dry_run_plan():
platform_code = request.args.get("platform", "all")
return jsonify(_service().build_dry_run_plan(platform_code=platform_code))
@market_intel_bp.route("/api/market_intel/discovery_plan")
@login_required
def market_intel_discovery_plan():
platform_code = request.args.get("platform", "all")
return jsonify(_service().build_discovery_plan(platform_code=platform_code))
@market_intel_bp.route("/api/market_intel/manual_discovery")
@login_required
def market_intel_manual_discovery():
platform_code = request.args.get("platform", "all")
fetch = request.args.get("fetch", "false").lower() == "true"
return jsonify(_service().run_manual_discovery(platform_code=platform_code, fetch=fetch))
@market_intel_bp.route("/api/market_intel/candidate_preview")
@login_required
def market_intel_candidate_preview():
platform_code = request.args.get("platform", "all")
fetch = request.args.get("fetch", "false").lower() == "true"
min_band = request.args.get("min_band", "all")
limit = request.args.get("limit", default=50, type=int)
limit = max(1, min(limit or 50, 200))
return jsonify(
_service().build_candidate_preview(
platform_code=platform_code,
fetch=fetch,
min_band=min_band,
limit=limit,
)
)
@market_intel_bp.route("/api/market_intel/platform_seed_plan")
@login_required
def market_intel_platform_seed_plan():
platform_code = request.args.get("platform", "all")
return jsonify(_service().build_platform_seed_plan(platform_code=platform_code))
@market_intel_bp.route("/api/market_intel/platform_seed_write_guard")
@login_required
def market_intel_platform_seed_write_guard():
platform_code = request.args.get("platform", "all")
return jsonify(_service().build_platform_seed_write_guard(platform_code=platform_code))
@market_intel_bp.route("/api/market_intel/platform_seed_writer_plan")
@login_required
def market_intel_platform_seed_writer_plan():
platform_code = request.args.get("platform", "all")
return jsonify(_service().build_platform_seed_writer_plan(platform_code=platform_code))
@market_intel_bp.route("/api/market_intel/migration_blueprint")
@login_required
def market_intel_migration_blueprint():
return jsonify(_service().build_migration_blueprint())
@market_intel_bp.route("/api/market_intel/seed_writer_cli_status")
@login_required
def market_intel_seed_writer_cli_status():
platform_code = request.args.get("platform", "all")
execute_requested = request.args.get("execute", "false").lower() == "true"
return jsonify(
_service().build_seed_writer_cli_status(
platform_code=platform_code,
execute_requested=execute_requested,
)
)
@market_intel_bp.route("/api/market_intel/write_approval_runbook")
@login_required
def market_intel_write_approval_runbook():
platform_code = request.args.get("platform", "all")
return jsonify(_service().build_write_approval_runbook(platform_code=platform_code))
@market_intel_bp.route("/api/market_intel/deployment_readiness")
@login_required
def market_intel_deployment_readiness():
return jsonify(_service().build_deployment_readiness())