chore: resolve WIP after merging internal/development
- .gitignore: keep api/uploads ignore and copyright_source_listing.pdf path - auth: keep COS avatar upload URL; delete prior COS object when applying preset - i18n: regenerate resources.ts (includes profile tapAwayToClose) - Avatar/COS tests and personal-info remain from prior local work Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -14,6 +14,9 @@ logger = get_logger(__name__)
|
||||
# 客户端再读 TTS / 拉取音频:预签名有效期(秒),与移动端会话长度匹配
|
||||
TTS_PRESIGNED_EXPIRES_SEC = 86_400
|
||||
|
||||
# 用户头像 API 下发(与 TTS 一致)
|
||||
AVATAR_PRESIGNED_EXPIRES_SEC = TTS_PRESIGNED_EXPIRES_SEC
|
||||
|
||||
|
||||
def extract_cos_object_key_if_owned(url: str | None) -> str | None:
|
||||
"""
|
||||
@@ -119,3 +122,50 @@ def presign_tts_urls_for_playback(
|
||||
else:
|
||||
out.append(s)
|
||||
return out
|
||||
|
||||
|
||||
def avatar_url_for_api_response(stored_url: str | None) -> str | None:
|
||||
"""DB 中的头像 URL:本环境 COS 直链改为预签名下载 URL。"""
|
||||
if stored_url is None:
|
||||
return None
|
||||
s = str(stored_url).strip()
|
||||
if not s:
|
||||
return None
|
||||
key = extract_cos_object_key_if_owned(s)
|
||||
if not key:
|
||||
return s
|
||||
if not (
|
||||
(settings.tencent_cos_secret_id or "").strip()
|
||||
and (settings.tencent_cos_bucket or "").strip()
|
||||
):
|
||||
return s
|
||||
from app.core.dependencies import get_object_storage
|
||||
|
||||
storage = get_object_storage()
|
||||
try:
|
||||
return storage.get_url(key, expires=AVATAR_PRESIGNED_EXPIRES_SEC)
|
||||
except Exception as exc:
|
||||
logger.warning(
|
||||
"presign avatar url failed, keeping original: key={} err={}",
|
||||
key,
|
||||
exc,
|
||||
)
|
||||
return s
|
||||
|
||||
|
||||
def best_effort_delete_cos_object_for_url(url: str | None) -> None:
|
||||
"""本环境 COS 对象则尽力 delete(换头像 / 预设时清理)。"""
|
||||
key = extract_cos_object_key_if_owned(url)
|
||||
if not key:
|
||||
return
|
||||
if not (
|
||||
(settings.tencent_cos_secret_id or "").strip()
|
||||
and (settings.tencent_cos_bucket or "").strip()
|
||||
):
|
||||
return
|
||||
from app.core.dependencies import get_object_storage
|
||||
|
||||
try:
|
||||
get_object_storage().delete(key)
|
||||
except Exception as exc:
|
||||
logger.warning("delete cos avatar object failed: key={} err={}", key, exc)
|
||||
|
||||
Reference in New Issue
Block a user