Coverage for api/users/schema.py: 100.00%

59 statements  

« prev     ^ index     » next       coverage.py v7.9.2, created at 2026-01-25 13:05 +0000

1from enum import Enum 

2from datetime import datetime 

3from core.config import settings 

4from typing import List, Optional 

5from pydantic import BaseModel, EmailStr, Field 

6 

7class UserResponse(BaseModel): 

8 id: str = Field(..., description="User ID") 

9 email: str = Field(..., description="User email address") 

10 first_name: str = Field(..., description="First name") 

11 last_name: str = Field(..., description="Last name") 

12 phone: str = Field(..., description="Phone number") 

13 status: bool = Field(..., description="User status") 

14 created_at: datetime = Field(..., description="User creation time") 

15 role: Optional[str] = Field(None, description="User role") 

16 

17class UserPagination(BaseModel): 

18 users: List[UserResponse] = Field(..., description="List of users") 

19 total: int = Field(..., description="Total number of users") 

20 page: int = Field(..., description="Current page number") 

21 per_page: int = Field(..., description="Number of users per page") 

22 total_pages: int = Field(..., description="Total number of pages") 

23 

24class UserSortBy(str, Enum): 

25 FIRST_NAME: str = "first_name" 

26 LAST_NAME: str = "last_name" 

27 EMAIL: str = "email" 

28 PHONE: str = "phone" 

29 ROLE: str = "role" 

30 STATUS: str = "status" 

31 CREATED_AT: str = "created_at" 

32 

33class UserCreate(BaseModel): 

34 first_name: str = Field(..., min_length=1, max_length=50, description="First name") 

35 last_name: str = Field(..., min_length=1, max_length=50, description="Last name") 

36 email: EmailStr = Field(..., description="User email address") 

37 phone: str = Field(..., min_length=1, max_length=20, description="Phone number") 

38 password: str = Field(..., min_length=settings.PASSWORD_MIN_LENGTH, max_length=50, description="Password") 

39 status: bool = Field(True, description="User status") 

40 role: Optional[str] = Field(None, description="User role") 

41 

42class UserUpdate(BaseModel): 

43 first_name: Optional[str] = Field(None, min_length=1, max_length=50, description="First name") 

44 last_name: Optional[str] = Field(None, min_length=1, max_length=50, description="Last name") 

45 email: Optional[EmailStr] = Field(None, description="User email address") 

46 phone: Optional[str] = Field(None, min_length=1, max_length=20, description="Phone number") 

47 status: Optional[bool] = Field(None, description="User status") 

48 role: Optional[str] = Field(None, description="User role") 

49 

50class UserDelete(BaseModel): 

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

52 

53class PasswordReset(BaseModel): 

54 new_password: str = Field(..., min_length=settings.PASSWORD_MIN_LENGTH, max_length=50, description="New password") 

55 

56class UserDeleteResult(BaseModel): 

57 user_id: str = Field(..., description="User ID") 

58 status: str = Field(..., description="Processing status: success, failed", example="success|failed", pattern="^(success|failed)$") 

59 message: str = Field(..., description="Result message") 

60 

61class UserDeleteBatchResponse(BaseModel): 

62 results: List[UserDeleteResult] = Field(..., description="Individual user deletion results") 

63 total_users: int = Field(..., description="Total number of users processed") 

64 success_count: int = Field(..., description="Number of successfully deleted users") 

65 failed_count: int = Field(..., description="Number of failed deletions") 

66 

67user_delete_success_response_example = { 

68 "code": 200, 

69 "message": "All users deleted successfully", 

70 "data": { 

71 "results": [ 

72 { 

73 "user_id": "uuid-user-id-1", 

74 "status": "success", 

75 "message": "User deleted successfully" 

76 }, 

77 { 

78 "user_id": "uuid-user-id-2", 

79 "status": "success", 

80 "message": "User deleted successfully" 

81 } 

82 ], 

83 "total_users": 2, 

84 "success_count": 2, 

85 "failed_count": 0 

86 } 

87} 

88 

89user_delete_partial_response_example = { 

90 "code": 207, 

91 "message": "Users deleted with partial success", 

92 "data": { 

93 "results": [ 

94 { 

95 "user_id": "uuid-user-id-1", 

96 "status": "success", 

97 "message": "User deleted successfully" 

98 }, 

99 { 

100 "user_id": "uuid-user-id-2", 

101 "status": "failed", 

102 "message": "User not found" 

103 } 

104 ], 

105 "total_users": 2, 

106 "success_count": 1, 

107 "failed_count": 1 

108 } 

109} 

110 

111user_delete_failed_response_example = { 

112 "code": 400, 

113 "message": "All users failed to delete", 

114 "data": { 

115 "results": [ 

116 { 

117 "user_id": "uuid-user-id-1", 

118 "status": "failed", 

119 "message": "User not found" 

120 } 

121 ], 

122 "total_users": 1, 

123 "success_count": 0, 

124 "failed_count": 1 

125 } 

126}