|
1 | | -from fastapi import APIRouter, Depends |
2 | | -import jwt |
3 | | -from sqlalchemy.orm import Session |
| 1 | +from fastapi import APIRouter, BackgroundTasks, Depends |
4 | 2 | from fastapi.security import OAuth2PasswordRequestForm |
| 3 | +from sqlalchemy.orm import Session |
5 | 4 |
|
6 | | - |
7 | | -from app.core.auth_handler import sign_jwt, sign_refresh_token, decode_jwt |
8 | 5 | from app.core.db.connect import get_db |
9 | | -from app.core.security import get_password_hash |
10 | | -from app.models.user import User |
11 | 6 | from app.schemas.auth import ( |
12 | | - JWTBearer, |
13 | | - UserCreate, |
14 | | - UserResponse, |
| 7 | + ConfirmPasswordRequest, |
15 | 8 | RefreshTokenRequest, |
| 9 | + ResetPasswordRequest, |
| 10 | + UserCreate, |
16 | 11 | ) |
17 | | -from app.schemas.base import Failed, Successfully |
| 12 | +from app.schemas.base import Successfully |
| 13 | +from app.services.auth import AuthService |
18 | 14 |
|
19 | 15 | router = APIRouter(prefix="/auth", tags=["auth"]) |
20 | 16 |
|
21 | 17 |
|
| 18 | +def get_auth_service(db: Session = Depends(get_db)) -> AuthService: |
| 19 | + return AuthService(db) |
| 20 | + |
| 21 | + |
22 | 22 | @router.post("/login") |
23 | 23 | def login( |
24 | 24 | form_data: OAuth2PasswordRequestForm = Depends(), |
25 | | - db: Session = Depends(get_db), |
| 25 | + auth_service: AuthService = Depends(get_auth_service), |
26 | 26 | ): |
27 | | - user = db.query(User).filter(User.username == form_data.username).first() |
28 | | - print(user) |
29 | | - if not user or not user.verify_password(form_data.password): |
30 | | - return Failed(status="fail", code=404, msg="Invalid username or password") |
31 | | - user.update_last_login() |
32 | | - db.commit() |
33 | | - id = str(user.id) |
34 | | - access_token, refresh_token = sign_jwt(id), sign_refresh_token(id) |
35 | | - jwt_token = JWTBearer( |
36 | | - access_token=access_token, refresh_token=refresh_token, token_type="bearer" |
37 | | - ) |
| 27 | + jwt_token = auth_service.login(form_data.username, form_data.password) |
38 | 28 | return Successfully( |
39 | 29 | code=200, msg="Login successfully", data=jwt_token, status="success" |
40 | 30 | ) |
41 | 31 |
|
42 | 32 |
|
43 | | -@router.post("/register", response_model=UserResponse) |
44 | | -async def register(user: UserCreate, db: Session = Depends(get_db)): |
45 | | - existing_user = ( |
46 | | - db.query(User) |
47 | | - .filter((User.username == user.username) | (User.email == user.email)) |
48 | | - .first() |
| 33 | +@router.post("/register") |
| 34 | +async def register( |
| 35 | + user: UserCreate, |
| 36 | + background_tasks: BackgroundTasks, |
| 37 | + auth_service: AuthService = Depends(get_auth_service), |
| 38 | +): |
| 39 | + new_user = auth_service.register(user, background_tasks) |
| 40 | + return Successfully(status="success", code=201, msg="User created", data=new_user) |
| 41 | + |
| 42 | + |
| 43 | +@router.post("/refresh") |
| 44 | +def refresh_token( |
| 45 | + refresh_token_request: RefreshTokenRequest, |
| 46 | + auth_service: AuthService = Depends(get_auth_service), |
| 47 | +): |
| 48 | + new_access_token = auth_service.refresh_token(refresh_token_request) |
| 49 | + return Successfully( |
| 50 | + status="success", code=200, msg="Refresh token", data=new_access_token |
49 | 51 | ) |
50 | 52 |
|
51 | | - if existing_user: |
52 | | - return Failed(status="fail", code=400, msg="Username or email already exists") |
53 | | - hashed_password = get_password_hash(user.password) |
54 | 53 |
|
55 | | - new_user = User( |
56 | | - username=user.username, email=user.email, hashed_password=hashed_password |
| 54 | +@router.post("/reset-password-request") |
| 55 | +def reset_password_request( |
| 56 | + email: str, |
| 57 | + auth_service: AuthService = Depends(get_auth_service), |
| 58 | +): |
| 59 | + reset_token = auth_service.reset_password_request(email) |
| 60 | + return Successfully( |
| 61 | + code=200, |
| 62 | + msg="Reset password token sent", |
| 63 | + data=reset_token, |
| 64 | + status="success", |
57 | 65 | ) |
58 | 66 |
|
59 | | - db.add(new_user) |
60 | | - db.commit() |
61 | | - db.refresh(new_user) |
62 | 67 |
|
63 | | - return Successfully(status="fail", code=201, msg="User created", data=user) |
| 68 | +@router.post("/reset-password") |
| 69 | +def reset_password( |
| 70 | + request: ResetPasswordRequest, |
| 71 | + auth_service: AuthService = Depends(get_auth_service), |
| 72 | +): |
| 73 | + auth_service.reset_password(request) |
| 74 | + return Successfully(code=200, msg="Password reset successfully", status="success") |
64 | 75 |
|
65 | 76 |
|
66 | | -@router.post("/refresh") |
67 | | -def refresh_token(refresh_token_request: RefreshTokenRequest): |
68 | | - try: |
69 | | - payload = decode_jwt(refresh_token_request.refresh_token) |
70 | | - user_id = payload.get("id") |
71 | | - if not user_id: |
72 | | - return Failed(status="fail", code=401, msg="Invalid refresh token") |
73 | | - new_access_token = sign_jwt(user_id) |
74 | | - |
75 | | - return Successfully( |
76 | | - status="success", code=200, msg="Refresh token", data=new_access_token |
77 | | - ) |
78 | | - except jwt.ExpiredSignatureError: |
79 | | - return Failed(status="fail", code=401, msg="Refresh token is expired") |
80 | | - except jwt.PyJWKError: |
81 | | - return Failed(status="fail", code=401, msg="Invalid refresh token") |
| 77 | +@router.post("/confirm-password") |
| 78 | +def confirm_password( |
| 79 | + request: ConfirmPasswordRequest, |
| 80 | + auth_service: AuthService = Depends(get_auth_service), |
| 81 | +): |
| 82 | + auth_service.confirm_password(request) |
| 83 | + return Successfully(code=200, msg="Password updated successfully", status="success") |
0 commit comments