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
« 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
9router = APIRouter()
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
21 class Config:
22 from_attributes = True
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)
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 )
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
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
69 users = query.offset(skip).limit(limit).all()
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 ))
85 return results