init
This commit is contained in:
0
app/schemas/__init__.py
Normal file
0
app/schemas/__init__.py
Normal file
36
app/schemas/activity.py
Normal file
36
app/schemas/activity.py
Normal 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
22
app/schemas/score.py
Normal 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
48
app/schemas/user.py
Normal 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
34
app/schemas/zone.py
Normal 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
|
||||
Reference in New Issue
Block a user