Coverage for modules\authentication\api.py: 48%

44 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-05 09:25 +0800

1from ninja import Router 

2from typing import List 

3from core.auth import JWTAuth 

4from .schemas import ( 

5 RegisterIn, LoginIn, RefreshIn, SwitchOrgIn, 

6 UserUpdateIn, AuthResponse, UserOut, OrganizationOut, TokenOut 

7) 

8from .services import AuthService 

9from .models import Membership 

10 

11router = Router(tags=["Authentication"]) 

12 

13@router.post("/register", response={201: AuthResponse}) 

14def register(request, payload: RegisterIn): 

15 result = AuthService.register( 

16 email=payload.email, 

17 password=payload.password, 

18 first_name=payload.first_name, 

19 last_name=payload.last_name, 

20 organization_name=payload.organization_name 

21 ) 

22 return 201, result 

23 

24@router.post("/login", response={200: AuthResponse}) 

25def login(request, payload: LoginIn): 

26 result = AuthService.login( 

27 email=payload.email, 

28 password=payload.password 

29 ) 

30 return 200, result 

31 

32@router.post("/refresh", response={200: TokenOut}) 

33def refresh(request, payload: RefreshIn): 

34 result = AuthService.refresh(payload.refresh_token) 

35 return 200, result 

36 

37@router.get("/me", auth=JWTAuth(), response={200: UserOut}) 

38def get_me(request): 

39 user = request.user 

40 role = None 

41 if user.current_organization: 

42 m = Membership.objects.filter(user=user, organization=user.current_organization).first() 

43 if m: 

44 role = m.role 

45 user.role = role 

46 return user 

47 

48@router.put("/me", auth=JWTAuth(), response={200: UserOut}) 

49def update_me(request, payload: UserUpdateIn): 

50 user = request.user 

51 for attr, value in payload.dict(exclude_unset=True).items(): 

52 setattr(user, attr, value) 

53 user.save() 

54 return user 

55 

56@router.get("/organizations", auth=JWTAuth(), response={200: List[OrganizationOut]}) 

57def list_organizations(request): 

58 memberships = Membership.objects.filter(user=request.user).select_related('organization') 

59 return [m.organization for m in memberships] 

60 

61@router.post("/switch-organization", auth=JWTAuth(), response={200: AuthResponse}) 

62def switch_organization(request, payload: SwitchOrgIn): 

63 result = AuthService.switch_organization(request.user, payload.organization_id) 

64 return 200, result