authgebra 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1535 @@
1
+ """GENERATED by tools/generate.py from sdks/contracts/openapi.json - do not edit."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Mapping
6
+
7
+ from .._core import AsyncRequester
8
+ from .._core import path_with as _path
9
+ from .._model import request_body, typed_result
10
+ from . import models
11
+
12
+
13
+ class AttributesApi:
14
+ def __init__(self, client: AsyncRequester) -> None:
15
+ self._c = client
16
+
17
+ async def attributes_stats(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.AttributesStatsResponse:
18
+ """属性定义计数。
19
+
20
+ ``GET /api/v1/attributes/stats``
21
+ """
22
+ _sdk_result = await self._c.request(
23
+ "GET",
24
+ "/api/v1/attributes/stats",
25
+ request_id=request_id,
26
+ traceparent=traceparent,
27
+ )
28
+ return typed_result(_sdk_result, models.AttributesStatsResponse, '#/components/schemas/ApiResponse_AttributesStatsDto/properties/data')
29
+
30
+ async def create_attribute(self, *, body: models.CreateAttributeRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreateAttributeResponse:
31
+ """create attribute
32
+
33
+ ``POST /api/v1/attributes``
34
+ """
35
+ _sdk_result = await self._c.request(
36
+ "POST",
37
+ "/api/v1/attributes",
38
+ json=request_body(body),
39
+ idempotency_key=idempotency_key,
40
+ request_id=request_id,
41
+ traceparent=traceparent,
42
+ )
43
+ return typed_result(_sdk_result, models.CreateAttributeResponse, '#/components/schemas/ApiResponse_AttributeDto/properties/data')
44
+
45
+ async def delete_attribute(self, id: str, *, if_match: str, request_id: str | None = None, traceparent: str | None = None) -> models.DeleteAttributeResponse:
46
+ """delete attribute
47
+
48
+ ``DELETE /api/v1/attributes/{id}``
49
+ """
50
+ _sdk_result = await self._c.request(
51
+ "DELETE",
52
+ _path("/api/v1/attributes/{id}", id=id),
53
+ if_match=if_match,
54
+ request_id=request_id,
55
+ traceparent=traceparent,
56
+ )
57
+ return typed_result(_sdk_result, models.DeleteAttributeResponse, '#/components/schemas/ApiResponse_MutationAckDto/properties/data')
58
+
59
+ async def get_attribute(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetAttributeResponse:
60
+ """get attribute
61
+
62
+ ``GET /api/v1/attributes/{id}``
63
+ """
64
+ _sdk_result = await self._c.request(
65
+ "GET",
66
+ _path("/api/v1/attributes/{id}", id=id),
67
+ request_id=request_id,
68
+ traceparent=traceparent,
69
+ )
70
+ return typed_result(_sdk_result, models.GetAttributeResponse, '#/components/schemas/ApiResponse_AttributeDto/properties/data')
71
+
72
+ async def get_user_attributes(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetUserAttributesResponse:
73
+ """get user attributes
74
+
75
+ ``GET /api/v1/users/{id}/attributes``
76
+ """
77
+ _sdk_result = await self._c.request(
78
+ "GET",
79
+ _path("/api/v1/users/{id}/attributes", id=id),
80
+ request_id=request_id,
81
+ traceparent=traceparent,
82
+ )
83
+ return typed_result(_sdk_result, models.GetUserAttributesResponse, '#/components/schemas/ApiResponse_AttributesDto/properties/data')
84
+
85
+ async def list_attributes(self, *, cursor: str | None = None, limit: int | None = None, owner_type: str | None = None, value_type: str | None = None, q: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListAttributesResponse:
86
+ """list attributes
87
+
88
+ ``GET /api/v1/attributes``
89
+ """
90
+ _sdk_result = await self._c.request(
91
+ "GET",
92
+ "/api/v1/attributes",
93
+ query={"cursor": cursor, "limit": limit, "owner_type": owner_type, "value_type": value_type, "q": q},
94
+ request_id=request_id,
95
+ traceparent=traceparent,
96
+ )
97
+ return typed_result(_sdk_result, models.ListAttributesResponse, '#/components/schemas/PagedResponse_AttributeDto/properties/data')
98
+
99
+ async def patch_attribute(self, id: str, *, if_match: str, body: models.PatchAttributeRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.PatchAttributeResponse:
100
+ """patch attribute
101
+
102
+ ``PATCH /api/v1/attributes/{id}``
103
+ """
104
+ _sdk_result = await self._c.request(
105
+ "PATCH",
106
+ _path("/api/v1/attributes/{id}", id=id),
107
+ json=request_body(body),
108
+ if_match=if_match,
109
+ idempotency_key=idempotency_key,
110
+ request_id=request_id,
111
+ traceparent=traceparent,
112
+ )
113
+ return typed_result(_sdk_result, models.PatchAttributeResponse, '#/components/schemas/ApiResponse_AttributeDto/properties/data')
114
+
115
+ async def replace_user_attributes(self, id: str, *, if_match: str, body: models.ReplaceAttributesRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ReplaceUserAttributesResponse:
116
+ """replace user attributes
117
+
118
+ ``PUT /api/v1/users/{id}/attributes``
119
+ """
120
+ _sdk_result = await self._c.request(
121
+ "PUT",
122
+ _path("/api/v1/users/{id}/attributes", id=id),
123
+ json=request_body(body),
124
+ if_match=if_match,
125
+ idempotency_key=idempotency_key,
126
+ request_id=request_id,
127
+ traceparent=traceparent,
128
+ )
129
+ return typed_result(_sdk_result, models.ReplaceUserAttributesResponse, '#/components/schemas/ApiResponse_AttributesDto/properties/data')
130
+
131
+
132
+ class AuditApi:
133
+ def __init__(self, client: AsyncRequester) -> None:
134
+ self._c = client
135
+
136
+ async def audit_stats(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.AuditStatsResponse:
137
+ """审计今日计数。
138
+
139
+ ``GET /api/v1/audit/stats``
140
+ """
141
+ _sdk_result = await self._c.request(
142
+ "GET",
143
+ "/api/v1/audit/stats",
144
+ request_id=request_id,
145
+ traceparent=traceparent,
146
+ )
147
+ return typed_result(_sdk_result, models.AuditStatsResponse, '#/components/schemas/ApiResponse_AuditStatsDto/properties/data')
148
+
149
+ async def list_audit_events(self, *, cursor: str | None = None, limit: int | None = None, actor_user_id: str | None = None, action: str | None = None, target_type: str | None = None, target_id: str | None = None, result: str | None = None, from_: str | None = None, to: str | None = None, query_request_id: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListAuditEventsResponse:
150
+ """查询审计事件(分页、可筛选、metadata 已脱敏)。
151
+
152
+ ``GET /api/v1/audit``
153
+ """
154
+ _sdk_result = await self._c.request(
155
+ "GET",
156
+ "/api/v1/audit",
157
+ query={"cursor": cursor, "limit": limit, "actor_user_id": actor_user_id, "action": action, "target_type": target_type, "target_id": target_id, "result": result, "from": from_, "to": to, "request_id": query_request_id},
158
+ request_id=request_id,
159
+ traceparent=traceparent,
160
+ )
161
+ return typed_result(_sdk_result, models.ListAuditEventsResponse, '#/components/schemas/PagedResponse_AuditEventDto/properties/data')
162
+
163
+
164
+ class AuthApi:
165
+ def __init__(self, client: AsyncRequester) -> None:
166
+ self._c = client
167
+
168
+ async def change_password(self, *, body: models.ChangePasswordRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.ChangePasswordResponse:
169
+ """change password
170
+
171
+ ``POST /api/v1/auth/change-password``
172
+ """
173
+ _sdk_result = await self._c.request(
174
+ "POST",
175
+ "/api/v1/auth/change-password",
176
+ json=request_body(body),
177
+ request_id=request_id,
178
+ traceparent=traceparent,
179
+ )
180
+ return typed_result(_sdk_result, models.ChangePasswordResponse, '#/components/schemas/ApiResponse_AuthOkDto/properties/data')
181
+
182
+ async def list_sessions(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.ListSessionsResponse:
183
+ """list sessions
184
+
185
+ ``GET /api/v1/auth/sessions``
186
+ """
187
+ _sdk_result = await self._c.request(
188
+ "GET",
189
+ "/api/v1/auth/sessions",
190
+ request_id=request_id,
191
+ traceparent=traceparent,
192
+ )
193
+ return typed_result(_sdk_result, models.ListSessionsResponse, '#/components/schemas/ApiResponse_Vec_SessionDto/properties/data')
194
+
195
+ async def login(self, *, body: models.LoginRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.LoginOperationResponse:
196
+ """login
197
+
198
+ ``POST /api/v1/auth/login``
199
+ """
200
+ _sdk_result = await self._c.request(
201
+ "POST",
202
+ "/api/v1/auth/login",
203
+ json=request_body(body),
204
+ request_id=request_id,
205
+ traceparent=traceparent,
206
+ )
207
+ return typed_result(_sdk_result, models.LoginOperationResponse, '#/components/schemas/ApiResponse_LoginResponse/properties/data')
208
+
209
+ async def logout(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.LogoutResponse:
210
+ """logout
211
+
212
+ ``POST /api/v1/auth/logout``
213
+ """
214
+ _sdk_result = await self._c.request(
215
+ "POST",
216
+ "/api/v1/auth/logout",
217
+ request_id=request_id,
218
+ traceparent=traceparent,
219
+ )
220
+ return typed_result(_sdk_result, models.LogoutResponse, '#/components/schemas/ApiResponse_AuthOkDto/properties/data')
221
+
222
+ async def logout_all(self, *, body: models.LogoutAllRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.LogoutAllResponse:
223
+ """logout all
224
+
225
+ ``POST /api/v1/auth/logout-all``
226
+ """
227
+ _sdk_result = await self._c.request(
228
+ "POST",
229
+ "/api/v1/auth/logout-all",
230
+ json=request_body(body),
231
+ request_id=request_id,
232
+ traceparent=traceparent,
233
+ )
234
+ return typed_result(_sdk_result, models.LogoutAllResponse, '#/components/schemas/ApiResponse_AuthOkDto/properties/data')
235
+
236
+ async def me(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.MeOperationResponse:
237
+ """me
238
+
239
+ ``GET /api/v1/auth/me``
240
+ """
241
+ _sdk_result = await self._c.request(
242
+ "GET",
243
+ "/api/v1/auth/me",
244
+ request_id=request_id,
245
+ traceparent=traceparent,
246
+ )
247
+ return typed_result(_sdk_result, models.MeOperationResponse, '#/components/schemas/ApiResponse_MeResponse/properties/data')
248
+
249
+ async def mfa_disable(self, *, body: models.MfaDisableRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.MfaDisableResponse:
250
+ """mfa disable
251
+
252
+ ``DELETE /api/v1/auth/mfa``
253
+ """
254
+ _sdk_result = await self._c.request(
255
+ "DELETE",
256
+ "/api/v1/auth/mfa",
257
+ json=request_body(body),
258
+ request_id=request_id,
259
+ traceparent=traceparent,
260
+ )
261
+ return typed_result(_sdk_result, models.MfaDisableResponse, '#/components/schemas/ApiResponse_AuthOkDto/properties/data')
262
+
263
+ async def mfa_enroll(self, *, body: models.MfaEnrollRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.MfaEnrollOperationResponse:
264
+ """mfa enroll
265
+
266
+ ``POST /api/v1/auth/mfa/enroll``
267
+ """
268
+ _sdk_result = await self._c.request(
269
+ "POST",
270
+ "/api/v1/auth/mfa/enroll",
271
+ json=request_body(body),
272
+ request_id=request_id,
273
+ traceparent=traceparent,
274
+ )
275
+ return typed_result(_sdk_result, models.MfaEnrollOperationResponse, '#/components/schemas/ApiResponse_MfaEnrollResponse/properties/data')
276
+
277
+ async def mfa_enroll_verify(self, *, body: models.MfaEnrollVerifyRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.MfaEnrollVerifyResponse:
278
+ """mfa enroll verify
279
+
280
+ ``POST /api/v1/auth/mfa/enroll/verify``
281
+ """
282
+ _sdk_result = await self._c.request(
283
+ "POST",
284
+ "/api/v1/auth/mfa/enroll/verify",
285
+ json=request_body(body),
286
+ request_id=request_id,
287
+ traceparent=traceparent,
288
+ )
289
+ return typed_result(_sdk_result, models.MfaEnrollVerifyResponse, '#/components/schemas/ApiResponse_MfaRecoveryCodesResponse/properties/data')
290
+
291
+ async def mfa_enrollment_start(self, *, body: models.EnrollmentStartRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.MfaEnrollmentStartResponse:
292
+ """mfa enrollment start
293
+
294
+ ``POST /api/v1/auth/mfa/enrollment/start``
295
+ """
296
+ _sdk_result = await self._c.request(
297
+ "POST",
298
+ "/api/v1/auth/mfa/enrollment/start",
299
+ json=request_body(body),
300
+ request_id=request_id,
301
+ traceparent=traceparent,
302
+ )
303
+ return typed_result(_sdk_result, models.MfaEnrollmentStartResponse, '#/components/schemas/ApiResponse_EnrollmentStartResponse/properties/data')
304
+
305
+ async def mfa_enrollment_verify(self, *, body: models.EnrollmentVerifyRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.MfaEnrollmentVerifyResponse:
306
+ """mfa enrollment verify
307
+
308
+ ``POST /api/v1/auth/mfa/enrollment/verify``
309
+ """
310
+ _sdk_result = await self._c.request(
311
+ "POST",
312
+ "/api/v1/auth/mfa/enrollment/verify",
313
+ json=request_body(body),
314
+ request_id=request_id,
315
+ traceparent=traceparent,
316
+ )
317
+ return typed_result(_sdk_result, models.MfaEnrollmentVerifyResponse, '#/components/schemas/ApiResponse_EnrollmentVerifyResponse/properties/data')
318
+
319
+ async def mfa_recovery(self, *, body: models.MfaRecoveryRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.MfaRecoveryResponse:
320
+ """mfa recovery
321
+
322
+ ``POST /api/v1/auth/mfa/recovery``
323
+ """
324
+ _sdk_result = await self._c.request(
325
+ "POST",
326
+ "/api/v1/auth/mfa/recovery",
327
+ json=request_body(body),
328
+ request_id=request_id,
329
+ traceparent=traceparent,
330
+ )
331
+ return typed_result(_sdk_result, models.MfaRecoveryResponse, '#/components/schemas/ApiResponse_TokenPair/properties/data')
332
+
333
+ async def mfa_regenerate_recovery_codes(self, *, body: models.MfaRegenerateRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.MfaRegenerateRecoveryCodesResponse:
334
+ """mfa regenerate recovery codes
335
+
336
+ ``POST /api/v1/auth/mfa/recovery-codes/regenerate``
337
+ """
338
+ _sdk_result = await self._c.request(
339
+ "POST",
340
+ "/api/v1/auth/mfa/recovery-codes/regenerate",
341
+ json=request_body(body),
342
+ request_id=request_id,
343
+ traceparent=traceparent,
344
+ )
345
+ return typed_result(_sdk_result, models.MfaRegenerateRecoveryCodesResponse, '#/components/schemas/ApiResponse_MfaRecoveryCodesResponse/properties/data')
346
+
347
+ async def mfa_status(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.MfaStatusOperationResponse:
348
+ """mfa status
349
+
350
+ ``GET /api/v1/auth/mfa/status``
351
+ """
352
+ _sdk_result = await self._c.request(
353
+ "GET",
354
+ "/api/v1/auth/mfa/status",
355
+ request_id=request_id,
356
+ traceparent=traceparent,
357
+ )
358
+ return typed_result(_sdk_result, models.MfaStatusOperationResponse, '#/components/schemas/ApiResponse_MfaStatusResponse/properties/data')
359
+
360
+ async def mfa_verify(self, *, body: models.MfaVerifyRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.MfaVerifyResponse:
361
+ """mfa verify
362
+
363
+ ``POST /api/v1/auth/mfa/verify``
364
+ """
365
+ _sdk_result = await self._c.request(
366
+ "POST",
367
+ "/api/v1/auth/mfa/verify",
368
+ json=request_body(body),
369
+ request_id=request_id,
370
+ traceparent=traceparent,
371
+ )
372
+ return typed_result(_sdk_result, models.MfaVerifyResponse, '#/components/schemas/ApiResponse_TokenPair/properties/data')
373
+
374
+ async def refresh(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.RefreshResponse:
375
+ """refresh
376
+
377
+ ``POST /api/v1/auth/refresh``
378
+ """
379
+ _sdk_result = await self._c.request(
380
+ "POST",
381
+ "/api/v1/auth/refresh",
382
+ request_id=request_id,
383
+ traceparent=traceparent,
384
+ )
385
+ return typed_result(_sdk_result, models.RefreshResponse, '#/components/schemas/ApiResponse_TokenPair/properties/data')
386
+
387
+ async def revoke_session(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.RevokeSessionResponse:
388
+ """revoke session
389
+
390
+ ``DELETE /api/v1/auth/sessions/{id}``
391
+ """
392
+ _sdk_result = await self._c.request(
393
+ "DELETE",
394
+ _path("/api/v1/auth/sessions/{id}", id=id),
395
+ request_id=request_id,
396
+ traceparent=traceparent,
397
+ )
398
+ return typed_result(_sdk_result, models.RevokeSessionResponse, '#/components/schemas/ApiResponse_AuthOkDto/properties/data')
399
+
400
+
401
+ class AuthzApi:
402
+ def __init__(self, client: AsyncRequester) -> None:
403
+ self._c = client
404
+
405
+ async def batch_check(self, *, body: models.BatchCheckRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.BatchCheckOperationResponse:
406
+ """batch check
407
+
408
+ ``POST /api/v1/authz/batch-check``
409
+ """
410
+ _sdk_result = await self._c.request(
411
+ "POST",
412
+ "/api/v1/authz/batch-check",
413
+ json=request_body(body),
414
+ request_id=request_id,
415
+ traceparent=traceparent,
416
+ )
417
+ return typed_result(_sdk_result, models.BatchCheckOperationResponse, '#/components/schemas/ApiResponse_BatchCheckResponse/properties/data')
418
+
419
+ async def check(self, *, body: models.CheckRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.CheckOperationResponse:
420
+ """check
421
+
422
+ ``POST /api/v1/authz/check``
423
+ """
424
+ _sdk_result = await self._c.request(
425
+ "POST",
426
+ "/api/v1/authz/check",
427
+ json=request_body(body),
428
+ request_id=request_id,
429
+ traceparent=traceparent,
430
+ )
431
+ return typed_result(_sdk_result, models.CheckOperationResponse, '#/components/schemas/ApiResponse_CheckResponse/properties/data')
432
+
433
+ async def explain(self, *, body: models.ExplainRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.ExplainOperationResponse:
434
+ """explain
435
+
436
+ ``POST /api/v1/authz/explain``
437
+ """
438
+ _sdk_result = await self._c.request(
439
+ "POST",
440
+ "/api/v1/authz/explain",
441
+ json=request_body(body),
442
+ request_id=request_id,
443
+ traceparent=traceparent,
444
+ )
445
+ return typed_result(_sdk_result, models.ExplainOperationResponse, '#/components/schemas/ApiResponse_ExplainResponse/properties/data')
446
+
447
+ async def list_authorized_resources(self, *, body: models.ListResourcesRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.ListAuthorizedResourcesResponse:
448
+ """list authorized resources
449
+
450
+ ``POST /api/v1/authz/list-resources``
451
+ """
452
+ _sdk_result = await self._c.request(
453
+ "POST",
454
+ "/api/v1/authz/list-resources",
455
+ json=request_body(body),
456
+ request_id=request_id,
457
+ traceparent=traceparent,
458
+ )
459
+ return typed_result(_sdk_result, models.ListAuthorizedResourcesResponse, '#/components/schemas/PagedResponse_AuthzResourceRef/properties/data')
460
+
461
+ async def revision(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.RevisionOperationResponse:
462
+ """revision
463
+
464
+ ``GET /api/v1/authz/revision``
465
+ """
466
+ _sdk_result = await self._c.request(
467
+ "GET",
468
+ "/api/v1/authz/revision",
469
+ request_id=request_id,
470
+ traceparent=traceparent,
471
+ )
472
+ return typed_result(_sdk_result, models.RevisionOperationResponse, '#/components/schemas/ApiResponse_RevisionResponse/properties/data')
473
+
474
+
475
+ class DashboardApi:
476
+ def __init__(self, client: AsyncRequester) -> None:
477
+ self._c = client
478
+
479
+ async def dashboard_summary(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.DashboardSummaryResponse:
480
+ """控制台摘要。
481
+
482
+ ``GET /api/v1/dashboard/summary``
483
+ """
484
+ _sdk_result = await self._c.request(
485
+ "GET",
486
+ "/api/v1/dashboard/summary",
487
+ request_id=request_id,
488
+ traceparent=traceparent,
489
+ )
490
+ return typed_result(_sdk_result, models.DashboardSummaryResponse, '#/components/schemas/ApiResponse_DashboardSummaryDto/properties/data')
491
+
492
+
493
+ class HealthApi:
494
+ def __init__(self, client: AsyncRequester) -> None:
495
+ self._c = client
496
+
497
+ async def live(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.LiveOperationResponse:
498
+ """`GET /health/live`:只证明进程可响应,不触碰数据库。
499
+
500
+ ``GET /health/live``
501
+ """
502
+ _sdk_result = await self._c.request(
503
+ "GET",
504
+ "/health/live",
505
+ request_id=request_id,
506
+ traceparent=traceparent,
507
+ envelope=False,
508
+ )
509
+ return typed_result(_sdk_result, models.LiveOperationResponse, '#/components/schemas/LiveResponse')
510
+
511
+ async def ready(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.ReadyOperationResponse:
512
+ """`GET /health/ready`:全部检查通过才 200,否则 503 + `NOT_READY`。
513
+
514
+ ``GET /health/ready``
515
+ """
516
+ _sdk_result = await self._c.request(
517
+ "GET",
518
+ "/health/ready",
519
+ request_id=request_id,
520
+ traceparent=traceparent,
521
+ envelope=False,
522
+ )
523
+ return typed_result(_sdk_result, models.ReadyOperationResponse, '#/components/schemas/ReadyResponse')
524
+
525
+
526
+ class PermissionsApi:
527
+ def __init__(self, client: AsyncRequester) -> None:
528
+ self._c = client
529
+
530
+ async def create_permission(self, *, body: models.CreatePermissionRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreatePermissionResponse:
531
+ """创建权限点(`code` 由服务端按 `resource_type:action` 生成)。
532
+
533
+ ``POST /api/v1/permissions``
534
+ """
535
+ _sdk_result = await self._c.request(
536
+ "POST",
537
+ "/api/v1/permissions",
538
+ json=request_body(body),
539
+ idempotency_key=idempotency_key,
540
+ request_id=request_id,
541
+ traceparent=traceparent,
542
+ )
543
+ return typed_result(_sdk_result, models.CreatePermissionResponse, '#/components/schemas/ApiResponse_PermissionDto/properties/data')
544
+
545
+ async def deprecate_permission(self, id: str, *, if_match: str, idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.DeprecatePermissionResponse:
546
+ """弃用权限点(阻止新引用;不物理删除)。
547
+
548
+ ``POST /api/v1/permissions/{id}/deprecate``
549
+ """
550
+ _sdk_result = await self._c.request(
551
+ "POST",
552
+ _path("/api/v1/permissions/{id}/deprecate", id=id),
553
+ if_match=if_match,
554
+ idempotency_key=idempotency_key,
555
+ request_id=request_id,
556
+ traceparent=traceparent,
557
+ )
558
+ return typed_result(_sdk_result, models.DeprecatePermissionResponse, '#/components/schemas/ApiResponse_PermissionDto/properties/data')
559
+
560
+ async def get_permission(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetPermissionResponse:
561
+ """权限点详情(含引用计数)。
562
+
563
+ ``GET /api/v1/permissions/{id}``
564
+ """
565
+ _sdk_result = await self._c.request(
566
+ "GET",
567
+ _path("/api/v1/permissions/{id}", id=id),
568
+ request_id=request_id,
569
+ traceparent=traceparent,
570
+ )
571
+ return typed_result(_sdk_result, models.GetPermissionResponse, '#/components/schemas/ApiResponse_PermissionDto/properties/data')
572
+
573
+ async def list_permissions(self, *, cursor: str | None = None, limit: int | None = None, resource_type: str | None = None, action: str | None = None, q: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListPermissionsResponse:
574
+ """权限点分页。
575
+
576
+ ``GET /api/v1/permissions``
577
+ """
578
+ _sdk_result = await self._c.request(
579
+ "GET",
580
+ "/api/v1/permissions",
581
+ query={"cursor": cursor, "limit": limit, "resource_type": resource_type, "action": action, "q": q},
582
+ request_id=request_id,
583
+ traceparent=traceparent,
584
+ )
585
+ return typed_result(_sdk_result, models.ListPermissionsResponse, '#/components/schemas/PagedResponse_PermissionDto/properties/data')
586
+
587
+ async def undeprecate_permission(self, id: str, *, if_match: str, idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.UndeprecatePermissionResponse:
588
+ """取消弃用权限点(允许新增引用;保留既有引用)。
589
+
590
+ ``POST /api/v1/permissions/{id}/undeprecate``
591
+ """
592
+ _sdk_result = await self._c.request(
593
+ "POST",
594
+ _path("/api/v1/permissions/{id}/undeprecate", id=id),
595
+ if_match=if_match,
596
+ idempotency_key=idempotency_key,
597
+ request_id=request_id,
598
+ traceparent=traceparent,
599
+ )
600
+ return typed_result(_sdk_result, models.UndeprecatePermissionResponse, '#/components/schemas/ApiResponse_PermissionDto/properties/data')
601
+
602
+
603
+ class PoliciesApi:
604
+ def __init__(self, client: AsyncRequester) -> None:
605
+ self._c = client
606
+
607
+ async def compile_preview(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.CompilePreviewResponse:
608
+ """compile preview
609
+
610
+ ``POST /api/v1/policies/{id}/compile-preview``
611
+ """
612
+ _sdk_result = await self._c.request(
613
+ "POST",
614
+ _path("/api/v1/policies/{id}/compile-preview", id=id),
615
+ request_id=request_id,
616
+ traceparent=traceparent,
617
+ )
618
+ return typed_result(_sdk_result, models.CompilePreviewResponse, '#/components/schemas/ApiResponse_CompilePreviewDto/properties/data')
619
+
620
+ async def create_policy(self, *, body: models.CreatePolicyRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreatePolicyResponse:
621
+ """create policy
622
+
623
+ ``POST /api/v1/policies``
624
+ """
625
+ _sdk_result = await self._c.request(
626
+ "POST",
627
+ "/api/v1/policies",
628
+ json=request_body(body),
629
+ idempotency_key=idempotency_key,
630
+ request_id=request_id,
631
+ traceparent=traceparent,
632
+ )
633
+ return typed_result(_sdk_result, models.CreatePolicyResponse, '#/components/schemas/ApiResponse_PolicyDetailDto/properties/data')
634
+
635
+ async def delete_policy(self, id: str, *, if_match: str, idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.DeletePolicyResponse:
636
+ """delete policy
637
+
638
+ ``DELETE /api/v1/policies/{id}``
639
+ """
640
+ _sdk_result = await self._c.request(
641
+ "DELETE",
642
+ _path("/api/v1/policies/{id}", id=id),
643
+ if_match=if_match,
644
+ idempotency_key=idempotency_key,
645
+ request_id=request_id,
646
+ traceparent=traceparent,
647
+ )
648
+ return typed_result(_sdk_result, models.DeletePolicyResponse, '#/components/schemas/ApiResponse_MutationAckDto/properties/data')
649
+
650
+ async def disable_policy(self, id: str, *, if_match: str, idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.DisablePolicyResponse:
651
+ """disable policy
652
+
653
+ ``POST /api/v1/policies/{id}/disable``
654
+ """
655
+ _sdk_result = await self._c.request(
656
+ "POST",
657
+ _path("/api/v1/policies/{id}/disable", id=id),
658
+ if_match=if_match,
659
+ idempotency_key=idempotency_key,
660
+ request_id=request_id,
661
+ traceparent=traceparent,
662
+ )
663
+ return typed_result(_sdk_result, models.DisablePolicyResponse, '#/components/schemas/ApiResponse_PolicyDto/properties/data')
664
+
665
+ async def get_policy(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetPolicyResponse:
666
+ """get policy
667
+
668
+ ``GET /api/v1/policies/{id}``
669
+ """
670
+ _sdk_result = await self._c.request(
671
+ "GET",
672
+ _path("/api/v1/policies/{id}", id=id),
673
+ request_id=request_id,
674
+ traceparent=traceparent,
675
+ )
676
+ return typed_result(_sdk_result, models.GetPolicyResponse, '#/components/schemas/ApiResponse_PolicyDetailDto/properties/data')
677
+
678
+ async def impact_preview(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.ImpactPreviewResponse:
679
+ """impact preview
680
+
681
+ ``POST /api/v1/policies/{id}/impact-preview``
682
+ """
683
+ _sdk_result = await self._c.request(
684
+ "POST",
685
+ _path("/api/v1/policies/{id}/impact-preview", id=id),
686
+ request_id=request_id,
687
+ traceparent=traceparent,
688
+ )
689
+ return typed_result(_sdk_result, models.ImpactPreviewResponse, '#/components/schemas/ApiResponse_ImpactPreviewDto/properties/data')
690
+
691
+ async def list_policies(self, *, cursor: str | None = None, limit: int | None = None, lifecycle: str | None = None, q: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListPoliciesResponse:
692
+ """list policies
693
+
694
+ ``GET /api/v1/policies``
695
+ """
696
+ _sdk_result = await self._c.request(
697
+ "GET",
698
+ "/api/v1/policies",
699
+ query={"cursor": cursor, "limit": limit, "lifecycle": lifecycle, "q": q},
700
+ request_id=request_id,
701
+ traceparent=traceparent,
702
+ )
703
+ return typed_result(_sdk_result, models.ListPoliciesResponse, '#/components/schemas/PagedResponse_PolicyDto/properties/data')
704
+
705
+ async def list_policy_tests(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.ListPolicyTestsResponse:
706
+ """list policy tests
707
+
708
+ ``GET /api/v1/policies/{id}/tests``
709
+ """
710
+ _sdk_result = await self._c.request(
711
+ "GET",
712
+ _path("/api/v1/policies/{id}/tests", id=id),
713
+ request_id=request_id,
714
+ traceparent=traceparent,
715
+ )
716
+ return typed_result(_sdk_result, models.ListPolicyTestsResponse, '#/components/schemas/ApiResponse_Vec_PolicyTestCaseDto/properties/data')
717
+
718
+ async def patch_policy(self, id: str, *, if_match: str, body: models.PatchPolicyRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.PatchPolicyResponse:
719
+ """patch policy
720
+
721
+ ``PATCH /api/v1/policies/{id}``
722
+ """
723
+ _sdk_result = await self._c.request(
724
+ "PATCH",
725
+ _path("/api/v1/policies/{id}", id=id),
726
+ json=request_body(body),
727
+ if_match=if_match,
728
+ idempotency_key=idempotency_key,
729
+ request_id=request_id,
730
+ traceparent=traceparent,
731
+ )
732
+ return typed_result(_sdk_result, models.PatchPolicyResponse, '#/components/schemas/ApiResponse_PolicyDetailDto/properties/data')
733
+
734
+ async def policies_stats(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.PoliciesStatsResponse:
735
+ """策略计数。
736
+
737
+ ``GET /api/v1/policies/stats``
738
+ """
739
+ _sdk_result = await self._c.request(
740
+ "GET",
741
+ "/api/v1/policies/stats",
742
+ request_id=request_id,
743
+ traceparent=traceparent,
744
+ )
745
+ return typed_result(_sdk_result, models.PoliciesStatsResponse, '#/components/schemas/ApiResponse_PoliciesStatsDto/properties/data')
746
+
747
+ async def publish_policy(self, id: str, *, if_match: str, body: models.PublishPolicyRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.PublishPolicyResponse:
748
+ """publish policy
749
+
750
+ ``POST /api/v1/policies/{id}/publish``
751
+ """
752
+ _sdk_result = await self._c.request(
753
+ "POST",
754
+ _path("/api/v1/policies/{id}/publish", id=id),
755
+ json=request_body(body),
756
+ if_match=if_match,
757
+ idempotency_key=idempotency_key,
758
+ request_id=request_id,
759
+ traceparent=traceparent,
760
+ )
761
+ return typed_result(_sdk_result, models.PublishPolicyResponse, '#/components/schemas/ApiResponse_PublishPolicyResultDto/properties/data')
762
+
763
+ async def upsert_policy_test(self, id: str, *, if_match: str, body: models.UpsertPolicyTestCaseRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.UpsertPolicyTestResponse:
764
+ """upsert policy test
765
+
766
+ ``POST /api/v1/policies/{id}/tests``
767
+ """
768
+ _sdk_result = await self._c.request(
769
+ "POST",
770
+ _path("/api/v1/policies/{id}/tests", id=id),
771
+ json=request_body(body),
772
+ if_match=if_match,
773
+ idempotency_key=idempotency_key,
774
+ request_id=request_id,
775
+ traceparent=traceparent,
776
+ )
777
+ return typed_result(_sdk_result, models.UpsertPolicyTestResponse, '#/components/schemas/ApiResponse_PolicyTestCaseWriteDto/properties/data')
778
+
779
+ async def validate_expression(self, *, body: models.ValidatePolicyRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.ValidateExpressionResponse:
780
+ """validate expression
781
+
782
+ ``POST /api/v1/policies/validate``
783
+ """
784
+ _sdk_result = await self._c.request(
785
+ "POST",
786
+ "/api/v1/policies/validate",
787
+ json=request_body(body),
788
+ request_id=request_id,
789
+ traceparent=traceparent,
790
+ )
791
+ return typed_result(_sdk_result, models.ValidateExpressionResponse, '#/components/schemas/ApiResponse_PolicyValidationDto/properties/data')
792
+
793
+ async def validate_policy(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.ValidatePolicyResponse:
794
+ """validate policy
795
+
796
+ ``POST /api/v1/policies/{id}/validate``
797
+ """
798
+ _sdk_result = await self._c.request(
799
+ "POST",
800
+ _path("/api/v1/policies/{id}/validate", id=id),
801
+ request_id=request_id,
802
+ traceparent=traceparent,
803
+ )
804
+ return typed_result(_sdk_result, models.ValidatePolicyResponse, '#/components/schemas/ApiResponse_PolicyValidationDto/properties/data')
805
+
806
+
807
+ class PolicyBindingsApi:
808
+ def __init__(self, client: AsyncRequester) -> None:
809
+ self._c = client
810
+
811
+ async def create_policy_binding(self, *, body: models.CreatePolicyBindingRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreatePolicyBindingResponse:
812
+ """create policy binding
813
+
814
+ ``POST /api/v1/policy-bindings``
815
+ """
816
+ _sdk_result = await self._c.request(
817
+ "POST",
818
+ "/api/v1/policy-bindings",
819
+ json=request_body(body),
820
+ idempotency_key=idempotency_key,
821
+ request_id=request_id,
822
+ traceparent=traceparent,
823
+ )
824
+ return typed_result(_sdk_result, models.CreatePolicyBindingResponse, '#/components/schemas/ApiResponse_PolicyBindingDto/properties/data')
825
+
826
+ async def delete_policy_binding(self, id: str, *, if_match: str, request_id: str | None = None, traceparent: str | None = None) -> models.DeletePolicyBindingResponse:
827
+ """delete policy binding
828
+
829
+ ``DELETE /api/v1/policy-bindings/{id}``
830
+ """
831
+ _sdk_result = await self._c.request(
832
+ "DELETE",
833
+ _path("/api/v1/policy-bindings/{id}", id=id),
834
+ if_match=if_match,
835
+ request_id=request_id,
836
+ traceparent=traceparent,
837
+ )
838
+ return typed_result(_sdk_result, models.DeletePolicyBindingResponse, '#/components/schemas/ApiResponse_MutationAckDto/properties/data')
839
+
840
+ async def list_policy_bindings(self, *, cursor: str | None = None, limit: int | None = None, policy_id: str | None = None, resource_type: str | None = None, permission: str | None = None, enabled: bool | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListPolicyBindingsResponse:
841
+ """list policy bindings
842
+
843
+ ``GET /api/v1/policy-bindings``
844
+ """
845
+ _sdk_result = await self._c.request(
846
+ "GET",
847
+ "/api/v1/policy-bindings",
848
+ query={"cursor": cursor, "limit": limit, "policy_id": policy_id, "resource_type": resource_type, "permission": permission, "enabled": enabled},
849
+ request_id=request_id,
850
+ traceparent=traceparent,
851
+ )
852
+ return typed_result(_sdk_result, models.ListPolicyBindingsResponse, '#/components/schemas/PagedResponse_PolicyBindingDto/properties/data')
853
+
854
+ async def patch_policy_binding(self, id: str, *, if_match: str, body: models.PatchPolicyBindingRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.PatchPolicyBindingResponse:
855
+ """patch policy binding
856
+
857
+ ``PATCH /api/v1/policy-bindings/{id}``
858
+ """
859
+ _sdk_result = await self._c.request(
860
+ "PATCH",
861
+ _path("/api/v1/policy-bindings/{id}", id=id),
862
+ json=request_body(body),
863
+ if_match=if_match,
864
+ request_id=request_id,
865
+ traceparent=traceparent,
866
+ )
867
+ return typed_result(_sdk_result, models.PatchPolicyBindingResponse, '#/components/schemas/ApiResponse_PolicyBindingDto/properties/data')
868
+
869
+ async def policy_bindings_stats(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.PolicyBindingsStatsResponse:
870
+ """Binding 计数。
871
+
872
+ ``GET /api/v1/policy-bindings/stats``
873
+ """
874
+ _sdk_result = await self._c.request(
875
+ "GET",
876
+ "/api/v1/policy-bindings/stats",
877
+ request_id=request_id,
878
+ traceparent=traceparent,
879
+ )
880
+ return typed_result(_sdk_result, models.PolicyBindingsStatsResponse, '#/components/schemas/ApiResponse_BindingsStatsDto/properties/data')
881
+
882
+
883
+ class RelationDefinitionsApi:
884
+ def __init__(self, client: AsyncRequester) -> None:
885
+ self._c = client
886
+
887
+ async def create_relation_definition(self, *, body: models.CreateRelationDefinitionRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreateRelationDefinitionResponse:
888
+ """create relation definition
889
+
890
+ ``POST /api/v1/relation-definitions``
891
+ """
892
+ _sdk_result = await self._c.request(
893
+ "POST",
894
+ "/api/v1/relation-definitions",
895
+ json=request_body(body),
896
+ idempotency_key=idempotency_key,
897
+ request_id=request_id,
898
+ traceparent=traceparent,
899
+ )
900
+ return typed_result(_sdk_result, models.CreateRelationDefinitionResponse, '#/components/schemas/ApiResponse_RelationDefinitionDto/properties/data')
901
+
902
+ async def delete_relation_definition(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.DeleteRelationDefinitionResponse:
903
+ """delete relation definition
904
+
905
+ ``DELETE /api/v1/relation-definitions/{id}``
906
+ """
907
+ _sdk_result = await self._c.request(
908
+ "DELETE",
909
+ _path("/api/v1/relation-definitions/{id}", id=id),
910
+ request_id=request_id,
911
+ traceparent=traceparent,
912
+ )
913
+ return typed_result(_sdk_result, models.DeleteRelationDefinitionResponse, '#/components/schemas/ApiResponse_MutationAckDto/properties/data')
914
+
915
+ async def list_relation_definitions(self, *, cursor: str | None = None, limit: int | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListRelationDefinitionsResponse:
916
+ """list relation definitions
917
+
918
+ ``GET /api/v1/relation-definitions``
919
+ """
920
+ _sdk_result = await self._c.request(
921
+ "GET",
922
+ "/api/v1/relation-definitions",
923
+ query={"cursor": cursor, "limit": limit},
924
+ request_id=request_id,
925
+ traceparent=traceparent,
926
+ )
927
+ return typed_result(_sdk_result, models.ListRelationDefinitionsResponse, '#/components/schemas/PagedResponse_RelationDefinitionDto/properties/data')
928
+
929
+
930
+ class RelationTuplesApi:
931
+ def __init__(self, client: AsyncRequester) -> None:
932
+ self._c = client
933
+
934
+ async def create_relation_tuple(self, *, body: models.CreateRelationTupleRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreateRelationTupleResponse:
935
+ """create relation tuple
936
+
937
+ ``POST /api/v1/relation-tuples``
938
+ """
939
+ _sdk_result = await self._c.request(
940
+ "POST",
941
+ "/api/v1/relation-tuples",
942
+ json=request_body(body),
943
+ idempotency_key=idempotency_key,
944
+ request_id=request_id,
945
+ traceparent=traceparent,
946
+ )
947
+ return typed_result(_sdk_result, models.CreateRelationTupleResponse, '#/components/schemas/ApiResponse_RelationTupleDto/properties/data')
948
+
949
+ async def delete_relation_tuple(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.DeleteRelationTupleResponse:
950
+ """delete relation tuple
951
+
952
+ ``DELETE /api/v1/relation-tuples/{id}``
953
+ """
954
+ _sdk_result = await self._c.request(
955
+ "DELETE",
956
+ _path("/api/v1/relation-tuples/{id}", id=id),
957
+ request_id=request_id,
958
+ traceparent=traceparent,
959
+ )
960
+ return typed_result(_sdk_result, models.DeleteRelationTupleResponse, '#/components/schemas/ApiResponse_MutationAckDto/properties/data')
961
+
962
+ async def list_relation_tuples(self, *, subject_type: str | None = None, subject_id: str | None = None, relation: str | None = None, object_type: str | None = None, object_id: str | None = None, cursor: str | None = None, limit: int | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListRelationTuplesResponse:
963
+ """list relation tuples
964
+
965
+ ``GET /api/v1/relation-tuples``
966
+ """
967
+ _sdk_result = await self._c.request(
968
+ "GET",
969
+ "/api/v1/relation-tuples",
970
+ query={"subject_type": subject_type, "subject_id": subject_id, "relation": relation, "object_type": object_type, "object_id": object_id, "cursor": cursor, "limit": limit},
971
+ request_id=request_id,
972
+ traceparent=traceparent,
973
+ )
974
+ return typed_result(_sdk_result, models.ListRelationTuplesResponse, '#/components/schemas/PagedResponse_RelationTupleDto/properties/data')
975
+
976
+
977
+ class ResourceTypesApi:
978
+ def __init__(self, client: AsyncRequester) -> None:
979
+ self._c = client
980
+
981
+ async def create_resource_type(self, *, body: models.CreateResourceTypeRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreateResourceTypeResponse:
982
+ """create resource type
983
+
984
+ ``POST /api/v1/resource-types``
985
+ """
986
+ _sdk_result = await self._c.request(
987
+ "POST",
988
+ "/api/v1/resource-types",
989
+ json=request_body(body),
990
+ idempotency_key=idempotency_key,
991
+ request_id=request_id,
992
+ traceparent=traceparent,
993
+ )
994
+ return typed_result(_sdk_result, models.CreateResourceTypeResponse, '#/components/schemas/ApiResponse_ResourceTypeDto/properties/data')
995
+
996
+ async def get_resource_type(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetResourceTypeResponse:
997
+ """get resource type
998
+
999
+ ``GET /api/v1/resource-types/{id}``
1000
+ """
1001
+ _sdk_result = await self._c.request(
1002
+ "GET",
1003
+ _path("/api/v1/resource-types/{id}", id=id),
1004
+ request_id=request_id,
1005
+ traceparent=traceparent,
1006
+ )
1007
+ return typed_result(_sdk_result, models.GetResourceTypeResponse, '#/components/schemas/ApiResponse_ResourceTypeDto/properties/data')
1008
+
1009
+ async def list_resource_types(self, *, cursor: str | None = None, limit: int | None = None, q: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListResourceTypesResponse:
1010
+ """list resource types
1011
+
1012
+ ``GET /api/v1/resource-types``
1013
+ """
1014
+ _sdk_result = await self._c.request(
1015
+ "GET",
1016
+ "/api/v1/resource-types",
1017
+ query={"cursor": cursor, "limit": limit, "q": q},
1018
+ request_id=request_id,
1019
+ traceparent=traceparent,
1020
+ )
1021
+ return typed_result(_sdk_result, models.ListResourceTypesResponse, '#/components/schemas/PagedResponse_ResourceTypeDto/properties/data')
1022
+
1023
+ async def patch_resource_type(self, id: str, *, if_match: str, body: models.PatchResourceTypeRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.PatchResourceTypeResponse:
1024
+ """patch resource type
1025
+
1026
+ ``PATCH /api/v1/resource-types/{id}``
1027
+ """
1028
+ _sdk_result = await self._c.request(
1029
+ "PATCH",
1030
+ _path("/api/v1/resource-types/{id}", id=id),
1031
+ json=request_body(body),
1032
+ if_match=if_match,
1033
+ idempotency_key=idempotency_key,
1034
+ request_id=request_id,
1035
+ traceparent=traceparent,
1036
+ )
1037
+ return typed_result(_sdk_result, models.PatchResourceTypeResponse, '#/components/schemas/ApiResponse_ResourceTypeDto/properties/data')
1038
+
1039
+ async def resource_types_stats(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.ResourceTypesStatsResponse:
1040
+ """资源类型计数。
1041
+
1042
+ ``GET /api/v1/resource-types/stats``
1043
+ """
1044
+ _sdk_result = await self._c.request(
1045
+ "GET",
1046
+ "/api/v1/resource-types/stats",
1047
+ request_id=request_id,
1048
+ traceparent=traceparent,
1049
+ )
1050
+ return typed_result(_sdk_result, models.ResourceTypesStatsResponse, '#/components/schemas/ApiResponse_ResourceTypesStatsDto/properties/data')
1051
+
1052
+
1053
+ class ResourcesApi:
1054
+ def __init__(self, client: AsyncRequester) -> None:
1055
+ self._c = client
1056
+
1057
+ async def create_resource(self, *, body: models.CreateResourceRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreateResourceResponse:
1058
+ """create resource
1059
+
1060
+ ``POST /api/v1/resources``
1061
+ """
1062
+ _sdk_result = await self._c.request(
1063
+ "POST",
1064
+ "/api/v1/resources",
1065
+ json=request_body(body),
1066
+ idempotency_key=idempotency_key,
1067
+ request_id=request_id,
1068
+ traceparent=traceparent,
1069
+ )
1070
+ return typed_result(_sdk_result, models.CreateResourceResponse, '#/components/schemas/ApiResponse_ResourceDto/properties/data')
1071
+
1072
+ async def delete_resource(self, id: str, *, if_match: str, request_id: str | None = None, traceparent: str | None = None) -> models.DeleteResourceResponse:
1073
+ """delete resource
1074
+
1075
+ ``DELETE /api/v1/resources/{id}``
1076
+ """
1077
+ _sdk_result = await self._c.request(
1078
+ "DELETE",
1079
+ _path("/api/v1/resources/{id}", id=id),
1080
+ if_match=if_match,
1081
+ request_id=request_id,
1082
+ traceparent=traceparent,
1083
+ )
1084
+ return typed_result(_sdk_result, models.DeleteResourceResponse, '#/components/schemas/ApiResponse_MutationAckDto/properties/data')
1085
+
1086
+ async def get_resource(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetResourceResponse:
1087
+ """get resource
1088
+
1089
+ ``GET /api/v1/resources/{id}``
1090
+ """
1091
+ _sdk_result = await self._c.request(
1092
+ "GET",
1093
+ _path("/api/v1/resources/{id}", id=id),
1094
+ request_id=request_id,
1095
+ traceparent=traceparent,
1096
+ )
1097
+ return typed_result(_sdk_result, models.GetResourceResponse, '#/components/schemas/ApiResponse_ResourceDto/properties/data')
1098
+
1099
+ async def get_resource_attributes(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetResourceAttributesResponse:
1100
+ """get resource attributes
1101
+
1102
+ ``GET /api/v1/resources/{id}/attributes``
1103
+ """
1104
+ _sdk_result = await self._c.request(
1105
+ "GET",
1106
+ _path("/api/v1/resources/{id}/attributes", id=id),
1107
+ request_id=request_id,
1108
+ traceparent=traceparent,
1109
+ )
1110
+ return typed_result(_sdk_result, models.GetResourceAttributesResponse, '#/components/schemas/ApiResponse_AttributesDto/properties/data')
1111
+
1112
+ async def list_resources(self, *, cursor: str | None = None, limit: int | None = None, resource_type: str | None = None, status: str | None = None, q: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListResourcesResponse:
1113
+ """list resources
1114
+
1115
+ ``GET /api/v1/resources``
1116
+ """
1117
+ _sdk_result = await self._c.request(
1118
+ "GET",
1119
+ "/api/v1/resources",
1120
+ query={"cursor": cursor, "limit": limit, "resource_type": resource_type, "status": status, "q": q},
1121
+ request_id=request_id,
1122
+ traceparent=traceparent,
1123
+ )
1124
+ return typed_result(_sdk_result, models.ListResourcesResponse, '#/components/schemas/PagedResponse_ResourceDto/properties/data')
1125
+
1126
+ async def patch_resource(self, id: str, *, if_match: str, body: models.PatchResourceRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.PatchResourceResponse:
1127
+ """patch resource
1128
+
1129
+ ``PATCH /api/v1/resources/{id}``
1130
+ """
1131
+ _sdk_result = await self._c.request(
1132
+ "PATCH",
1133
+ _path("/api/v1/resources/{id}", id=id),
1134
+ json=request_body(body),
1135
+ if_match=if_match,
1136
+ idempotency_key=idempotency_key,
1137
+ request_id=request_id,
1138
+ traceparent=traceparent,
1139
+ )
1140
+ return typed_result(_sdk_result, models.PatchResourceResponse, '#/components/schemas/ApiResponse_ResourceDto/properties/data')
1141
+
1142
+ async def replace_resource_attributes(self, id: str, *, if_match: str, body: models.ReplaceAttributesRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ReplaceResourceAttributesResponse:
1143
+ """replace resource attributes
1144
+
1145
+ ``PUT /api/v1/resources/{id}/attributes``
1146
+ """
1147
+ _sdk_result = await self._c.request(
1148
+ "PUT",
1149
+ _path("/api/v1/resources/{id}/attributes", id=id),
1150
+ json=request_body(body),
1151
+ if_match=if_match,
1152
+ idempotency_key=idempotency_key,
1153
+ request_id=request_id,
1154
+ traceparent=traceparent,
1155
+ )
1156
+ return typed_result(_sdk_result, models.ReplaceResourceAttributesResponse, '#/components/schemas/ApiResponse_AttributesDto/properties/data')
1157
+
1158
+ async def resources_stats(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.ResourcesStatsResponse:
1159
+ """资源计数。
1160
+
1161
+ ``GET /api/v1/resources/stats``
1162
+ """
1163
+ _sdk_result = await self._c.request(
1164
+ "GET",
1165
+ "/api/v1/resources/stats",
1166
+ request_id=request_id,
1167
+ traceparent=traceparent,
1168
+ )
1169
+ return typed_result(_sdk_result, models.ResourcesStatsResponse, '#/components/schemas/ApiResponse_ResourcesStatsDto/properties/data')
1170
+
1171
+
1172
+ class RolesApi:
1173
+ def __init__(self, client: AsyncRequester) -> None:
1174
+ self._c = client
1175
+
1176
+ async def create_role(self, *, body: models.CreateRoleRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreateRoleResponse:
1177
+ """创建角色。
1178
+
1179
+ ``POST /api/v1/roles``
1180
+ """
1181
+ _sdk_result = await self._c.request(
1182
+ "POST",
1183
+ "/api/v1/roles",
1184
+ json=request_body(body),
1185
+ idempotency_key=idempotency_key,
1186
+ request_id=request_id,
1187
+ traceparent=traceparent,
1188
+ )
1189
+ return typed_result(_sdk_result, models.CreateRoleResponse, '#/components/schemas/ApiResponse_RoleDto/properties/data')
1190
+
1191
+ async def delete_role(self, id: str, *, if_match: str, request_id: str | None = None, traceparent: str | None = None) -> models.DeleteRoleResponse:
1192
+ """删除角色(有成员或系统角色时 409,不级联)。
1193
+
1194
+ ``DELETE /api/v1/roles/{id}``
1195
+ """
1196
+ _sdk_result = await self._c.request(
1197
+ "DELETE",
1198
+ _path("/api/v1/roles/{id}", id=id),
1199
+ if_match=if_match,
1200
+ request_id=request_id,
1201
+ traceparent=traceparent,
1202
+ )
1203
+ return typed_result(_sdk_result, models.DeleteRoleResponse, '#/components/schemas/ApiResponse_MutationAckDto/properties/data')
1204
+
1205
+ async def get_role(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetRoleResponse:
1206
+ """角色详情。
1207
+
1208
+ ``GET /api/v1/roles/{id}``
1209
+ """
1210
+ _sdk_result = await self._c.request(
1211
+ "GET",
1212
+ _path("/api/v1/roles/{id}", id=id),
1213
+ request_id=request_id,
1214
+ traceparent=traceparent,
1215
+ )
1216
+ return typed_result(_sdk_result, models.GetRoleResponse, '#/components/schemas/ApiResponse_RoleDto/properties/data')
1217
+
1218
+ async def get_role_permissions(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetRolePermissionsResponse:
1219
+ """角色权限集合。
1220
+
1221
+ ``GET /api/v1/roles/{id}/permissions``
1222
+ """
1223
+ _sdk_result = await self._c.request(
1224
+ "GET",
1225
+ _path("/api/v1/roles/{id}/permissions", id=id),
1226
+ request_id=request_id,
1227
+ traceparent=traceparent,
1228
+ )
1229
+ return typed_result(_sdk_result, models.GetRolePermissionsResponse, '#/components/schemas/ApiResponse_RolePermissionsDto/properties/data')
1230
+
1231
+ async def list_roles(self, *, cursor: str | None = None, limit: int | None = None, q: str | None = None, enabled: bool | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListRolesResponse:
1232
+ """角色分页。
1233
+
1234
+ ``GET /api/v1/roles``
1235
+ """
1236
+ _sdk_result = await self._c.request(
1237
+ "GET",
1238
+ "/api/v1/roles",
1239
+ query={"cursor": cursor, "limit": limit, "q": q, "enabled": enabled},
1240
+ request_id=request_id,
1241
+ traceparent=traceparent,
1242
+ )
1243
+ return typed_result(_sdk_result, models.ListRolesResponse, '#/components/schemas/PagedResponse_RoleDto/properties/data')
1244
+
1245
+ async def patch_role(self, id: str, *, if_match: str, body: models.PatchRoleRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.PatchRoleResponse:
1246
+ """更新角色(`code` / `is_system` 不可变)。
1247
+
1248
+ ``PATCH /api/v1/roles/{id}``
1249
+ """
1250
+ _sdk_result = await self._c.request(
1251
+ "PATCH",
1252
+ _path("/api/v1/roles/{id}", id=id),
1253
+ json=request_body(body),
1254
+ if_match=if_match,
1255
+ idempotency_key=idempotency_key,
1256
+ request_id=request_id,
1257
+ traceparent=traceparent,
1258
+ )
1259
+ return typed_result(_sdk_result, models.PatchRoleResponse, '#/components/schemas/ApiResponse_RoleDto/properties/data')
1260
+
1261
+ async def replace_role_permissions(self, id: str, *, if_match: str, body: models.ReplaceRolePermissionsRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ReplaceRolePermissionsResponse:
1262
+ """全量替换角色权限(exact set)。
1263
+
1264
+ ``PUT /api/v1/roles/{id}/permissions``
1265
+ """
1266
+ _sdk_result = await self._c.request(
1267
+ "PUT",
1268
+ _path("/api/v1/roles/{id}/permissions", id=id),
1269
+ json=request_body(body),
1270
+ if_match=if_match,
1271
+ idempotency_key=idempotency_key,
1272
+ request_id=request_id,
1273
+ traceparent=traceparent,
1274
+ )
1275
+ return typed_result(_sdk_result, models.ReplaceRolePermissionsResponse, '#/components/schemas/ApiResponse_RolePermissionsDto/properties/data')
1276
+
1277
+ async def roles_stats(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.RolesStatsResponse:
1278
+ """角色计数。
1279
+
1280
+ ``GET /api/v1/roles/stats``
1281
+ """
1282
+ _sdk_result = await self._c.request(
1283
+ "GET",
1284
+ "/api/v1/roles/stats",
1285
+ request_id=request_id,
1286
+ traceparent=traceparent,
1287
+ )
1288
+ return typed_result(_sdk_result, models.RolesStatsResponse, '#/components/schemas/ApiResponse_RolesStatsDto/properties/data')
1289
+
1290
+
1291
+ class SetupApi:
1292
+ def __init__(self, client: AsyncRequester) -> None:
1293
+ self._c = client
1294
+
1295
+ async def create_admin(self, *, body: models.SetupAdminRequest | Mapping[str, object], request_id: str | None = None, traceparent: str | None = None) -> models.CreateAdminResponse:
1296
+ """`POST /api/v1/setup/admin`。
1297
+
1298
+ ``POST /api/v1/setup/admin``
1299
+ """
1300
+ _sdk_result = await self._c.request(
1301
+ "POST",
1302
+ "/api/v1/setup/admin",
1303
+ json=request_body(body),
1304
+ request_id=request_id,
1305
+ traceparent=traceparent,
1306
+ envelope=False,
1307
+ )
1308
+ return typed_result(_sdk_result, models.CreateAdminResponse, '#/components/schemas/SetupAdminDto')
1309
+
1310
+ async def setup_state(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.SetupStateResponse:
1311
+ """`GET /api/v1/setup/admin`。
1312
+
1313
+ ``GET /api/v1/setup/admin``
1314
+ """
1315
+ _sdk_result = await self._c.request(
1316
+ "GET",
1317
+ "/api/v1/setup/admin",
1318
+ request_id=request_id,
1319
+ traceparent=traceparent,
1320
+ envelope=False,
1321
+ )
1322
+ return typed_result(_sdk_result, models.SetupStateResponse, '#/components/schemas/SetupStatusDto')
1323
+
1324
+
1325
+ class UsersApi:
1326
+ def __init__(self, client: AsyncRequester) -> None:
1327
+ self._c = client
1328
+
1329
+ async def create_user(self, *, body: models.CreateUserRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.CreateUserResponse:
1330
+ """创建用户(Argon2id 散列;可带 `Idempotency-Key`)。
1331
+
1332
+ ``POST /api/v1/users``
1333
+ """
1334
+ _sdk_result = await self._c.request(
1335
+ "POST",
1336
+ "/api/v1/users",
1337
+ json=request_body(body),
1338
+ idempotency_key=idempotency_key,
1339
+ request_id=request_id,
1340
+ traceparent=traceparent,
1341
+ )
1342
+ return typed_result(_sdk_result, models.CreateUserResponse, '#/components/schemas/ApiResponse_UserDto/properties/data')
1343
+
1344
+ async def disable_user(self, id: str, *, if_match: str, request_id: str | None = None, traceparent: str | None = None) -> models.DisableUserResponse:
1345
+ """禁用用户(`auth_version++` 并撤销会话;含身份安全副作用)。
1346
+
1347
+ ``POST /api/v1/users/{id}/disable``
1348
+ """
1349
+ _sdk_result = await self._c.request(
1350
+ "POST",
1351
+ _path("/api/v1/users/{id}/disable", id=id),
1352
+ if_match=if_match,
1353
+ request_id=request_id,
1354
+ traceparent=traceparent,
1355
+ )
1356
+ return typed_result(_sdk_result, models.DisableUserResponse, '#/components/schemas/ApiResponse_UserDto/properties/data')
1357
+
1358
+ async def effective_permissions(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.EffectivePermissionsResponse:
1359
+ """有效权限(只统计功能权限,不含资源级预测)。
1360
+
1361
+ ``GET /api/v1/users/{id}/effective-permissions``
1362
+ """
1363
+ _sdk_result = await self._c.request(
1364
+ "GET",
1365
+ _path("/api/v1/users/{id}/effective-permissions", id=id),
1366
+ request_id=request_id,
1367
+ traceparent=traceparent,
1368
+ )
1369
+ return typed_result(_sdk_result, models.EffectivePermissionsResponse, '#/components/schemas/ApiResponse_EffectivePermissionsDto/properties/data')
1370
+
1371
+ async def enable_user(self, id: str, *, if_match: str, request_id: str | None = None, traceparent: str | None = None) -> models.EnableUserResponse:
1372
+ """启用用户。
1373
+
1374
+ ``POST /api/v1/users/{id}/enable``
1375
+ """
1376
+ _sdk_result = await self._c.request(
1377
+ "POST",
1378
+ _path("/api/v1/users/{id}/enable", id=id),
1379
+ if_match=if_match,
1380
+ request_id=request_id,
1381
+ traceparent=traceparent,
1382
+ )
1383
+ return typed_result(_sdk_result, models.EnableUserResponse, '#/components/schemas/ApiResponse_UserDto/properties/data')
1384
+
1385
+ async def get_user(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetUserResponse:
1386
+ """读取用户详情。
1387
+
1388
+ ``GET /api/v1/users/{id}``
1389
+ """
1390
+ _sdk_result = await self._c.request(
1391
+ "GET",
1392
+ _path("/api/v1/users/{id}", id=id),
1393
+ request_id=request_id,
1394
+ traceparent=traceparent,
1395
+ )
1396
+ return typed_result(_sdk_result, models.GetUserResponse, '#/components/schemas/ApiResponse_UserDto/properties/data')
1397
+
1398
+ async def get_user_mfa_policy(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetUserMfaPolicyResponse:
1399
+ """读取用户 MFA 策略(ETag 锚定 `users.version`)。
1400
+
1401
+ ``GET /api/v1/users/{id}/mfa-policy``
1402
+ """
1403
+ _sdk_result = await self._c.request(
1404
+ "GET",
1405
+ _path("/api/v1/users/{id}/mfa-policy", id=id),
1406
+ request_id=request_id,
1407
+ traceparent=traceparent,
1408
+ )
1409
+ return typed_result(_sdk_result, models.GetUserMfaPolicyResponse, '#/components/schemas/ApiResponse_UserMfaPolicyDto/properties/data')
1410
+
1411
+ async def get_user_roles(self, id: str, *, request_id: str | None = None, traceparent: str | None = None) -> models.GetUserRolesResponse:
1412
+ """读取用户的角色集合。
1413
+
1414
+ ``GET /api/v1/users/{id}/roles``
1415
+ """
1416
+ _sdk_result = await self._c.request(
1417
+ "GET",
1418
+ _path("/api/v1/users/{id}/roles", id=id),
1419
+ request_id=request_id,
1420
+ traceparent=traceparent,
1421
+ )
1422
+ return typed_result(_sdk_result, models.GetUserRolesResponse, '#/components/schemas/ApiResponse_UserRolesDto/properties/data')
1423
+
1424
+ async def list_users(self, *, cursor: str | None = None, page: int | None = None, limit: int | None = None, q: str | None = None, status: str | None = None, role_id: str | None = None, mfa_status: str | None = None, created_from: str | None = None, created_to: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ListUsersResponse:
1425
+ """统一的 404/403 语义:资源模式路由由端口按「存在性 + 权限」返回,Handler 不自行猜测。
1426
+
1427
+ ``GET /api/v1/users``
1428
+ """
1429
+ _sdk_result = await self._c.request(
1430
+ "GET",
1431
+ "/api/v1/users",
1432
+ query={"cursor": cursor, "page": page, "limit": limit, "q": q, "status": status, "role_id": role_id, "mfa_status": mfa_status, "created_from": created_from, "created_to": created_to},
1433
+ request_id=request_id,
1434
+ traceparent=traceparent,
1435
+ )
1436
+ return typed_result(_sdk_result, models.ListUsersResponse, '#/components/schemas/PagedResponse_UserDto/properties/data')
1437
+
1438
+ async def patch_user(self, id: str, *, if_match: str, body: models.PatchUserRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.PatchUserResponse:
1439
+ """更新用户资料(白名单字段;未知字段 400)。
1440
+
1441
+ ``PATCH /api/v1/users/{id}``
1442
+ """
1443
+ _sdk_result = await self._c.request(
1444
+ "PATCH",
1445
+ _path("/api/v1/users/{id}", id=id),
1446
+ json=request_body(body),
1447
+ if_match=if_match,
1448
+ idempotency_key=idempotency_key,
1449
+ request_id=request_id,
1450
+ traceparent=traceparent,
1451
+ )
1452
+ return typed_result(_sdk_result, models.PatchUserResponse, '#/components/schemas/ApiResponse_UserDto/properties/data')
1453
+
1454
+ async def replace_user_roles(self, id: str, *, if_match: str, body: models.ReplaceUserRolesRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ReplaceUserRolesResponse:
1455
+ """全量替换用户角色(exact set)。
1456
+
1457
+ ``PUT /api/v1/users/{id}/roles``
1458
+ """
1459
+ _sdk_result = await self._c.request(
1460
+ "PUT",
1461
+ _path("/api/v1/users/{id}/roles", id=id),
1462
+ json=request_body(body),
1463
+ if_match=if_match,
1464
+ idempotency_key=idempotency_key,
1465
+ request_id=request_id,
1466
+ traceparent=traceparent,
1467
+ )
1468
+ return typed_result(_sdk_result, models.ReplaceUserRolesResponse, '#/components/schemas/ApiResponse_UserRolesDto/properties/data')
1469
+
1470
+ async def reset_password(self, id: str, *, if_match: str, body: models.ResetPasswordRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.ResetPasswordResponse:
1471
+ """重置他人密码(高风险:要求 assurance + `user:reset_password`)。
1472
+
1473
+ ``POST /api/v1/users/{id}/reset-password``
1474
+ """
1475
+ _sdk_result = await self._c.request(
1476
+ "POST",
1477
+ _path("/api/v1/users/{id}/reset-password", id=id),
1478
+ json=request_body(body),
1479
+ if_match=if_match,
1480
+ idempotency_key=idempotency_key,
1481
+ request_id=request_id,
1482
+ traceparent=traceparent,
1483
+ )
1484
+ return typed_result(_sdk_result, models.ResetPasswordResponse, '#/components/schemas/ApiResponse_UserDto/properties/data')
1485
+
1486
+ async def set_user_mfa_policy(self, id: str, *, if_match: str, body: models.SetUserMfaPolicyRequest | Mapping[str, object], idempotency_key: str | None = None, request_id: str | None = None, traceparent: str | None = None) -> models.SetUserMfaPolicyResponse:
1487
+ """设置或清除用户 MFA 覆盖(必填可 null 的 mode;本次重验)。
1488
+
1489
+ ``PUT /api/v1/users/{id}/mfa-policy``
1490
+ """
1491
+ _sdk_result = await self._c.request(
1492
+ "PUT",
1493
+ _path("/api/v1/users/{id}/mfa-policy", id=id),
1494
+ json=request_body(body),
1495
+ if_match=if_match,
1496
+ idempotency_key=idempotency_key,
1497
+ request_id=request_id,
1498
+ traceparent=traceparent,
1499
+ )
1500
+ return typed_result(_sdk_result, models.SetUserMfaPolicyResponse, '#/components/schemas/ApiResponse_UserMfaPolicyDto/properties/data')
1501
+
1502
+ async def users_stats(self, *, request_id: str | None = None, traceparent: str | None = None) -> models.UsersStatsResponse:
1503
+ """用户计数。
1504
+
1505
+ ``GET /api/v1/users/stats``
1506
+ """
1507
+ _sdk_result = await self._c.request(
1508
+ "GET",
1509
+ "/api/v1/users/stats",
1510
+ request_id=request_id,
1511
+ traceparent=traceparent,
1512
+ )
1513
+ return typed_result(_sdk_result, models.UsersStatsResponse, '#/components/schemas/ApiResponse_UsersStatsDto/properties/data')
1514
+
1515
+
1516
+ class AsyncAdminClient:
1517
+ """Every ``/api/v1`` operation grouped by OpenAPI tag (``admin.users.list_users`` ...)."""
1518
+
1519
+ def __init__(self, client: AsyncRequester) -> None:
1520
+ self.attributes = AttributesApi(client)
1521
+ self.audit = AuditApi(client)
1522
+ self.auth = AuthApi(client)
1523
+ self.authz = AuthzApi(client)
1524
+ self.dashboard = DashboardApi(client)
1525
+ self.health = HealthApi(client)
1526
+ self.permissions = PermissionsApi(client)
1527
+ self.policies = PoliciesApi(client)
1528
+ self.policy_bindings = PolicyBindingsApi(client)
1529
+ self.relation_definitions = RelationDefinitionsApi(client)
1530
+ self.relation_tuples = RelationTuplesApi(client)
1531
+ self.resource_types = ResourceTypesApi(client)
1532
+ self.resources = ResourcesApi(client)
1533
+ self.roles = RolesApi(client)
1534
+ self.setup = SetupApi(client)
1535
+ self.users = UsersApi(client)