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

1from datetime import datetime 

2from enum import StrEnum 

3 

4from pydantic import BaseModel, EmailStr, Field 

5 

6from core.config import settings 

7 

8 

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") 

19 

20 

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") 

27 

28 

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" 

37 

38 

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") 

49 

50 

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") 

58 

59 

60class UserDelete(BaseModel): 

61 user_ids: list[str] = Field(..., min_items=1, description="List of user IDs to delete") 

62 

63 

64class PasswordReset(BaseModel): 

65 new_password: str = Field( 

66 ..., min_length=settings.PASSWORD_MIN_LENGTH, max_length=50, description="New password" 

67 ) 

68 

69 

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") 

79 

80 

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") 

86 

87 

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} 

109 

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} 

127 

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}