86 lines
3.0 KiB
Python
86 lines
3.0 KiB
Python
import logging
|
||
|
||
from fastapi import APIRouter, Depends, HTTPException, Request
|
||
from fastapi.responses import JSONResponse
|
||
|
||
from app.core.session_middleware import get_current_session
|
||
from app.models.session import Session, SessionRead
|
||
from app.repositories.session_repository import SessionRepository
|
||
|
||
logger = logging.getLogger(__name__)
|
||
router = APIRouter(prefix="/sessions", tags=["Sessions"])
|
||
|
||
|
||
@router.get("/current", response_model=SessionRead)
|
||
async def get_current_session_info(
|
||
request: Request, current_session: Session = Depends(get_current_session)
|
||
):
|
||
"""Получить информацию о текущей сессии"""
|
||
if not current_session:
|
||
raise HTTPException(status_code=401, detail="No active session")
|
||
|
||
return SessionRead(
|
||
id=current_session.id,
|
||
session_id=current_session.session_id,
|
||
user_agent=current_session.user_agent,
|
||
ip_address=current_session.ip_address,
|
||
is_active=current_session.is_active,
|
||
expires_at=current_session.expires_at,
|
||
last_activity=current_session.last_activity,
|
||
created_at=current_session.created_at,
|
||
updated_at=current_session.updated_at,
|
||
)
|
||
|
||
|
||
@router.post("/refresh")
|
||
async def refresh_session(
|
||
request: Request,
|
||
current_session: Session = Depends(get_current_session),
|
||
session_repo: SessionRepository = Depends(SessionRepository),
|
||
):
|
||
"""Продлить сессию на 30 дней"""
|
||
if not current_session:
|
||
raise HTTPException(status_code=401, detail="No active session")
|
||
current_session.extend_session(days=30)
|
||
|
||
# Обновляем через репозиторий
|
||
await session_repo.update_last_activity(current_session.session_id)
|
||
|
||
logger.info(f"Extended session {current_session.session_id}")
|
||
|
||
return {
|
||
"message": "Session extended successfully",
|
||
"expires_at": current_session.expires_at,
|
||
"session_id": current_session.session_id,
|
||
}
|
||
|
||
|
||
@router.post("/logout")
|
||
async def logout(
|
||
request: Request,
|
||
current_session: Session = Depends(get_current_session),
|
||
session_repo: SessionRepository = Depends(SessionRepository),
|
||
):
|
||
"""Завершить текущую сессию"""
|
||
if not current_session:
|
||
raise HTTPException(status_code=401, detail="No active session")
|
||
deactivated = await session_repo.deactivate_session(current_session.session_id)
|
||
|
||
if deactivated:
|
||
logger.info(f"Deactivated session {current_session.session_id}")
|
||
response = JSONResponse(content={"message": "Logged out successfully"})
|
||
response.delete_cookie("session_id")
|
||
return response
|
||
else:
|
||
raise HTTPException(status_code=500, detail="Failed to logout")
|
||
|
||
|
||
@router.get("/health")
|
||
async def session_health_check():
|
||
"""Проверка работоспособности сессионного механизма"""
|
||
return {
|
||
"status": "healthy",
|
||
"service": "session_management",
|
||
"message": "Session management is working properly",
|
||
}
|