- shared/ = portable Android-origin sources vendored from deferred/desktop-server (app/build.gradle.kts srcDir repointed; PlaybackController.kt excluded as Android-only) - backend/ = bundled-lite engine (SQLite + inline queue); .venv symlinked from the old checkout, PYTHONPATH pins THIS backend's code over any editable install - repoRoot() resolves this project dir (env SHONAR_REPO still wins); desktop-dev.sh watches shared/ + backend/ - Verified: :app:compileKotlin + :app:test green (23 tests); engine boots on :8010, self-migrates, /healthz ok
69 lines
1.4 KiB
Python
69 lines
1.4 KiB
Python
"""Shared Pydantic schemas."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import uuid
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict, EmailStr, Field
|
|
|
|
|
|
class ORMModel(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
# --- auth ---
|
|
|
|
|
|
class RegisterRequest(BaseModel):
|
|
email: EmailStr
|
|
password: str = Field(min_length=10, max_length=256)
|
|
display_name: str | None = Field(default=None, max_length=120)
|
|
|
|
|
|
class LoginRequest(BaseModel):
|
|
email: EmailStr
|
|
password: str
|
|
device_name: str | None = Field(default=None, max_length=120)
|
|
platform: str = Field(default="android", max_length=40)
|
|
|
|
|
|
class TokenPair(BaseModel):
|
|
access_token: str
|
|
token_type: str = "bearer"
|
|
expires_in: int
|
|
refresh_token: str
|
|
device_id: uuid.UUID | None = None
|
|
|
|
|
|
class RefreshRequest(BaseModel):
|
|
refresh_token: str
|
|
|
|
|
|
class LogoutRequest(BaseModel):
|
|
refresh_token: str
|
|
|
|
|
|
class UserOut(ORMModel):
|
|
id: uuid.UUID
|
|
email: EmailStr
|
|
display_name: str | None
|
|
location_storage_enabled: bool
|
|
created_at: datetime
|
|
|
|
|
|
class UserUpdate(BaseModel):
|
|
display_name: str | None = Field(default=None, max_length=120)
|
|
location_storage_enabled: bool | None = None
|
|
|
|
|
|
class DeviceOut(ORMModel):
|
|
id: uuid.UUID
|
|
name: str
|
|
platform: str
|
|
last_seen_at: datetime
|
|
revoked_at: datetime | None
|
|
|
|
|
|
class DeleteAccountRequest(BaseModel):
|
|
password: str
|