ShiErFeng/shierfeng-fastapi-backend/cli/groups/db/presenter.py
2026-07-24 09:43:10 +08:00

72 lines
2.8 KiB
Python

class DbCommandPresenter:
"""
数据库命令文本渲染器。
该渲染器负责将 `db` 命令组产生的结构化 payload 转换为稳定的文本摘要,
同时保持 JSON 输出仍由控制器直接返回,不在此处做契约变形。
"""
@staticmethod
def build_current_revision_text(payload: dict[str, object]) -> str:
"""
将数据库当前迁移版本结果渲染为文本摘要。
:param payload: 当前迁移版本结果字典
:return: 文本摘要
"""
return '\n'.join(
[
f'ok: {str(payload.get("ok", False)).lower()}',
f'env: {payload.get("env", "")}',
f'current_revision: {payload.get("currentRevision", "-")}',
]
)
def build_alembic_revisions_text(self, payload: dict[str, object]) -> str:
"""
将 Alembic 修订版本结果渲染为文本摘要。
:param payload: 修订版本结果字典
:return: 文本摘要
"""
items = payload.get('items')
lines = [
f'ok: {str(payload.get("ok", False)).lower()}',
f'env: {payload.get("env", "")}',
f'message: {payload.get("message", "-")}',
f'count: {payload.get("count", 0)}',
]
if 'totalCount' in payload:
lines.append(f'total_count: {payload.get("totalCount", 0)}')
if 'limit' in payload:
lines.append(f'limit: {payload.get("limit", 0)}')
if not isinstance(items, list) or not items:
lines.append('items: none')
return '\n'.join(lines)
lines.append('items:')
for item in items:
if isinstance(item, dict):
lines.extend([f' {line}' for line in self._build_alembic_revision_item_lines(item)])
return '\n'.join(lines)
@staticmethod
def _build_alembic_revision_item_lines(revision_item: dict[str, object]) -> list[str]:
"""
构建单个 Alembic 修订版本的文本行。
:param revision_item: 修订版本结果字典
:return: 文本行列表
"""
down_revisions = revision_item.get('downRevisions')
branch_labels = revision_item.get('branchLabels')
depends_on = revision_item.get('dependsOn')
return [
f'- revision: {revision_item.get("revision", "-")}',
f' down_revisions: {",".join(down_revisions) if isinstance(down_revisions, list) and down_revisions else "-"}',
f' branch_labels: {",".join(branch_labels) if isinstance(branch_labels, list) and branch_labels else "-"}',
f' depends_on: {",".join(depends_on) if isinstance(depends_on, list) and depends_on else "-"}',
f' doc: {revision_item.get("doc", "") or "-"}',
f' path: {revision_item.get("path", "-")}',
]