feat: WeChat Pay integration, translation quota management, login UX fixes
- WeChat Pay APIv3 integration (JSAPI + Native) with cert-based auth - TranslationQuota model + admin management UI (配额 tab) - Alibaba MT provider now checks quota before translation - Fix: admin tabs scrollable on mobile, remove header-card - Fix: profile/login navigation - logout stays on profile, login returns to profile - Fix: login form now visible by default (no extra click to show) - Fix: home page translate link uses navigateTo (was switchTab to non-tabBar page) - Add .coverage and apiclient_key.pem to gitignore
This commit is contained in:
@@ -5,6 +5,7 @@ from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from app.database import get_db
|
||||
from app.services.admin import AdminService
|
||||
from app.services.translation_quota import TranslationQuotaService
|
||||
from app.api.v1.deps import get_current_user
|
||||
|
||||
router = APIRouter()
|
||||
@@ -173,3 +174,41 @@ async def system_health(
|
||||
):
|
||||
service = AdminService(db)
|
||||
return await service.get_system_health()
|
||||
|
||||
|
||||
@router.get("/translation-quotas")
|
||||
async def list_translation_quotas(
|
||||
_: dict = Depends(require_admin),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
service = TranslationQuotaService(db)
|
||||
return await service.get_all_quotas()
|
||||
|
||||
|
||||
@router.put("/translation-quotas/{version}")
|
||||
async def update_translation_quota(
|
||||
version: str,
|
||||
data: dict,
|
||||
_: dict = Depends(require_admin),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
allowed = {"monthly_limit", "enabled", "description"}
|
||||
filtered = {k: v for k, v in data.items() if k in allowed}
|
||||
service = TranslationQuotaService(db)
|
||||
result = await service.update_quota(version, filtered)
|
||||
if not result:
|
||||
raise HTTPException(status_code=404, detail="Quota not found")
|
||||
return result
|
||||
|
||||
|
||||
@router.post("/translation-quotas/{version}/reset")
|
||||
async def reset_translation_quota(
|
||||
version: str,
|
||||
_: dict = Depends(require_admin),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
service = TranslationQuotaService(db)
|
||||
result = await service.reset_usage(version)
|
||||
if not result:
|
||||
raise HTTPException(status_code=404, detail="Quota not found")
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user