Coverage for api/users/schema.py: 100.00%
59 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-09-03 15:30 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-09-03 15:30 +0000
1from datetime import datetime
2from enum import StrEnum
4from pydantic import BaseModel, EmailStr, Field
6from core.config import settings
9class UserResponse(BaseModel):
10 id: str = Field(..., description="User ID")
11 email: str = Field(..., description="User email address")
12 first_name: str = Field(..., description="First name")
13 last_name: str = Field(..., description="Last name")
14 phone: str = Field(..., description="Phone number")
15 status: bool = Field(..., description="User status")
16 created_at: datetime = Field(..., description="User creation time")
17 role: str | None = Field(None, description="User role")
18 role_level: int | None = Field(None, description="Privilege level of the user's primary role")
21class UserPagination(BaseModel):
22 users: list[UserResponse] = Field(..., description="List of users")
23 total: int = Field(..., description="Total number of users")
24 page: int = Field(..., description="Current page number")
25 per_page: int = Field(..., description="Number of users per page")
26 total_pages: int = Field(..., description="Total number of pages")
29class UserSortBy(StrEnum):
30 FIRST_NAME: str = "first_name"
31 LAST_NAME: str = "last_name"
32 EMAIL: str = "email"
33 PHONE: str = "phone"
34 ROLE: str = "role"
35 STATUS: str = "status"
36 CREATED_AT: str = "created_at"
39class UserCreate(BaseModel):
40 first_name: str = Field(..., min_length=1, max_length=50, description="First name")
41 last_name: str = Field(..., min_length=1, max_length=50, description="Last name")
42 email: EmailStr = Field(..., description="User email address")
43 phone: str = Field(..., min_length=1, max_length=20, description="Phone number")
44 password: str = Field(
45 ..., min_length=settings.PASSWORD_MIN_LENGTH, max_length=50, description="Password"
46 )
47 status: bool = Field(True, description="User status")
48 role: str | None = Field(None, description="User role")
51class UserUpdate(BaseModel):
52 first_name: str | None = Field(None, min_length=1, max_length=50, description="First name")
53 last_name: str | None = Field(None, min_length=1, max_length=50, description="Last name")
54 email: EmailStr | None = Field(None, description="User email address")
55 phone: str | None = Field(None, min_length=1, max_length=20, description="Phone number")
56 status: bool | None = Field(None, description="User status")
57 role: str | None = Field(None, description="User role")
60class UserDelete(BaseModel):
61 user_ids: list[str] = Field(..., min_items=1, description="List of user IDs to delete")
64class PasswordReset(BaseModel):
65 new_password: str = Field(
66 ..., min_length=settings.PASSWORD_MIN_LENGTH, max_length=50, description="New password"
67 )
70class UserDeleteResult(BaseModel):
71 user_id: str = Field(..., description="User ID")
72 status: str = Field(
73 ...,
74 description="Processing status: success, failed",
75 example="success|failed",
76 pattern="^(success|failed)$",
77 )
78 message: str = Field(..., description="Result message")
81class UserDeleteBatchResponse(BaseModel):
82 results: list[UserDeleteResult] = Field(..., description="Individual user deletion results")
83 total_users: int = Field(..., description="Total number of users processed")
84 success_count: int = Field(..., description="Number of successfully deleted users")
85 failed_count: int = Field(..., description="Number of failed deletions")
88user_delete_success_response_example = {
89 "code": 200,
90 "message": "All users deleted successfully",
91 "data": {
92 "results": [
93 {
94 "user_id": "uuid-user-id-1",
95 "status": "success",
96 "message": "User deleted successfully",
97 },
98 {
99 "user_id": "uuid-user-id-2",
100 "status": "success",
101 "message": "User deleted successfully",
102 },
103 ],
104 "total_users": 2,
105 "success_count": 2,
106 "failed_count": 0,
107 },
108}
110user_delete_partial_response_example = {
111 "code": 207,
112 "message": "Users deleted with partial success",
113 "data": {
114 "results": [
115 {
116 "user_id": "uuid-user-id-1",
117 "status": "success",
118 "message": "User deleted successfully",
119 },
120 {"user_id": "uuid-user-id-2", "status": "failed", "message": "User not found"},
121 ],
122 "total_users": 2,
123 "success_count": 1,
124 "failed_count": 1,
125 },
126}
128user_delete_failed_response_example = {
129 "code": 400,
130 "message": "All users failed to delete",
131 "data": {
132 "results": [{"user_id": "uuid-user-id-1", "status": "failed", "message": "User not found"}],
133 "total_users": 1,
134 "success_count": 0,
135 "failed_count": 1,
136 },
137}