Files
QuestionProject/ai_knowledge_base_v2/apps/backend/app/api/user.py
Nelson efe835be81 feat: 完善周期报告与用户行为分析
- 支持可配置周报月报模板与登录后异步补生成\n- 增加用户行为埋点和后台分析页面\n- 移除主题额度并保留实修回顾结算\n- 修复历史会话续聊上下文丢失
2026-08-19 11:53:34 +08:00

83 lines
3.0 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from app.core.database import get_db
from app.core.dependencies import get_current_user
from app.core.responses import api_success
from app.models.user import User
from app.schemas.user import UserProfile
from app.services.entitlement_service import EntitlementService, entitlement_dict
from app.services.growth_profile_service import GrowthProfileService, growth_profile_dict
from app.services.periodic_report_service import PeriodicReportService, periodic_report_user_dict
from app.services.periodic_report_lazy_service import PeriodicReportLazyService
router = APIRouter()
@router.get("/profile")
def profile(
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> dict:
data = UserProfile.model_validate(current_user).model_dump(mode="json")
view = EntitlementService.active_entitlement(db, current_user)
data["entitlement"] = entitlement_dict(view)
return api_success(data)
@router.get("/growth-profile")
def growth_profile(
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> dict:
profile = GrowthProfileService.get_growth_profile(db, current_user.id)
summaries = GrowthProfileService.recent_topic_summaries(db, current_user.id, limit=10)
return api_success(
{
"profile": growth_profile_dict(profile),
"recentSummaries": [
{
"id": item.id,
"topicSessionId": item.topic_session_id,
"schemaVersion": item.schema_version,
"summary": item.summary,
"currentFocus": item.main_events,
"nextObservation": item.next_observation,
"status": item.status,
"errorMessage": item.error_message,
"attemptCount": item.attempt_count,
"maxAttempts": item.max_attempts,
"nextRunAt": item.next_run_at,
"lastStartedAt": item.last_started_at,
"finishedAt": item.finished_at,
"generatedAt": item.generated_at,
}
for item in summaries
],
}
)
@router.get("/periodic-report/list")
def periodic_reports(
limit: int = 20,
ensure: bool = Query(default=False),
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
) -> dict:
entitlement = EntitlementService.active_entitlement(db, current_user)
if not entitlement.enable_periodic_reports:
return api_success([])
if ensure:
PeriodicReportLazyService.enqueue_missing_reports(db, user=current_user)
db.commit()
reports = PeriodicReportService.list_user_reports(
db,
user_id=current_user.id,
limit=max(1, min(limit, 50)),
statuses=("pending", "running", "success", "failed", "empty"),
)
return api_success([periodic_report_user_dict(item) for item in reports])