File size: 2,001 Bytes
633c3f1
 
 
b582880
633c3f1
b582880
633c3f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1fcbb38
 
 
 
 
 
633c3f1
1fcbb38
 
 
 
 
 
 
633c3f1
 
b582880
 
 
5a41f5d
b582880
 
 
c9dfe5e
b582880
 
 
5a41f5d
 
 
 
c9dfe5e
 
5a41f5d
 
b582880
 
633c3f1
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import uvicorn
from contextlib import asynccontextmanager
import sqlite3
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from pydantic import BaseModel

@asynccontextmanager
async def lifespan(app: FastAPI):
    print("startup event")
    yield
    print("shutdown event")

app = FastAPI(lifespan=lifespan)

DATABASE = 'workbook.db'

def get_db():
    db = getattr(app.state, '_database', None)
    if db is None:
        db = app.state._database = sqlite3.connect(DATABASE)
    return db

@app.get('/api/chapters')
def get_chapters():
    db = get_db()
    cursor = db.cursor()
    cursor.execute("""

        SELECT c.chapter, c.chapter_name, COUNT(q.question) as n_questions

        FROM chapter c

        LEFT JOIN question q ON c.chapter = q.chapter

        GROUP BY c.chapter, c.chapter_name

    """)
    chapters = cursor.fetchall()
    chapter_list = [
        {
            "chapter_number": row[0],
            "chapter_name": row[1],
            "n_questions": row[2]
        } for row in chapters
    ]
    return JSONResponse(content=chapter_list)

class ChapterRequest(BaseModel):
    chapter_number: int

@app.post('/api/questions')
def get_questions_by_chapter(request: ChapterRequest):
    db = get_db()
    cursor = db.cursor()
    cursor.execute("SELECT question, options, answer, explain FROM question WHERE chapter = ? AND kind = '正誤問題'", (request.chapter_number,))
    questions = cursor.fetchall()
    if not questions:
        raise HTTPException(status_code=404, detail="Questions not found for the given chapter number")
    question_list = [
        {
            "question_text": row[0],
            "options": row[1],
            "answer": row[2],
            "explanation": row[3]
        } for row in questions
    ]
    return JSONResponse(content=question_list)

if __name__ == '__main__':
    uvicorn.run(app, host="127.0.0.1", port=8000, log_level="debug")