from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.core.database import get_db from app.core.security import verify_password, get_password_hash, create_access_token from app.models.models import User from app.schemas.schemas import LoginRequest, TokenResponse, UserResponse from app.api.deps import get_current_user from app.services.event_service import log_event router = APIRouter(prefix="/auth", tags=["Authentication"]) @router.post("/login", response_model=TokenResponse) async def login(credentials: LoginRequest, db: AsyncSession = Depends(get_db)): result = await db.execute(select(User).where(User.email == credentials.email.strip().lower())) user = result.scalar_one_or_none() if not user or not verify_password(credentials.password, user.hashed_password): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect email or password" ) if not user.is_active: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="User account is deactivated" ) access_token = create_access_token(subject=user.id, role=user.role) await log_event( db=db, event_type="LOGIN", message=f"User {user.email} logged in successfully.", severity="INFO", user_email=user.email ) return { "access_token": access_token, "token_type": "bearer", "user": { "id": user.id, "email": user.email, "full_name": user.full_name, "role": user.role } } @router.get("/me", response_model=UserResponse) async def get_me(current_user: User = Depends(get_current_user)): return current_user @router.post("/seed-admin") async def seed_admin(db: AsyncSession = Depends(get_db)): """Creates default admin if no users exist in the database.""" result = await db.execute(select(User)) first_user = result.scalar_one_or_none() if first_user: return {"message": "Admin already exists"} admin = User( email="admin@oneverdrive.local", hashed_password=get_password_hash("Admin1234!"), full_name="System Administrator", role="ADMIN", is_active=True ) db.add(admin) await db.commit() return {"message": "Default admin created: admin@oneverdrive.local / Admin1234!"}