Files
track/backend/app/api/v1/endpoints/app_version.py

56 lines
1.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""App 版本更新 API — OTA 热更新检测"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy import select, desc
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.database import get_db
from app.models.app_version import AppVersion
from app.schemas.app_version import AppVersionResponse
router = APIRouter(prefix="/app", tags=["App版本"])
@router.get("/version", response_model=AppVersionResponse)
async def check_version(
current: str = Query(..., description="当前 App 版本号,如 T1.0.0"),
db: AsyncSession = Depends(get_db),
):
"""检测是否有新版本可用"""
# 查询最新的激活版本
result = await db.execute(
select(AppVersion)
.where(AppVersion.is_active.is_(True))
.order_by(desc(AppVersion.version_code))
.limit(1)
)
latest = result.scalar_one_or_none()
if not latest:
# 无版本记录 → 无更新
return AppVersionResponse(
version=current,
version_code=0,
has_update=False,
)
# 比较版本号
has_update = latest.version_code > _parse_version_code(current)
return AppVersionResponse(
version=latest.version,
version_code=latest.version_code,
has_update=has_update,
wgt_url=latest.wgt_url if has_update else None,
description=latest.description if has_update else None,
force_update=False,
)
def _parse_version_code(version_str: str) -> int:
"""从版本字符串提取数字版本号兜底用最后3位"""
import re
nums = re.findall(r"\d+", version_str)
if nums:
return int("".join(nums[-3:]).ljust(3, "0")[:3])
return 0