# Module Documentation: api.py

## 1. 概述 (Overview)

`api.py` 文件实现了一个基于 FastAPI 的 Web 应用，其核心目的是提供一套 API 接口来管理 Cursor IDE 的账号。此应用不仅支持账号的增删改查、导入导出等基本管理功能，还集成了一个自动化的后台任务来注册新账号，直到达到预设的上限。此外，它还能跟踪账号的使用情况、管理系统配置，并提供与本地 Cursor 客户端集成的功能，如更新认证 Token 和重置机器ID。

主要技术栈包括：
*   **FastAPI**: 用于构建高性能 API。
*   **SQLAlchemy**: 作为 ORM 与数据库进行异步交互。
*   **Pydantic**: 用于数据校验和 API 的请求/响应模型定义。
*   **Uvicorn**: 作为 ASGI 服务器运行应用。
*   **Asyncio**: 支持异步操作和并发任务，特别是后台注册进程。

## 2. 核心功能 (Core Features)

### 2.1. 账号管理 (Account Management)
该模块提供了全面的账号管理功能：
-   **创建账号**: 通过 `POST /account` 端点，可以添加新的 Cursor 账号信息到数据库。
-   **读取账号**:
    -   `GET /accounts`: 获取所有账号列表，支持分页、按邮件模糊搜索以及按字段（如创建时间、ID、邮箱）升序或降序排序。
    -   `GET /account/random`: 随机获取一个当前可用的账号及其 Token。
    -   `GET /account/{email}/usage`: 查询指定邮箱账号的详细使用情况（如剩余额度、天数）并更新数据库记录。
-   **更新账号状态**: 通过 `PUT /account/id/{id}/status` 端点，可以修改指定 ID 账号的状态（如 active, disabled, deleted）。
-   **删除账号**:
    -   `DELETE /account/{email}`: 根据邮箱停用（逻辑删除）或永久删除（物理删除，需 `hard_delete=True`）账号。
    -   `DELETE /account/id/{id}`: 根据账号 ID 停用或永久删除账号。
-   **导入/导出账号**:
    -   `POST /accounts/import`: 从上传的 JSON 文件批量导入或更新账号信息。
    -   `GET /accounts/export`: 将所有账号信息导出为 JSON 文件。

### 2.2. 自动注册 (Automated Registration)
应用包含一个后台服务，用于自动注册新的 Cursor 账号：
-   **后台任务**: `run_registration` 异步函数是注册逻辑的核心，它会循环尝试注册新账号。
-   **启动与停止**:
    -   `GET /registration/start`: 手动启动后台注册任务。如果任务已运行或账号已满，会返回相应状态。
    -   `GET /registration/stop`: 手动停止当前运行的注册任务。
-   **状态查询**: `GET /registration/status` 提供注册任务的当前状态，包括是否正在运行、上次运行时间、下次运行时间、成功/失败次数统计以及当前账号数量与最大限制。
-   **监控模式**: 当数据库中激活的账号数量达到 `MAX_ACCOUNTS` 设定的上限时，注册任务会暂停实际注册操作，进入监控模式，并定期检查账号数量，一旦账号数量低于上限则自动恢复注册。

### 2.3. 账号使用情况 (Account Usage)
跟踪和管理账号的实际使用量：
-   **查询所有账号使用情况**: `GET /usage` 并发查询并返回所有已存账号的剩余额度和试用天数，结果会进行缓存以提高性能。
-   **查询单个账号使用情况**: `GET /account/{email}/usage` 查询特定邮箱账号的余额和剩余天数，并据此更新数据库中的记录。
-   **更新所有账号使用情况**: `POST /update_all_usage` 批量更新所有账号的余量信息到数据库。
-   **记录账号使用行为**: `GET /account/{id}/usage-records` 获取指定账号的历史使用记录（如IP地址、User-Agent、使用时间）。

