Coverage for app\routers\users.py: 92%

52 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2026-01-15 13:39 +0300

1from typing import List, Optional 

2from fastapi import APIRouter, Depends, HTTPException, Query 

3from sqlalchemy.orm import Session 

4from pydantic import BaseModel, EmailStr 

5from datetime import datetime 

6from ..db import User, UserRole, UserStatus 

7from ..deps import get_db, get_current_user 

8 

9router = APIRouter() 

10 

11class UserRead(BaseModel): 

12 id: str 

13 username: str 

14 email: Optional[str] = None 

15 full_name: Optional[str] = None 

16 role: str 

17 status: str 

18 last_login_at: Optional[datetime] = None 

19 created_at: Optional[datetime] = None 

20 

21 class Config: 

22 from_attributes = True 

23 

24@router.get("", response_model=List[UserRead]) 

25def get_users( 

26 skip: int = 0, 

27 limit: int = 100, 

28 search: Optional[str] = None, 

29 role: Optional[str] = None, 

30 status: Optional[str] = None, 

31 db: Session = Depends(get_db), 

32 current_user: dict = Depends(get_current_user) 

33): 

34 query = db.query(User) 

35 

36 if search: 

37 search_filter = f"%{search}%" 

38 query = query.filter( 

39 (User.username.ilike(search_filter)) | 

40 (User.full_name.ilike(search_filter)) | 

41 (User.email.ilike(search_filter)) 

42 ) 

43 

44 if role: 

45 try: 

46 # Try to match by value 

47 role_enum = None 

48 for r in UserRole: 

49 if r.value == role: 

50 role_enum = r 

51 break 

52 if role_enum: 

53 query = query.filter(User.role == role_enum) 

54 except ValueError: 

55 pass 

56 

57 if status: 

58 try: 

59 status_enum = None 

60 for s in UserStatus: 

61 if s.value == status: 

62 status_enum = s 

63 break 

64 if status_enum: 

65 query = query.filter(User.status == status_enum) 

66 except ValueError: 

67 pass 

68 

69 users = query.offset(skip).limit(limit).all() 

70 

71 # Map enums to values for Pydantic 

72 results = [] 

73 for u in users: 

74 results.append(UserRead( 

75 id=u.id, 

76 username=u.username, 

77 email=u.email, 

78 full_name=u.full_name, 

79 role=u.role.value if hasattr(u.role, 'value') else str(u.role), 

80 status=u.status.value if hasattr(u.status, 'value') else str(u.status), 

81 last_login_at=u.last_login_at, 

82 created_at=u.created_at 

83 )) 

84 

85 return results