Coverage for src/lexigram/admin/cqrs/queries.py: 0%
49 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"""Standard admin query types for the CQRS layer.
3Queries are read-only operations; they never mutate state.
4"""
6from __future__ import annotations
8from dataclasses import dataclass, field
9from typing import Any
10from uuid import uuid4
13@dataclass
14class AdminQuery:
15 """Base class for all admin queries."""
17 query_id: str = field(default_factory=lambda: str(uuid4()))
18 user_id: str | None = None
20 @property
21 def name(self) -> str:
22 """Return the query class name."""
23 return self.__class__.__name__
26# ========== User Queries ==========
29@dataclass
30class GetAdminUser(AdminQuery):
31 """Query a single admin user by ID."""
33 user_id: str = ""
36@dataclass
37class ListAdminUsers(AdminQuery):
38 """Query a paginated list of admin users."""
40 page: int = 1
41 page_size: int = 20
42 search: str | None = None
43 role_filter: str | None = None
46# ========== Resource Queries ==========
49@dataclass
50class GetResource(AdminQuery):
51 """Query a single resource record."""
53 resource_type: str = ""
54 resource_id: Any = None
57@dataclass
58class ListResources(AdminQuery):
59 """Query a paginated list of resource records."""
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"
69@dataclass
70class SearchResources(AdminQuery):
71 """Full-text search across a resource type."""
73 resource_type: str = ""
74 query: str = ""
75 page: int = 1
76 page_size: int = 20
79# ========== Dashboard Queries ==========
82@dataclass
83class GetDashboardStats(AdminQuery):
84 """Query summary statistics for the admin dashboard."""
86 resource_types: list[str] = field(default_factory=list)
89@dataclass
90class GetAuditLog(AdminQuery):
91 """Query recent audit log entries."""
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
100__all__ = [
101 "AdminQuery",
102 "GetAdminUser",
103 "GetAuditLog",
104 "GetDashboardStats",
105 "GetResource",
106 "ListAdminUsers",
107 "ListResources",
108 "SearchResources",
109]