page_visits 테이블((visit_date, device_id) 유니크) — 하루 1기기 1회 집계. POST /api/visit(접속 기록), GET /api/admin/visits(일별 순수 방문자, Bearer). 프론트는 App 마운트 시 1회 recordVisit() 호출. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
27 lines
1.0 KiB
Python
27 lines
1.0 KiB
Python
"""방문자 집계 — 페이지 접속 기록(일별 순수 방문자)."""
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.exc import IntegrityError
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from ..database import get_db
|
|
from ..domain import KST, now_utc
|
|
from ..models import PageVisit
|
|
from ..schemas import VisitIn, VisitOut
|
|
|
|
router = APIRouter(prefix="/api/visit", tags=["visits"])
|
|
|
|
|
|
@router.post("", response_model=VisitOut)
|
|
async def record_visit(body: VisitIn, db: AsyncSession = Depends(get_db)) -> VisitOut:
|
|
"""페이지 접속 기록. 같은 기기가 같은 날(KST) 재접속하면 집계하지 않는다."""
|
|
today = now_utc().astimezone(KST).date()
|
|
db.add(PageVisit(visit_date=today, device_id=body.deviceId))
|
|
try:
|
|
await db.commit()
|
|
return VisitOut(ok=True, counted=True) # 오늘 첫 방문 → 집계
|
|
except IntegrityError:
|
|
await db.rollback()
|
|
return VisitOut(ok=True, counted=False) # 재방문 → 무시
|