Skip to content

Commit 874f94c

Browse files
authored
Merge pull request #204 from Pseudo-Lab/feat/submit-challenge
feat(getcloser): submit challenge
2 parents 86b5877 + bf7f52a commit 874f94c

4 files changed

Lines changed: 82 additions & 27 deletions

File tree

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from fastapi import APIRouter, Depends, HTTPException
22
from sqlalchemy.orm import Session
33
from core.database import get_db
4-
from schemas.challenge_schema import ChallengeRequest, ChallengeResponse, ChallengeRetryRequest, ChallengeRetryResponse, GoodsRedeemRequest, GoodsRedeemResponse
5-
from services.challenge_service import assign_challenges_logic, redeem_goods, retry_challenge
4+
from schemas.challenge_schema import ChallengeRequest, ChallengeResponse, ChallengeRetryRequest, ChallengeRetryResponse, GoodsRedeemRequest, GoodsRedeemResponse, AnswerSubmitRequest, AnswerSubmitResponse
5+
from services.challenge_service import assign_challenges_logic, submit_challenges_logic, redeem_goods, retry_challenge
66

77
router = APIRouter()
88

@@ -17,20 +17,18 @@ def challenge_retry_controller(request: ChallengeRetryRequest, db: Session = Dep
1717
@router.post("/assign", response_model=ChallengeResponse)
1818
def assign_challenges(request: ChallengeRequest, db: Session = Depends(get_db)):
1919
try:
20-
# my_id = parse_user_id(request.my_id).get("id")
21-
# if not my_id:
22-
# raise HTTPException(status_code=400, detail="์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์˜ ์œ ์ € ํƒœ๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ: ๊น€๋ฏผ์ค€#0001")
23-
24-
# members_ids = [request.my_id] # ํŒ€์›์— ์ž๊ธฐ ์ž์‹  ํฌํ•จ
25-
# for tag in request.members_ids:
26-
# parsed = parse_user_id(tag)
27-
# if "error" in parsed:
28-
# raise HTTPException(status_code=400, detail=parsed["error"])
29-
# members_ids.append(parsed["id"])
30-
3120
members_ids = [request.my_id] + request.members_ids
3221
assigned = assign_challenges_logic(request.my_id, members_ids, db)
3322
return ChallengeResponse(team_id=request.team_id, my_assigned=assigned)
3423

3524
except ValueError as e:
3625
raise HTTPException(status_code=400, detail=str(e))
26+
27+
@router.post("/submit", response_model=AnswerSubmitResponse)
28+
def submit_challenges(request: AnswerSubmitRequest, db: Session = Depends(get_db)):
29+
try:
30+
is_correct = submit_challenges_logic(request.user_id, request.challenge_id, request.submitted_answer, db)
31+
return AnswerSubmitResponse(is_correct=is_correct)
32+
33+
except ValueError as e:
34+
raise HTTPException(status_code=400, detail=str(e))

โ€Žgetcloser/backend/app/schemas/challenge_schema.pyโ€Ž

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,50 @@
1+
from datetime import datetime
12
from pydantic import BaseModel
2-
from typing import List
3+
from typing import List, Optional
34

45
class ChallengeRequest(BaseModel):
5-
team_id: int
6-
my_id: int
7-
members_ids: List[int]
6+
team_id: int
7+
my_id: int
8+
members_ids: List[int]
89

910
class AssignedChallenge(BaseModel):
10-
user_id: int
11-
assigned_challenge_id: int
12-
from_user_id: int
13-
category: str
14-
answer: str
11+
user_id: int
12+
assigned_challenge_id: int
13+
from_user_id: int
14+
category: str
15+
answer: str
16+
17+
class Config:
18+
json_schema_extra = {
19+
"example": {
20+
"team_id": 0,
21+
"my_id": 1,
22+
"members_ids": [
23+
2, 3, 4, 5
24+
]
25+
}
26+
}
27+
28+
class AnswerSubmitRequest(BaseModel):
29+
user_id: int
30+
challenge_id: int
31+
submitted_answer: str
32+
33+
class Config:
34+
json_schema_extra = {
35+
"example": {
36+
"user_id": 1,
37+
"challenge_id": 1,
38+
"submitted_answer": "LLM"
39+
}
40+
}
41+
42+
class AnswerSubmitResponse(BaseModel):
43+
is_correct: bool
1544

1645
class ChallengeResponse(BaseModel):
17-
team_id: int
18-
my_assigned: AssignedChallenge
19-
from datetime import datetime
20-
from typing import Optional
46+
team_id: int
47+
my_assigned: AssignedChallenge
2148

2249
class GoodsRedeemRequest(BaseModel):
2350
user_id: int

โ€Žgetcloser/backend/app/scripts/challenge_question.pyโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def seed_challenge_questions_from_csv(file_path: str):
1313
reader = csv.DictReader(csvfile)
1414
for row in reader:
1515
challenge = ChallengeQuestion(
16-
id=int(row["challenge_id"]),
16+
id=int(row["id"]),
1717
user_id=int(row["user_id"]),
1818
category=row["category"],
1919
answer=row["answer"]

โ€Žgetcloser/backend/app/services/challenge_service.pyโ€Ž

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,36 @@ def assign_challenges_logic(my_id: str, members: list, db: Session) -> list:
3838
return assigned_list[0]
3939

4040

41+
def submit_challenges_logic(user_id: str, challenge_id: int, submitted_answer: str, db: Session) -> bool:
42+
# 1. ์‚ฌ์šฉ์ž๊ฐ€ ํ‘ผ ๋ฌธ์ œ ์ฐพ๊ธฐ
43+
challenge = db.query(ChallengeQuestion).filter(
44+
ChallengeQuestion.user_id == user_id,
45+
ChallengeQuestion.id == challenge_id
46+
).first()
47+
48+
if not challenge:
49+
raise ValueError("ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ํ• ๋‹น๋œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")
50+
51+
# 2. ์›๋ณธ ๋ฌธ์ œ์—์„œ ์ •๋‹ต ํ™•์ธ
52+
question = db.query(ChallengeQuestion).filter(
53+
ChallengeQuestion.id == challenge.id
54+
).first()
55+
56+
if not question:
57+
raise ValueError("๋ฌธ์ œ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.")
58+
59+
# 3. ์ •๋‹ต ํŒ๋ณ„
60+
is_correct = (submitted_answer.strip().lower() == question.answer.strip().lower())
61+
62+
# 4. ๊ฒฐ๊ณผ ์ €์žฅ
63+
challenge.is_correct = is_correct
64+
challenge.submitted_answer = submitted_answer
65+
db.commit()
66+
67+
# 5. ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
68+
return is_correct
69+
70+
4171
def redeem_goods(db: Session, user_id: int):
4272
user = db.query(UserChallengeStatus).filter(UserChallengeStatus.user_id == user_id).first()
4373
if not user or not user.is_correct:

0 commit comments

Comments
ย (0)