### 2.4. 系统配置管理 (System Configuration)
允许动态管理应用的配置参数（通常存储在 `.env` 文件中）：
-   **读取配置**: `GET /config` 返回当前系统配置信息，如浏览器设置、邮箱服务详情、代理设置等。
-   **更新配置**: `POST /config` 允许通过 API 请求更新 `.env` 文件中的配置项，并重新加载。

### 2.5. Cursor 客户端集成 (Cursor Client Integration)
提供与本地安装的 Cursor IDE 进行交互的功能：
-   **使用账号 Token 更新认证**: `POST /account/use-token/{id}` 使用指定账号的 Access Token 来更新本地 Cursor IDE 的认证配置。可以选择是否同时重置机器ID。
-   **重置机器 ID**: `GET /reset-machine` 调用脚本重置本地 Cursor IDE 的机器识别码。

### 2.6. Web UI 与 API 文档 (Web UI & API Documentation)
-   **静态首页服务**: `GET /` 提供一个简单的 `index.html` 页面作为应用的 Web UI 入口。
-   **Swagger UI**: `GET /docs` 提供交互式的 API 文档界面。
-   **ReDoc**: `GET /redoc` 提供另一种风格的 API 文档。

## 3. 架构与关键组件 (Architecture & Key Components)

### 3.1. FastAPI 应用实例 (`app`)
-   **初始化**: `app = FastAPI(...)` 创建主应用实例，配置了标题、描述、版本、文档URL以及 `lifespan` 管理器。
-   **中间件**: `app.add_middleware(CORSMiddleware, ...)` 添加了 CORS 中间件以支持跨域请求。
-   **生命周期事件**: `@asynccontextmanager async def lifespan(app: FastAPI): ...` 定义了应用的生命周期事件。在应用启动时，会调用 `init_db()` 初始化数据库。

### 3.2. 数据库交互 (Database Interaction)
-   **`database.py` (外部模块)**: 此模块（未直接提供，但从导入推断）负责数据库的连接管理 (`get_session`)，定义数据模型 (`AccountModel`, `AccountUsageRecordModel`)，以及数据库初始化逻辑 (`init_db`)。
-   **SQLAlchemy ORM**: 应用通过 SQLAlchemy Core 的查询构造语法（如 `select()`, `delete()`, `func.count()`）和异步会话 (`async with get_session() as session:`) 与数据库进行交互。

### 3.3. 路由与端点 (Routing & Endpoints)
-   API 端点通过 FastAPI 的装饰器（如 `@app.get`, `@app.post`, `@app.put`, `@app.delete`）绑定到相应的异步处理函数。
-   端点通过 `tags` 参数在 API 文档中进行分组，主要包括: `General`, `Accounts`, `Registration`, `Config`, `System`。

### 3.4. 后台注册任务 (`run_registration`)
-   这是一个核心的异步函数，通过 `asyncio.create_task(run_registration())` 在 `/registration/start` 端点被调用时启动。
-   任务在一个无限循环中运行（受 `registration_status["is_running"]` 控制），依次执行：检查当前激活账号数是否小于 `MAX_ACCOUNTS`，调用 `register_account`（一个外部同步函数，通过 `run_in_executor` 异步执行）进行实际注册，处理成功/失败结果，更新统计信息，然后根据 `REGISTRATION_INTERVAL` 等待下一轮。

### 3.5. 全局状态管理 (Global State Management)
-   **`registration_status` (字典)**: 用于实时跟踪和存储自动注册任务的各种状态信息，如是否正在运行 (`is_running`)、上次运行时间 (`last_run`)、上次状态 (`last_status`)、下次计划运行时间 (`next_run`)，以及运行次数、成功和失败的统计。
-   **`background_tasks` (字典)**: 主要用于存储 `run_registration` 任务的 `asyncio.Task` 实例，键为 `"registration_task"`。这允许其他部分代码检查任务是否正在运行或取消任务。

