초기 커밋

This commit is contained in:
2026-03-01 07:44:19 +09:00
commit 09359f30be
146 changed files with 6120 additions and 0 deletions

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

38
app/schemas/analytics.py Normal file
View File

@@ -0,0 +1,38 @@
from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel
class AnalyticsRequest(BaseModel):
device_id: str | None = None
analysis_type: str = "telemetry_summary"
start: datetime
end: datetime
parameters: dict = {}
class AnalyticsResultRead(BaseModel):
id: str
analysis_type: str
device_id: str | None
result: dict
parameters: dict
period_start: datetime | None
period_end: datetime | None
created_at: datetime
class ReportResponse(BaseModel):
report_id: str
device_id: str
status: dict
trends: dict
created_at: datetime
class TelemetryAggregateResponse(BaseModel):
device_id: str
records: list[dict]
count: int

30
app/schemas/auth.py Normal file
View File

@@ -0,0 +1,30 @@
from __future__ import annotations
from pydantic import BaseModel, EmailStr
class LoginRequest(BaseModel):
email: EmailStr
password: str
class RegisterRequest(BaseModel):
email: EmailStr
password: str
full_name: str = ""
class TokenResponse(BaseModel):
access_token: str
refresh_token: str
token_type: str = "bearer"
class RefreshTokenRequest(BaseModel):
refresh_token: str
class OAuthCallbackRequest(BaseModel):
provider: str
code: str
redirect_uri: str

19
app/schemas/common.py Normal file
View File

@@ -0,0 +1,19 @@
from __future__ import annotations
from typing import Generic, TypeVar
from pydantic import BaseModel
T = TypeVar("T")
class ErrorResponse(BaseModel):
detail: str
class PaginatedResponse(BaseModel, Generic[T]):
items: list[T]
total: int
page: int
size: int
pages: int

52
app/schemas/device.py Normal file
View File

@@ -0,0 +1,52 @@
from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel
class DeviceGroupRead(BaseModel):
id: int
name: str
description: str
model_config = {"from_attributes": True}
class DeviceGroupCreate(BaseModel):
name: str
description: str = ""
class DeviceRead(BaseModel):
id: int
device_uid: str
name: str
device_type: str
status: str
firmware_version: str
ip_address: str
group_id: int | None
owner_id: int | None
last_seen_at: datetime | None
created_at: datetime
model_config = {"from_attributes": True}
class DeviceCreate(BaseModel):
device_uid: str
name: str
device_type: str = ""
group_id: int | None = None
owner_id: int | None = None
firmware_version: str = ""
class DeviceUpdate(BaseModel):
name: str | None = None
device_type: str | None = None
status: str | None = None
firmware_version: str | None = None
group_id: int | None = None
owner_id: int | None = None

54
app/schemas/monitoring.py Normal file
View File

@@ -0,0 +1,54 @@
from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel
class AlertRuleRead(BaseModel):
id: int
name: str
description: str
metric: str
condition: str
threshold: float
severity: str
is_enabled: bool
device_group_id: int | None
created_at: datetime
model_config = {"from_attributes": True}
class AlertRuleCreate(BaseModel):
name: str
description: str = ""
metric: str
condition: str
threshold: float
severity: str = "warning"
device_group_id: int | None = None
class AlertRead(BaseModel):
id: int
rule_id: int | None
device_id: int | None
severity: str
message: str
is_acknowledged: bool
acknowledged_by: int | None
acknowledged_at: datetime | None
created_at: datetime
model_config = {"from_attributes": True}
class SystemHealthResponse(BaseModel):
status: str
mariadb: str
mongodb: str
redis: str
mqtt: str
active_devices: int
active_alerts: int

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

@@ -0,0 +1,38 @@
from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel, EmailStr
class UserRead(BaseModel):
id: int
email: str
role: str
is_active: bool
is_verified: bool
full_name: str = ""
phone: str = ""
organization: str = ""
avatar_url: str = ""
created_at: datetime
model_config = {"from_attributes": True}
class UserCreate(BaseModel):
email: EmailStr
password: str
role: str = "user"
full_name: str = ""
phone: str = ""
organization: str = ""
class UserUpdate(BaseModel):
full_name: str | None = None
phone: str | None = None
organization: str | None = None
avatar_url: str | None = None
is_active: bool | None = None
role: str | None = None