从本地目录导入 token 文件。
(request: Request)
| 704 | |
| 705 | @router.post("/tokens/import-directory", dependencies=[Depends(require_auth)]) |
| 706 | async def import_tokens_from_directory_api(request: Request): |
| 707 | """从本地目录导入 token 文件。""" |
| 708 | from app.core.config import settings |
| 709 | from app.services.token_automation import run_directory_import |
| 710 | |
| 711 | form_data = await request.form() |
| 712 | source_dir = str( |
| 713 | form_data.get("source_dir") |
| 714 | or settings.TOKEN_AUTO_IMPORT_SOURCE_DIR |
| 715 | or "" |
| 716 | ).strip() |
| 717 | try: |
| 718 | source_dir = _validate_directory_path(source_dir) |
| 719 | except ValueError as exc: |
| 720 | return _build_alert( |
| 721 | str(exc), |
| 722 | title="导入失败!", |
| 723 | level="error", |
| 724 | status_code=400, |
| 725 | ) |
| 726 | |
| 727 | try: |
| 728 | summary = await run_directory_import( |
| 729 | source_dir, |
| 730 | provider=DEFAULT_TOKEN_NAMESPACE, |
| 731 | validate=True, |
| 732 | ) |
| 733 | except (FileNotFoundError, NotADirectoryError) as exc: |
| 734 | return _build_alert( |
| 735 | str(exc), |
| 736 | title="导入失败!", |
| 737 | level="error", |
| 738 | status_code=400, |
| 739 | ) |
| 740 | except RuntimeError as exc: |
| 741 | return _build_alert( |
| 742 | str(exc), |
| 743 | title="导入稍后重试", |
| 744 | level="warning", |
| 745 | status_code=409, |
| 746 | ) |
| 747 | except Exception as exc: |
| 748 | logger.exception(f"❌ 本地目录导入 Token 失败: {exc}") |
| 749 | return _build_alert( |
| 750 | f"目录扫描或入库异常: {exc}", |
| 751 | title="导入失败!", |
| 752 | level="error", |
| 753 | status_code=500, |
| 754 | ) |
| 755 | |
| 756 | if summary.imported_count > 0: |
| 757 | title = "导入成功!" if summary.failed_count == 0 else "导入完成!" |
| 758 | detail = ( |
| 759 | f"目录 {summary.source_dir} 共扫描 {summary.scanned_files} 个文件," |
| 760 | f"成功导入 {summary.imported_count} 个 Token," |
| 761 | f"重复 {summary.duplicate_count} 个," |
| 762 | f"无效 JSON {summary.invalid_json_count} 个," |
| 763 | f"缺少 token {summary.missing_token_count} 个," |
nothing calls this directly
no test coverage detected