| | |
| | from __future__ import annotations |
| | from abc import ABC, abstractmethod |
| | from decimal import Decimal |
| | from typing import Any, Literal |
| |
|
| | from pydantic import BaseModel, IPvAnyAddress |
| |
|
| | EventType = Literal[ |
| | "Start Session", |
| | "End Session", |
| | "Revenue", |
| | "Revenue (Verified)", |
| | "Revenue (Unverified)", |
| | "Sign Up", |
| | "Select Item", |
| | "View Item", |
| | "Complete Purchase", |
| | "Error", |
| | ] |
| | PaymentMethod = Literal["Stripe", "PayPal", "Square", "Crypto"] |
| |
|
| |
|
| | class UserProperties(BaseModel): |
| | first_name: str | None = None |
| | last_name: str | None = None |
| | username: str | None = None |
| | is_premium: str | None = None |
| | url: str | None = None |
| |
|
| |
|
| | class EventProperties(BaseModel): |
| | chat_id: int | None = None |
| | chat_type: str | None = None |
| | text: str | None = None |
| | command: str | None = None |
| | payment_method: PaymentMethod | None = None |
| |
|
| |
|
| | class Plan(BaseModel): |
| | branch: str | None = None |
| | source: str | None = None |
| | version: str | None = None |
| |
|
| |
|
| | class BaseEvent(BaseModel): |
| | user_id: int |
| | event_type: EventType |
| | time: int | None = None |
| | user_properties: UserProperties | None = None |
| | event_properties: EventProperties | None = None |
| | app_version: str | None = None |
| | platform: str | None = None |
| | carrier: str | None = None |
| | country: str | None = None |
| | region: str | None = None |
| | city: str | None = None |
| | dma: str | None = None |
| | language: str | None = None |
| | price: float | Decimal | None = None |
| | quantity: int | None = None |
| | revenue: float | Decimal | None = None |
| | productId: str | None = None |
| | revenueType: str | None = None |
| | location_lat: float | None = None |
| | location_lng: float | None = None |
| | ip: IPvAnyAddress | None = None |
| | plan: Plan | None = None |
| |
|
| | def to_dict(self) -> dict[str, Any]: |
| | return {key: value for key, value in self.model_dump(exclude_none=True).items() if value} |
| |
|
| |
|
| | class AbstractAnalyticsLogger(ABC): |
| | @abstractmethod |
| | async def log_event(self, event: BaseEvent) -> None: |
| | pass |
| |
|