Add gamification trust analytics polish
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from datetime import date
|
||||
from datetime import UTC, date, datetime, timedelta
|
||||
from decimal import Decimal
|
||||
|
||||
from sqlalchemy import func, select
|
||||
@@ -327,6 +327,41 @@ async def unlock_achievement(
|
||||
)
|
||||
|
||||
|
||||
async def record_engagement_event(
|
||||
session: AsyncSession,
|
||||
*,
|
||||
event_type: str,
|
||||
user_id: int | None = None,
|
||||
vehicle_id: int | None = None,
|
||||
service_center_id: int | None = None,
|
||||
metadata: dict | None = None,
|
||||
cooldown_minutes: int = 360,
|
||||
) -> None:
|
||||
since = datetime.now(UTC) - timedelta(minutes=cooldown_minutes)
|
||||
result = await session.execute(
|
||||
select(EngagementEvent).where(
|
||||
EngagementEvent.event_type == event_type,
|
||||
EngagementEvent.user_id.is_(None) if user_id is None else EngagementEvent.user_id == user_id,
|
||||
EngagementEvent.vehicle_id.is_(None) if vehicle_id is None else EngagementEvent.vehicle_id == vehicle_id,
|
||||
EngagementEvent.service_center_id.is_(None)
|
||||
if service_center_id is None
|
||||
else EngagementEvent.service_center_id == service_center_id,
|
||||
EngagementEvent.created_at >= since,
|
||||
)
|
||||
)
|
||||
if result.scalar_one_or_none() is not None:
|
||||
return
|
||||
session.add(
|
||||
EngagementEvent(
|
||||
user_id=user_id,
|
||||
vehicle_id=vehicle_id,
|
||||
service_center_id=service_center_id,
|
||||
event_type=event_type,
|
||||
metadata_json=metadata,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
async def evaluate_vehicle_achievements(
|
||||
session: AsyncSession,
|
||||
car: Car,
|
||||
|
||||
Reference in New Issue
Block a user