Files
site11/services/files/backend/models.py
2025-09-28 20:41:57 +09:00

112 lines
2.7 KiB
Python

"""
Data models for File Management Service
"""
from pydantic import BaseModel, Field
from datetime import datetime
from typing import Optional, List, Dict, Any
from enum import Enum
class FileType(str, Enum):
IMAGE = "image"
VIDEO = "video"
AUDIO = "audio"
DOCUMENT = "document"
ARCHIVE = "archive"
OTHER = "other"
class FileStatus(str, Enum):
PENDING = "pending"
PROCESSING = "processing"
READY = "ready"
ERROR = "error"
DELETED = "deleted"
class FileMetadata(BaseModel):
id: str
filename: str
original_name: str
size: int
content_type: str
file_type: FileType
bucket: str
object_name: str
user_id: str
hash: str
status: FileStatus = FileStatus.READY
public: bool = False
has_thumbnail: bool = False
thumbnail_url: Optional[str] = None
tags: Dict[str, Any] = {}
metadata: Dict[str, Any] = {}
download_count: int = 0
created_at: datetime
updated_at: datetime
deleted_at: Optional[datetime] = None
class FileUploadResponse(BaseModel):
file_id: str
filename: str
size: int
content_type: str
file_type: FileType
bucket: str
public: bool
has_thumbnail: bool
thumbnail_url: Optional[str] = None
download_url: Optional[str] = None
created_at: datetime
message: str = "File uploaded successfully"
class FileListResponse(BaseModel):
files: List[FileMetadata]
total: int
limit: int
offset: int
has_more: bool
class StorageStats(BaseModel):
total_files: int
total_size: int
buckets: List[str]
users_count: int
file_types: Dict[str, int]
storage_used_percentage: Optional[float] = None
class ThumbnailRequest(BaseModel):
file_id: str
width: int = Field(200, ge=50, le=1000)
height: int = Field(200, ge=50, le=1000)
quality: int = Field(85, ge=50, le=100)
format: str = Field("jpeg", pattern="^(jpeg|png|webp)$")
class PresignedUrlResponse(BaseModel):
url: str
expires_in: int
method: str
headers: Optional[Dict[str, str]] = None
class BatchOperationResult(BaseModel):
successful: List[str]
failed: List[Dict[str, str]]
total_processed: int
total_successful: int
total_failed: int
class FileShareLink(BaseModel):
share_url: str
expires_in: int
file_id: str
filename: str
created_at: datetime
expires_at: datetime
class FileProcessingJob(BaseModel):
job_id: str
file_id: str
job_type: str # thumbnail, compress, convert, etc.
status: str # pending, processing, completed, failed
progress: Optional[float] = None
result: Optional[Dict[str, Any]] = None
error: Optional[str] = None
created_at: datetime
completed_at: Optional[datetime] = None