Coverage for src/lexigram/admin/services/storage/types.py: 0%
42 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:18 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-24 23:18 +0800
1"""
2Type definitions for admin storage service.
4Provides enums, dataclasses, and protocols for file storage operations.
5"""
7from __future__ import annotations
9from dataclasses import dataclass
10from datetime import datetime
11from enum import StrEnum
12from typing import Any
14from lexigram.contracts.infra.storage import UploadOptions
17class StorageDriver(StrEnum):
18 """Storage driver types."""
20 LOCAL = "local"
21 S3 = "s3"
22 MEMORY = "memory"
25@dataclass
26class AdminFileInfo:
27 """File information for admin uploads."""
29 path: str
30 """Storage path."""
32 size: int
33 """File size in bytes."""
35 content_type: str
36 """MIME content type."""
38 last_modified: datetime
39 """Last modification timestamp."""
41 etag: str | None = None
42 """ETag for caching."""
44 metadata: dict[str, Any] | None = None
45 """Additional metadata."""
47 # Admin-specific
48 uploaded_by: Any = None
49 resource_type: str | None = None
50 resource_id: Any = None
53@dataclass
54class UploadResult:
55 """Payload of a successful file upload.
57 Always carried inside ``Ok[UploadResult, AdminError]``.
58 """
60 file_info: AdminFileInfo | None = None
61 url: str | None = None
64@dataclass
65class AdminUploadOptions:
66 """Options for admin file uploads."""
68 content_type: str | None = None
69 metadata: dict[str, str] | None = None
70 public: bool = False
72 # Admin-specific
73 resource_type: str | None = None
74 resource_id: Any = None
75 allowed_types: list[str] | None = None
76 max_size: int | None = None # bytes
78 def to_storage_options(self) -> UploadOptions:
79 """Convert to storage contract UploadOptions."""
80 return UploadOptions(
81 content_type=self.content_type,
82 metadata=self.metadata,
83 public=self.public,
84 )