### 3.6. 配置管理 (Configuration Management)
-   **`config.py` (外部模块)**: 定义了应用的一些关键配置常量，如 `MAX_ACCOUNTS`（最大账号数）、`REGISTRATION_INTERVAL`（注册间隔时间）、`API_HOST`、`API_PORT` 等。
-   **`.env` 文件**: 应用启动时及配置更新后，会通过 `python-dotenv` 库的 `load_dotenv()` 函数从项目根目录下的 `.env` 文件加载环境变量。这些变量通常包含敏感信息或环境特定配置。

### 3.7. 日志系统 (Logging)
-   **`logger.py` (外部模块)**: 应用从该模块导入 `info` 和 `error` 函数，用于在控制台或日志文件（取决于 `logger.py` 的配置）中记录不同级别的事件信息和错误详情，包括堆栈跟踪。

### 3.8. 辅助函数与类 (Utility Functions & Classes)
-   **数据库查询辅助函数**: `get_active_account_count()` 和 `get_account_count()` 用于高效查询数据库中符合特定条件的账号数量。
-   **`Cursor` 类 (from `tokenManager.cursor`)**: 封装了与 Cursor 服务进行交互的逻辑，例如 `get_remaining_balance()` 和 `get_trial_remaining_days()` 方法用于查询账号的额度和试用期。
-   **`CursorAuthManager` 类 (from `cursor_auth_manager`)**: 负责更新本地 Cursor IDE 的认证文件。
-   **`CursorShadowPatcher` 类 (from `cursor_shadow_patcher`)**: 负责重置本地 Cursor IDE 的机器 ID。

## 4. 数据模型 (Data Models - Pydantic)

Pydantic 模型在 FastAPI 中扮演着数据校验、序列化和文档生成的关键角色：
-   **`Account`**: 定义了一个 Cursor 账号的主要属性，如 `email`, `password`, `token`, `user`, `usage_limit`, `created_at`, `status`, `id`。它用于创建账号 (`POST /account`) 的请求体，并在多个响应中作为数据结构。`Config.from_attributes = True` 允许从 ORM 对象创建 Pydantic 模型实例。
-   **`AccountResponse`**: 一个通用的响应模型，封装了操作是否成功 (`success`)、返回的数据 (`data`，通常是 `Account` 模型或其列表)以及可选的消息 (`message`)。
-   **`StatusUpdate`**: 用于 `PUT /account/id/{id}/status` 端点的请求体，包含一个新的 `status` 字符串。
-   **`ConfigModel`**: 定义了 `POST /config` 端点接受的配置项及其类型，例如 `BROWSER_HEADLESS`, `MAX_ACCOUNTS`, `EMAIL_DOMAINS`, 代理相关设置等。

这些模型确保了 API 接收的数据符合预期格式，并且响应数据也以结构化的方式返回。

## 5. 错误处理 (Error Handling)

应用实现了全局异常处理机制：
-   **`@app.exception_handler(HTTPException)`**: 捕获 FastAPI 自身或其他地方抛出的 `HTTPException`。它会记录错误并通过 `JSONResponse` 返回一个包含 `success: False` 和错误详情（`exc.detail`）的 JSON 响应，状态码与原始异常一致。
-   **`@app.exception_handler(Exception)`**: 捕获所有其他未被处理的 Python 异常。这确保了即使发生意外错误，应用也不会崩溃，而是返回一个标准的 500 内部服务器错误响应，其中包含 `success: False` 和通用错误消息。在调试模式下（`app.debug` 为 True），响应中可能还会包含异常的详细信息。

这种集中的错误处理方式有助于提供一致的 API 错误响应格式。

## 6. 依赖与环境 (Dependencies & Environment)

### 主要依赖:
-   **FastAPI**: Web 框架。
-   **Uvicorn**: ASGI 服务器。
-   **SQLAlchemy**: ORM，用于数据库异步操作 (需要配合相应的数据库驱动，如 `asyncpg` for PostgreSQL, `aiomysql` for MySQL)。
-   **Pydantic**: 数据验证和模型定义。
-   **python-dotenv**: 加载 `.env` 文件中的环境变量。
-   **requests**: (推断) `tokenManager.cursor.Cursor` 类可能使用此库进行 HTTP 请求以查询 Cursor API。
-   **concurrent.futures**: 用于在 `check_usage` 接口中并发执行账号状态检查。

