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

1""" 

2Type definitions for admin storage service. 

3 

4Provides enums, dataclasses, and protocols for file storage operations. 

5""" 

6 

7from __future__ import annotations 

8 

9from dataclasses import dataclass 

10from datetime import datetime 

11from enum import StrEnum 

12from typing import Any 

13 

14from lexigram.contracts.infra.storage import UploadOptions 

15 

16 

17class StorageDriver(StrEnum): 

18 """Storage driver types.""" 

19 

20 LOCAL = "local" 

21 S3 = "s3" 

22 MEMORY = "memory" 

23 

24 

25@dataclass 

26class AdminFileInfo: 

27 """File information for admin uploads.""" 

28 

29 path: str 

30 """Storage path.""" 

31 

32 size: int 

33 """File size in bytes.""" 

34 

35 content_type: str 

36 """MIME content type.""" 

37 

38 last_modified: datetime 

39 """Last modification timestamp.""" 

40 

41 etag: str | None = None 

42 """ETag for caching.""" 

43 

44 metadata: dict[str, Any] | None = None 

45 """Additional metadata.""" 

46 

47 # Admin-specific 

48 uploaded_by: Any = None 

49 resource_type: str | None = None 

50 resource_id: Any = None 

51 

52 

53@dataclass 

54class UploadResult: 

55 """Payload of a successful file upload. 

56 

57 Always carried inside ``Ok[UploadResult, AdminError]``. 

58 """ 

59 

60 file_info: AdminFileInfo | None = None 

61 url: str | None = None 

62 

63 

64@dataclass 

65class AdminUploadOptions: 

66 """Options for admin file uploads.""" 

67 

68 content_type: str | None = None 

69 metadata: dict[str, str] | None = None 

70 public: bool = False 

71 

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 

77 

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 )