Coverage for api/roles/schema.py: 100.00%
49 statements
« prev ^ index » next coverage.py v7.9.2, created at 2026-01-25 13:05 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2026-01-25 13:05 +0000
1from pydantic import BaseModel, Field
2from typing import Optional, Dict, List
4class RoleResponse(BaseModel):
5 id: str = Field(..., description="Role ID")
6 name: str = Field(..., description="Role name")
7 description: Optional[str] = Field(None, description="Role description")
9class RolesListResponse(BaseModel):
10 roles: List[RoleResponse] = Field(..., description="List of roles")
12class RoleCreate(BaseModel):
13 name: str = Field(..., min_length=1, max_length=100, description="Role name")
14 description: Optional[str] = Field(None, max_length=500, description="Role description")
16class RoleUpdate(BaseModel):
17 name: Optional[str] = Field(None, min_length=1, max_length=100, description="Role name")
18 description: Optional[str] = Field(None, max_length=500, description="Role description")
20class RoleAttributesMapping(BaseModel):
21 attributes: Dict[str, bool] = Field(
22 ...,
23 description="Role attributes mapping (attribute_name: value)",
24 example={
25 "view-users": True,
26 "manage-users": False,
27 "view-roles": True
28 }
29 )
31 @classmethod
32 def get_example_response(cls):
33 return {
34 "code": 200,
35 "message": "Role attributes mapping example",
36 "data": {
37 "attributes": {
38 "view-users": True,
39 "manage-users": False,
40 "view-roles": True
41 }
42 }
43 }
45class RoleAttributeDetail(BaseModel):
46 name: str = Field(..., description="Attribute name", example="view-users")
47 value: bool = Field(..., description="Whether the role has this attribute", example=True)
50class RoleAttributesGroup(BaseModel):
51 group: str = Field(..., description="Top-level group key", example="user-role-management")
52 categories: Dict[str, List[RoleAttributeDetail]] = Field(..., description="Categories inside this group (category -> attributes)")
55class RoleAttributesGroupedResponse(BaseModel):
56 groups: List[RoleAttributesGroup] = Field(..., description="Role attributes grouped by group and category")
58 @classmethod
59 def get_example_response(cls):
60 return {
61 "code": 200,
62 "message": "Successfully retrieved role attributes mapping",
63 "data": {
64 "groups": [
65 {
66 "group": "user-role-management",
67 "categories": {
68 "user": [
69 {
70 "name": "view-users",
71 "value": True
72 },
73 {
74 "name": "manage-users",
75 "value": False
76 }
77 ],
78 "role": [
79 {
80 "name": "view-roles",
81 "value": True
82 }
83 ]
84 }
85 }
86 ]
87 }
88 }
90class AttributeMappingResult(BaseModel):
91 attribute_id: str = Field(..., description="Attribute ID")
92 status: str = Field(..., description="Processing status: success, failed", pattern="^(success|failed)$")
93 message: str = Field(..., description="Result message")
95class RoleAttributeMappingBatchResponse(BaseModel):
96 results: List[AttributeMappingResult] = Field(..., description="Individual attribute mapping results")
97 total_attributes: int = Field(..., description="Total number of attributes processed")
98 success_count: int = Field(..., description="Number of successfully processed attributes")
99 failed_count: int = Field(..., description="Number of failed attributes")
101class PermissionCheckRequest(BaseModel):
102 attributes: Optional[List[str]] = Field(
103 None,
104 min_items=1,
105 description="List of permission attributes to check. If not provided, returns all user permissions.",
106 example=["view-users", "manage-roles"]
107 )
109class PermissionCheckResponse(BaseModel):
110 permissions: Dict[str, bool] = Field(
111 ...,
112 description="Permission check results (attribute_name: has_permission)",
113 example={
114 "view-users": True,
115 "manage-users": False,
116 "view-roles": True,
117 "manage-roles": False
118 }
119 )
121 @classmethod
122 def get_example_response(cls):
123 return {
124 "code": 200,
125 "message": "User permissions retrieved",
126 "data": {
127 "permissions": {
128 "view-users": True,
129 "manage-users": False,
130 "view-roles": True,
131 "manage-roles": False
132 }
133 }
134 }
136role_attributes_success_response_example = {
137 "code": 200,
138 "message": "All role attributes processed successfully",
139 "data": {
140 "results": [
141 {
142 "attribute_id": "attr-001",
143 "status": "success",
144 "message": "Updated successfully"
145 },
146 {
147 "attribute_id": "attr-002",
148 "status": "success",
149 "message": "Updated successfully"
150 }
151 ],
152 "total_attributes": 2,
153 "success_count": 2,
154 "failed_count": 0
155 }
156}
158role_attributes_partial_response_example = {
159 "code": 207,
160 "message": "Role attributes processed with partial success",
161 "data": {
162 "results": [
163 {
164 "attribute_id": "attr-001",
165 "status": "success",
166 "message": "Updated successfully"
167 },
168 {
169 "attribute_id": "attr-002",
170 "status": "failed",
171 "message": "Invalid attribute ID"
172 }
173 ],
174 "total_attributes": 2,
175 "success_count": 1,
176 "failed_count": 1
177 }
178}
180role_attributes_failed_response_example = {
181 "code": 400,
182 "message": "All role attributes failed to process",
183 "data": {
184 "results": [
185 {
186 "attribute_id": "invalid-attr-001",
187 "status": "failed",
188 "message": "Invalid attribute ID"
189 },
190 {
191 "attribute_id": "invalid-attr-002",
192 "status": "failed",
193 "message": "Invalid attribute ID"
194 }
195 ],
196 "total_attributes": 2,
197 "success_count": 0,
198 "failed_count": 2
199 }
200}