194 lines
6.3 KiB
Python
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())
|