Skip to content

Commit c4a1de0

Browse files
committed
Completed Task B3: Mock Endpoint Responses
1 parent 7219230 commit c4a1de0

7 files changed

Lines changed: 1055 additions & 2 deletions

File tree

backend/api/auth.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
from datetime import datetime, timedelta
2+
from fastapi import APIRouter, HTTPException, Depends
3+
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
4+
from typing import Dict, Any
5+
import uuid
6+
import jwt
7+
import os
8+
9+
from models.response_schemas import (
10+
ApiResponse, User, LoginRequest, AuthResponse,
11+
RefreshTokenRequest
12+
)
13+
14+
router = APIRouter(prefix="/auth", tags=["authentication"])
15+
security = HTTPBearer()
16+
17+
# Mock user database
18+
MOCK_USERS = {
19+
"google_user_123": {
20+
"id": "user_001",
21+
"email": "john.doe@example.com",
22+
"name": "John Doe",
23+
"avatar_url": "https://lh3.googleusercontent.com/a/default-user",
24+
"created_at": "2025-01-01T00:00:00Z",
25+
"last_sign_in_at": "2025-01-01T12:00:00Z"
26+
}
27+
}
28+
29+
# Mock JWT settings
30+
JWT_SECRET = os.getenv("JWT_SECRET", "mock_secret_key_for_development")
31+
ALGORITHM = "HS256"
32+
ACCESS_TOKEN_EXPIRE_MINUTES = 60
33+
34+
def create_access_token(data: Dict[str, Any]) -> str:
35+
"""Create JWT access token"""
36+
to_encode = data.copy()
37+
expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
38+
to_encode.update({"exp": expire})
39+
return jwt.encode(to_encode, JWT_SECRET, algorithm=ALGORITHM)
40+
41+
def verify_token(credentials: HTTPAuthorizationCredentials = Depends(security)) -> str:
42+
"""Verify JWT token and return user_id"""
43+
try:
44+
payload = jwt.decode(credentials.credentials, JWT_SECRET, algorithms=[ALGORITHM])
45+
user_id: str = payload.get("sub")
46+
if user_id is None:
47+
raise HTTPException(status_code=401, detail="Invalid token")
48+
return user_id
49+
except jwt.PyJWTError:
50+
raise HTTPException(status_code=401, detail="Invalid token")
51+
52+
@router.post("/google")
53+
async def login_with_google(request: LoginRequest) -> ApiResponse[AuthResponse]:
54+
"""Mock Google OAuth login"""
55+
# Mock Google token validation
56+
if not request.google_token.startswith("mock_google_token"):
57+
raise HTTPException(status_code=401, detail="Invalid Google token")
58+
59+
# Mock user from Google token
60+
user_data = MOCK_USERS["google_user_123"]
61+
user = User(**user_data)
62+
63+
# Create JWT tokens
64+
access_token = create_access_token(data={"sub": user.id})
65+
refresh_token = str(uuid.uuid4())
66+
67+
auth_response = AuthResponse(
68+
user=user,
69+
access_token=access_token,
70+
refresh_token=refresh_token,
71+
expires_in=ACCESS_TOKEN_EXPIRE_MINUTES * 60
72+
)
73+
74+
return ApiResponse(success=True, data=auth_response)
75+
76+
@router.get("/me")
77+
async def get_current_user(user_id: str = Depends(verify_token)) -> ApiResponse[User]:
78+
"""Get current user information"""
79+
# Mock user lookup
80+
for mock_user in MOCK_USERS.values():
81+
if mock_user["id"] == user_id:
82+
user = User(**mock_user)
83+
return ApiResponse(success=True, data=user)
84+
85+
raise HTTPException(status_code=404, detail="User not found")
86+
87+
@router.post("/logout")
88+
async def logout(user_id: str = Depends(verify_token)) -> ApiResponse[Dict[str, str]]:
89+
"""Logout current user"""
90+
return ApiResponse(
91+
success=True,
92+
data={"message": "Logged out successfully"}
93+
)
94+
95+
@router.post("/refresh")
96+
async def refresh_token(request: RefreshTokenRequest) -> ApiResponse[Dict[str, Any]]:
97+
"""Refresh access token"""
98+
# Mock refresh token validation
99+
if not request.refresh_token:
100+
raise HTTPException(status_code=401, detail="Invalid refresh token")
101+
102+
# Create new access token
103+
new_access_token = create_access_token(data={"sub": "user_001"})
104+
105+
return ApiResponse(
106+
success=True,
107+
data={
108+
"access_token": new_access_token,
109+
"expires_in": ACCESS_TOKEN_EXPIRE_MINUTES * 60
110+
}
111+
)

0 commit comments

Comments
 (0)