Automated Action 07f6a51f6f Add complete FastAPI backend for AI tutor application
- User authentication with JWT tokens (register/login)
- Tutor session management with CRUD operations
- Message tracking for tutor conversations
- SQLite database with Alembic migrations
- CORS configuration for frontend integration
- Health check and service info endpoints
- Proper project structure with models, schemas, and API routes
2025-06-23 17:55:19 +00:00

128 lines
3.7 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List
from app.db.session import get_db
from app.models.user import User
from app.models.tutor_session import TutorSession
from app.models.tutor_message import TutorMessage
from app.schemas.tutor_session import (
TutorSessionCreate,
TutorSessionUpdate,
TutorSession as TutorSessionSchema
)
from app.schemas.tutor_message import (
TutorMessageCreate,
TutorMessage as TutorMessageSchema
)
from app.api.auth import get_current_user
router = APIRouter()
@router.post("/sessions", response_model=TutorSessionSchema)
def create_tutor_session(
session: TutorSessionCreate,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
db_session = TutorSession(
user_id=current_user.id,
subject=session.subject,
topic=session.topic,
difficulty_level=session.difficulty_level
)
db.add(db_session)
db.commit()
db.refresh(db_session)
return db_session
@router.get("/sessions", response_model=List[TutorSessionSchema])
def get_user_sessions(
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
return db.query(TutorSession).filter(
TutorSession.user_id == current_user.id
).all()
@router.get("/sessions/{session_id}", response_model=TutorSessionSchema)
def get_session(
session_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
session = db.query(TutorSession).filter(
TutorSession.id == session_id,
TutorSession.user_id == current_user.id
).first()
if not session:
raise HTTPException(status_code=404, detail="Session not found")
return session
@router.put("/sessions/{session_id}", response_model=TutorSessionSchema)
def update_session(
session_id: int,
session_update: TutorSessionUpdate,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
session = db.query(TutorSession).filter(
TutorSession.id == session_id,
TutorSession.user_id == current_user.id
).first()
if not session:
raise HTTPException(status_code=404, detail="Session not found")
update_data = session_update.dict(exclude_unset=True)
for field, value in update_data.items():
setattr(session, field, value)
db.commit()
db.refresh(session)
return session
@router.post("/sessions/{session_id}/messages", response_model=TutorMessageSchema)
def add_message_to_session(
session_id: int,
message: TutorMessageCreate,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
session = db.query(TutorSession).filter(
TutorSession.id == session_id,
TutorSession.user_id == current_user.id
).first()
if not session:
raise HTTPException(status_code=404, detail="Session not found")
db_message = TutorMessage(
session_id=session_id,
message_type=message.message_type,
content=message.content
)
db.add(db_message)
db.commit()
db.refresh(db_message)
return db_message
@router.get("/sessions/{session_id}/messages", response_model=List[TutorMessageSchema])
def get_session_messages(
session_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user)
):
session = db.query(TutorSession).filter(
TutorSession.id == session_id,
TutorSession.user_id == current_user.id
).first()
if not session:
raise HTTPException(status_code=404, detail="Session not found")
return db.query(TutorMessage).filter(
TutorMessage.session_id == session_id
).order_by(TutorMessage.created_at).all()