from fastapi import APIRouter, HTTPException, Depends, status from fastapi.security import OAuth2PasswordRequestForm from app.core.security import create_access_token, get_current_user, get_password_hash from app.models.user import User, UserCreate from app.core.config import settings from app.core.database import get_database from datetime import datetime router = APIRouter() @router.post("/login") async def login(form_data: OAuth2PasswordRequestForm = Depends()): # TODO: Implement actual authentication return { "access_token": create_access_token({"sub": form_data.username}), "token_type": "bearer" } @router.post("/logout") async def logout(current_user: User = Depends(get_current_user)): # TODO: Implement logout logic return {"message": "Logged out successfully"} @router.post("/refresh") async def refresh_token(current_user: User = Depends(get_current_user)): # TODO: Implement token refresh logic return { "access_token": create_access_token({"sub": current_user.email}), "token_type": "bearer" } @router.get("/authorize") async def authorize(): # TODO: Implement OAuth authorization return {"message": "Authorization endpoint"} @router.post("/token") async def token(): # TODO: Implement OAuth token endpoint return {"message": "Token endpoint"} @router.post("/register", status_code=status.HTTP_201_CREATED) async def register(user_data: UserCreate): """Register a new user""" # Get database database = get_database() # Check if user already exists users_collection = database["users"] existing_user = await users_collection.find_one({"email": user_data.email}) if existing_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered" ) # Create new user user_dict = { "email": user_data.email, "full_name": user_data.name, "username": user_data.email.split("@")[0], # Use email prefix as username "organization": user_data.organization, "hashed_password": get_password_hash(user_data.password), "role": "user", # Default role "is_active": True, "created_at": datetime.utcnow(), "updated_at": datetime.utcnow() } # Insert user into database result = await users_collection.insert_one(user_dict) # Create access token for immediate login access_token = create_access_token({"sub": user_data.email}) return { "message": "User registered successfully", "access_token": access_token, "token_type": "bearer", "user": { "id": str(result.inserted_id), "email": user_data.email, "name": user_data.name } }