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
« 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
11router = Router(tags=["Authentication"])
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
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
32@router.post("/refresh", response={200: TokenOut})
33def refresh(request, payload: RefreshIn):
34 result = AuthService.refresh(payload.refresh_token)
35 return 200, result
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
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
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]
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