110 lines
2.5 KiB
Python
110 lines
2.5 KiB
Python
from pydantic import BaseModel
|
|
from typing import List, Optional
|
|
from datetime import datetime
|
|
from uuid import UUID
|
|
|
|
|
|
class UserFileOut(BaseModel):
|
|
id: int
|
|
user_id: int
|
|
file_name: str
|
|
s3_key: str
|
|
file_size: int
|
|
mime_type: Optional[str]
|
|
is_deleted: bool
|
|
deleted_at: Optional[datetime]
|
|
created_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class StorageUsageOut(BaseModel):
|
|
total_bytes: int
|
|
file_count: int
|
|
last_updated: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class StorageStatsOut(BaseModel):
|
|
user_id: int
|
|
total_bytes: int
|
|
file_count: int
|
|
quota_bytes: int
|
|
usage_percentage: float
|
|
|
|
|
|
class StorageBreakdown(BaseModel):
|
|
pdf: int = 0
|
|
docx: int = 0
|
|
html: int = 0
|
|
other: int = 0
|
|
|
|
|
|
class StorageAlerts(BaseModel):
|
|
severity: Optional[str] = None
|
|
ring_color: Optional[str] = None
|
|
banner: Optional[str] = None
|
|
center_message: Optional[str] = None
|
|
current_threshold: Optional[float] = None
|
|
|
|
|
|
class UserStorageStats(BaseModel):
|
|
used_bytes: int = 0
|
|
used_formatted: Optional[str] = None
|
|
file_count: int = 0
|
|
percent: float = 0.0
|
|
breakdown: StorageBreakdown = StorageBreakdown()
|
|
|
|
|
|
class StorageUsageDetail(BaseModel):
|
|
"""The `usage` / `storage` object, shared by both endpoints."""
|
|
|
|
scope: Optional[str] = None
|
|
tenant_id: Optional[str] = None
|
|
used_bytes: int = 0
|
|
used_formatted: Optional[str] = None
|
|
total_bytes: int = 0
|
|
total_formatted: Optional[str] = None
|
|
quota_bytes: int = 0
|
|
quota_formatted: Optional[str] = None
|
|
remaining_bytes: int = 0
|
|
remaining_formatted: Optional[str] = None
|
|
file_count: int = 0
|
|
percent: float = 0.0
|
|
usage_percentage: float = 0.0
|
|
breakdown: StorageBreakdown = StorageBreakdown()
|
|
alerts: StorageAlerts = StorageAlerts()
|
|
user_stats: Optional[UserStorageStats] = None
|
|
|
|
|
|
class StorageUsageResponse(BaseModel):
|
|
user_id: int
|
|
tenant_id: Optional[UUID] = None
|
|
usage: StorageUsageDetail
|
|
|
|
|
|
class StorageFileSummary(BaseModel):
|
|
"""One row of `GET /api/storage/files`, as built by StorageService."""
|
|
|
|
id: int
|
|
name: Optional[str] = None
|
|
size: int = 0
|
|
size_formatted: Optional[str] = None
|
|
mime_type: Optional[str] = None
|
|
created_at: Optional[str] = None
|
|
|
|
|
|
class Pagination(BaseModel):
|
|
limit: int
|
|
offset: int
|
|
total_count: int
|
|
|
|
|
|
class StorageFilesResponse(BaseModel):
|
|
files: List[StorageFileSummary] = []
|
|
pagination: Pagination
|
|
storage: StorageUsageDetail
|