### 运行环境:
-   **Python**: 版本 3.7+ (基于 FastAPI 和 `async/await` 语法)。
-   **`.env` 文件**: 必须在项目根目录下存在，并包含所有必要的配置变量 (如数据库连接信息、API 密钥、邮箱配置、代理配置等)。`get_config` 和 `update_config` 端点直接与此文件交互。
-   **数据库服务**: 需要一个 SQLAlchemy 支持的数据库正在运行，并在 `.env` 中配置好连接参数。
-   **网络访问**: 自动注册和账号使用情况查询功能需要网络访问权限，以连接到 Cursor 服务和可能的邮件服务。

## 7. 部署与运行 (Deployment & Execution)

该 FastAPI 应用通过 Uvicorn ASGI 服务器运行。文件末尾的 `if __name__ == "__main__":` 块提供了一个直接运行应用的入口点：
```python
if __name__ == "__main__":
    uvicorn.run(
        "api:app",
        host=API_HOST,
        port=API_PORT,
        reload=API_DEBUG,
        access_log=True,
        log_level="error",
        workers=API_WORKERS,
        loop="asyncio",
    )
```
-   `"api:app"`: 指示 Uvicorn 加载 `api.py` 文件中的 `app` FastAPI 实例。
-   `host=API_HOST`, `port=API_PORT`: 从 `config.py` (或 `.env`) 加载监听的主机和端口。
-   `reload=API_DEBUG`: 如果 `API_DEBUG` 为 True，则启用热重载功能，代码更改时服务器会自动重启。
-   `access_log=True`: 启用访问日志。
-   `log_level="error"`: 设置 Uvicorn 的日志级别。
-   `workers=API_WORKERS`: 配置工作进程数量。对于生产环境，可以根据服务器核心数调整。
-   `loop="asyncio"`: 明确指定使用 asyncio 事件循环。

## 8. 注意事项 (Considerations)

-   **并发安全**: 虽然 FastAPI 和 asyncio 处理并发请求，但对全局变量 `registration_status` 和 `background_tasks` 的直接修改可能需要审慎处理，以避免潜在的竞争条件，尤其是在多 worker 配置下（尽管 Python 的 GIL 使得纯 Python 代码的并发问题不如其他语言复杂）。
-   **安全性**:
    -   **敏感信息**: `.env` 文件中存储了大量敏感配置。需要确保此文件的权限得到妥善管理。
    -   **密码存储**: 如果 `AccountModel` 直接存储明文密码，这是严重的安全风险。密码应始终进行哈希处理 (如使用 bcrypt 或 Argon2) 后再存储。
    -   **API 认证/授权**: 当前 API 似乎没有实现任何认证或授权机制来保护其端点。在生产环境中，应考虑添加如 OAuth2 或 API 密钥等机制来限制对敏感操作的访问。
-   **配置热重载**: `/restart` 接口通过修改 `.env` 文件中的一个时间戳变量来尝试触发 Uvicorn 的热重载。这种方法的有效性依赖于 Uvicorn 的 `--reload` 选项及其文件监控机制，可能并非在所有情况下都可靠或即时。
-   **外部依赖**: 自动注册功能依赖于外部的 `register_account` 函数和 `tokenManager.cursor` 模块。这些外部组件的稳定性和行为直接影响本应用的功能。
-   **错误处理细节**: 虽然有全局异常处理，但某些函数内部的 `try-except` 块可能会捕获并记录错误，然后继续执行或返回特定响应，这需要仔细审查以确保所有错误路径都得到妥善处理。
-   **数据库迁移**: 随着 `AccountModel` 或 `AccountUsageRecordModel` 的演变，需要一个数据库迁移策略 (如使用 Alembic) 来管理数据库模式的变更。
