feat: track download logs (ip, browser, device, time)
This commit is contained in:
@@ -4,8 +4,8 @@ from fastapi import APIRouter, HTTPException, Depends, Query
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy import select, func, or_
|
||||
from app.database import get_db
|
||||
from app.models import Video
|
||||
from app.schemas import VideoInfo, VideoListResponse, StorageStats
|
||||
from app.models import Video, DownloadLog
|
||||
from app.schemas import VideoInfo, VideoListResponse, StorageStats, DownloadLogInfo, DownloadLogListResponse
|
||||
from app.auth import get_current_user
|
||||
|
||||
router = APIRouter(prefix="/api/admin", tags=["admin"])
|
||||
@@ -68,3 +68,26 @@ async def storage_stats(user: dict = Depends(get_current_user), db: AsyncSession
|
||||
total = (await db.execute(select(func.count(Video.id)).where(Video.status == "done"))).scalar() or 0
|
||||
total_size = (await db.execute(select(func.sum(Video.file_size)).where(Video.status == "done"))).scalar() or 0
|
||||
return StorageStats(total_videos=total, total_size=total_size, total_size_human=human_size(total_size))
|
||||
|
||||
|
||||
@router.get("/download-logs", response_model=DownloadLogListResponse)
|
||||
async def download_logs(
|
||||
page: int = Query(1, ge=1),
|
||||
page_size: int = Query(50, ge=1, le=200),
|
||||
video_id: int = Query(None),
|
||||
user: dict = Depends(get_current_user),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
query = select(DownloadLog).order_by(DownloadLog.downloaded_at.desc())
|
||||
count_query = select(func.count(DownloadLog.id))
|
||||
if video_id is not None:
|
||||
query = query.where(DownloadLog.video_id == video_id)
|
||||
count_query = count_query.where(DownloadLog.video_id == video_id)
|
||||
total = (await db.execute(count_query)).scalar() or 0
|
||||
logs = (await db.execute(query.offset((page - 1) * page_size).limit(page_size))).scalars().all()
|
||||
return DownloadLogListResponse(
|
||||
logs=[DownloadLogInfo.model_validate(l) for l in logs],
|
||||
total=total,
|
||||
page=page,
|
||||
page_size=page_size,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user