Coverage for src / lexigram / admin / cqrs / queries.py: 0%

49 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-11 02:25 +0800

1"""Standard admin query types for the CQRS layer. 

2 

3Queries are read-only operations; they never mutate state. 

4""" 

5 

6from __future__ import annotations 

7 

8from dataclasses import dataclass, field 

9from typing import Any 

10from uuid import uuid4 

11 

12 

13@dataclass 

14class AdminQuery: 

15 """Base class for all admin queries.""" 

16 

17 query_id: str = field(default_factory=lambda: str(uuid4())) 

18 user_id: str | None = None 

19 

20 @property 

21 def name(self) -> str: 

22 """Return the query class name.""" 

23 return self.__class__.__name__ 

24 

25 

26# ========== User Queries ========== 

27 

28 

29@dataclass 

30class GetAdminUser(AdminQuery): 

31 """Query a single admin user by ID.""" 

32 

33 user_id: str = "" 

34 

35 

36@dataclass 

37class ListAdminUsers(AdminQuery): 

38 """Query a paginated list of admin users.""" 

39 

40 page: int = 1 

41 page_size: int = 20 

42 search: str | None = None 

43 role_filter: str | None = None 

44 

45 

46# ========== Resource Queries ========== 

47 

48 

49@dataclass 

50class GetResource(AdminQuery): 

51 """Query a single resource record.""" 

52 

53 resource_type: str = "" 

54 resource_id: Any = None 

55 

56 

57@dataclass 

58class ListResources(AdminQuery): 

59 """Query a paginated list of resource records.""" 

60 

61 resource_type: str = "" 

62 page: int = 1 

63 page_size: int = 20 

64 filters: dict[str, Any] = field(default_factory=dict) 

65 order_by: str | None = None 

66 order_dir: str = "asc" 

67 

68 

69@dataclass 

70class SearchResources(AdminQuery): 

71 """Full-text search across a resource type.""" 

72 

73 resource_type: str = "" 

74 query: str = "" 

75 page: int = 1 

76 page_size: int = 20 

77 

78 

79# ========== Dashboard Queries ========== 

80 

81 

82@dataclass 

83class GetDashboardStats(AdminQuery): 

84 """Query summary statistics for the admin dashboard.""" 

85 

86 resource_types: list[str] = field(default_factory=list) 

87 

88 

89@dataclass 

90class GetAuditLog(AdminQuery): 

91 """Query recent audit log entries.""" 

92 

93 page: int = 1 

94 page_size: int = 50 

95 resource_type: str | None = None 

96 action: str | None = None 

97 actor_id: str | None = None 

98 

99 

100__all__ = [ 

101 "AdminQuery", 

102 "GetAdminUser", 

103 "GetAuditLog", 

104 "GetDashboardStats", 

105 "GetResource", 

106 "ListAdminUsers", 

107 "ListResources", 

108 "SearchResources", 

109]