o2o-triple-pick/backend/app/routers/visits.py

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) # 재방문 → 무시