This commit is contained in:
Redsandy
2026-03-14 18:48:57 +03:00
parent 1d1350fc13
commit 3ea4fb4771
40 changed files with 2150 additions and 0 deletions

0
app/schemas/__init__.py Normal file
View File

36
app/schemas/activity.py Normal file
View File

@@ -0,0 +1,36 @@
import uuid
from datetime import datetime
from pydantic import BaseModel
class GpsPoint(BaseModel):
lat: float
lon: float
timestamp: datetime | None = None
altitude: float | None = None
hdop: float | None = None
class ActivityCreate(BaseModel):
type: str # run | cycle | walk | hike
started_at: datetime
ended_at: datetime
gps_track: list[GpsPoint]
class ActivityRead(BaseModel):
id: uuid.UUID
user_id: uuid.UUID
type: str
started_at: datetime | None
ended_at: datetime | None
distance_m: float | None
status: str
created_at: datetime
class ActivityDetail(ActivityRead):
"""Activity with zone info attached."""
zone_id: uuid.UUID | None = None
area_m2: float | None = None

22
app/schemas/score.py Normal file
View File

@@ -0,0 +1,22 @@
import uuid
from datetime import date
from pydantic import BaseModel
class ScoreRead(BaseModel):
user_id: uuid.UUID
date: date
base_pts: int
bonus_pts: int
total_pts: int
streak_days: int
class LeaderboardEntry(BaseModel):
user_id: uuid.UUID
username: str
avatar_url: str | None = None
total_pts: int
total_area_m2: float
zone_count: int
rank: int

48
app/schemas/user.py Normal file
View File

@@ -0,0 +1,48 @@
import uuid
from datetime import datetime
from pydantic import BaseModel, EmailStr
class UserCreate(BaseModel):
username: str
email: str
password: str
class UserRead(BaseModel):
id: uuid.UUID
username: str
email: str
avatar_url: str | None = None
created_at: datetime
class UserUpdate(BaseModel):
username: str | None = None
avatar_url: str | None = None
fcm_token: str | None = None
class UserStats(BaseModel):
id: uuid.UUID
username: str
avatar_url: str | None = None
total_area_m2: float = 0.0
total_points: int = 0
zone_count: int = 0
activity_count: int = 0
class LoginRequest(BaseModel):
username: str
password: str
class TokenResponse(BaseModel):
access_token: str
refresh_token: str
token_type: str = "bearer"
class RefreshRequest(BaseModel):
refresh_token: str

34
app/schemas/zone.py Normal file
View File

@@ -0,0 +1,34 @@
import uuid
from datetime import datetime
from pydantic import BaseModel
class ZoneRead(BaseModel):
id: uuid.UUID
owner_id: uuid.UUID
activity_id: uuid.UUID
polygon_geojson: dict # GeoJSON Polygon
area_m2: float
defense_level: int
defense_runs: int
created_at: datetime
last_reinforced_at: datetime | None = None
class ZoneBrief(BaseModel):
"""Lightweight zone for map rendering."""
id: uuid.UUID
owner_id: uuid.UUID
polygon_geojson: dict
area_m2: float
defense_level: int
class CaptureEvent(BaseModel):
"""Returned when a zone capture occurs."""
attacker_zone_id: uuid.UUID
victim_zone_id: uuid.UUID
victim_owner_id: uuid.UUID
captured_area_m2: float