Files
docqube_backend/app/modules/storage/schemas/storage_schema.py
T

110 lines
2.5 KiB
Python
Raw Normal View History

2026-09-08 11:24:28 +05:30
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