from fastapi import FastAPI, Depends, HTTPException from sqlalchemy.orm import Session from pydantic import BaseModel from typing import List, Optional import sys import os import random sys.path.append(os.path.join(os.path.dirname(__file__), "../../../shared")) from database.connection import get_db from database.models import Question, Theme app = FastAPI(title="Question Service", version="1.0.0") class QuestionResponse(BaseModel): id: int theme_id: int question_text: str hint: Optional[str] = None difficulty_level: int theme_name: str class QuestionCreate(BaseModel): theme_id: int question_text: str correct_answer: str hint: Optional[str] = None difficulty_level: int = 1 @app.get("/health") def health_check(): return {"status": "healthy", "service": "question-service"} @app.get("/random", response_model=QuestionResponse) def get_random_question(db: Session = Depends(get_db)): questions = db.query(Question).join(Theme).all() if not questions: raise HTTPException(status_code=404, detail="No questions available") question = random.choice(questions) return QuestionResponse( id=question.id, theme_id=question.theme_id, question_text=question.question_text, hint=question.hint, difficulty_level=question.difficulty_level, theme_name=question.theme.name ) @app.get("/{question_id}", response_model=QuestionResponse) def get_question(question_id: int, db: Session = Depends(get_db)): question = db.query(Question).join(Theme).filter(Question.id == question_id).first() if not question: raise HTTPException(status_code=404, detail="Question not found") return QuestionResponse( id=question.id, theme_id=question.theme_id, question_text=question.question_text, hint=question.hint, difficulty_level=question.difficulty_level, theme_name=question.theme.name ) @app.post("/", response_model=QuestionResponse) def create_question(question_data: QuestionCreate, db: Session = Depends(get_db)): theme = db.query(Theme).filter(Theme.id == question_data.theme_id).first() if not theme: raise HTTPException(status_code=404, detail="Theme not found") question = Question( theme_id=question_data.theme_id, question_text=question_data.question_text, correct_answer=question_data.correct_answer, hint=question_data.hint, difficulty_level=question_data.difficulty_level ) db.add(question) db.commit() db.refresh(question) return QuestionResponse( id=question.id, theme_id=question.theme_id, question_text=question.question_text, hint=question.hint, difficulty_level=question.difficulty_level, theme_name=theme.name ) @app.get("/themes/", response_model=List[dict]) def get_themes(db: Session = Depends(get_db)): themes = db.query(Theme).all() return [{"id": theme.id, "name": theme.name, "description": theme.description} for theme in themes] if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8002)