From 53ee23da0ac1373b823cd732007591e80d4f3a36 Mon Sep 17 00:00:00 2001 From: HanNayeoniee Date: Fri, 19 Dec 2025 00:14:10 +0900 Subject: [PATCH 1/3] =?UTF-8?q?UserChallengeStatus=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- getcloser/backend/app/models/challenges.py | 5 +++-- .../backend/app/services/challenge_service.py | 22 ++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/getcloser/backend/app/models/challenges.py b/getcloser/backend/app/models/challenges.py index a607e2a..5570462 100644 --- a/getcloser/backend/app/models/challenges.py +++ b/getcloser/backend/app/models/challenges.py @@ -6,8 +6,9 @@ class UserChallengeStatus(Base): __tablename__ = "user_challenge_status" - user_id = Column(Integer, primary_key=True, index=True) - challenge_id = Column(Integer, ForeignKey("challenge_questions.id"), index=True) + id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, index=True) + challenge_id = Column(Integer, ForeignKey("challenge_questions.id"), nullable=True) is_correct = Column(Boolean, default=False) submitted_at = Column(DateTime(timezone=True)) diff --git a/getcloser/backend/app/services/challenge_service.py b/getcloser/backend/app/services/challenge_service.py index 8a870d5..365c31a 100644 --- a/getcloser/backend/app/services/challenge_service.py +++ b/getcloser/backend/app/services/challenge_service.py @@ -36,6 +36,7 @@ def assign_challenges_logic(my_id: str, members: list, db: Session) -> list: available_ids = members.copy() random.shuffle(available_ids) + members = list(set(members)) for user_id in members: possible_ids = [uid for uid in available_ids if uid != user_id] if not possible_ids: @@ -43,9 +44,26 @@ def assign_challenges_logic(my_id: str, members: list, db: Session) -> list: assigned_user_id = random.choice(possible_ids) assigned_question = random.choice([q for q in team_questions if q.user_id == assigned_user_id]) - + available_ids.remove(assigned_user_id) + # ✅ UserChallengeStatus 업데이트 + user_status = ( + db.query(UserChallengeStatus) + .filter(UserChallengeStatus.user_id == user_id) + .first() + ) + + if not user_status: + raise HTTPException(status_code=404, detail="UserChallengeStatus 없음") + + user_status.challenge_id = assigned_question.id + user_status.submitted_at = None + user_status.is_correct = False + user_status.is_redeemed = False + + db.add(user_status) + assigned_list.append(AssignedChallenge( user_id=user_id, assigned_challenge_id=assigned_question.id, @@ -54,6 +72,8 @@ def assign_challenges_logic(my_id: str, members: list, db: Session) -> list: answer=assigned_question.answer )) + db.commit() + return assigned_list[0] From ce085c92ae0e9d5858e70ac5bc547b3dd97a7df0 Mon Sep 17 00:00:00 2001 From: HanNayeoniee Date: Mon, 29 Dec 2025 23:15:19 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20from=5Fuser=5Fid=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- getcloser/backend/app/schemas/challenge_schema.py | 1 - getcloser/backend/app/scripts/challenge_question.py | 4 ---- 2 files changed, 5 deletions(-) diff --git a/getcloser/backend/app/schemas/challenge_schema.py b/getcloser/backend/app/schemas/challenge_schema.py index fa32c2e..c38c868 100644 --- a/getcloser/backend/app/schemas/challenge_schema.py +++ b/getcloser/backend/app/schemas/challenge_schema.py @@ -21,7 +21,6 @@ class Config: class AssignedChallenge(BaseModel): user_id: int assigned_challenge_id: int - from_user_id: int category: str answer: str diff --git a/getcloser/backend/app/scripts/challenge_question.py b/getcloser/backend/app/scripts/challenge_question.py index c45b515..51289c8 100644 --- a/getcloser/backend/app/scripts/challenge_question.py +++ b/getcloser/backend/app/scripts/challenge_question.py @@ -31,7 +31,3 @@ def seed_challenge_questions_from_csv(file_path: str): finally: db.close() - - -# if __name__ == "__main__": -# seed_challenge_questions_from_csv("./scripts/challenge_question.csv") From 97bfa79d2c49bda8fdbcb7ad6d7e7b7db66c09d3 Mon Sep 17 00:00:00 2001 From: HanNayeoniee Date: Mon, 29 Dec 2025 23:15:49 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EB=AC=B8=EC=A0=9C=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=20=EB=B0=8F=20=ED=8C=90=EB=B3=84=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/app/services/challenge_service.py | 112 ++++++++---------- 1 file changed, 51 insertions(+), 61 deletions(-) diff --git a/getcloser/backend/app/services/challenge_service.py b/getcloser/backend/app/services/challenge_service.py index 365c31a..336856b 100644 --- a/getcloser/backend/app/services/challenge_service.py +++ b/getcloser/backend/app/services/challenge_service.py @@ -12,7 +12,7 @@ def assign_challenges_logic(my_id: str, members: list, db: Session) -> list: # 현재 사용자 retry_count 조회 status = db.query(UserChallengeStatus).filter(UserChallengeStatus.user_id == my_id).first() - # ✅ 없으면 생성 + # status 없으면 생성 if not status: status = UserChallengeStatus( user_id=my_id, @@ -28,85 +28,75 @@ def assign_challenges_logic(my_id: str, members: list, db: Session) -> list: if status.retry_count >= 2: return {"message": "retry_count가 2 이상입니다. 팀을 다시 구성해주세요."} + # 팀원들이 만든 문제 조회 team_questions = db.query(ChallengeQuestion).filter(ChallengeQuestion.user_id.in_(members)).all() - if len(team_questions) < len(members): - raise ValueError("팀원 문제가 충분하지 않습니다.") - - assigned_list = [] - available_ids = members.copy() - random.shuffle(available_ids) - - members = list(set(members)) - for user_id in members: - possible_ids = [uid for uid in available_ids if uid != user_id] - if not possible_ids: - raise ValueError(f"{user_id}에게 할당할 문제 부족") - - assigned_user_id = random.choice(possible_ids) - assigned_question = random.choice([q for q in team_questions if q.user_id == assigned_user_id]) - - available_ids.remove(assigned_user_id) - - # ✅ UserChallengeStatus 업데이트 - user_status = ( - db.query(UserChallengeStatus) - .filter(UserChallengeStatus.user_id == user_id) - .first() - ) - - if not user_status: - raise HTTPException(status_code=404, detail="UserChallengeStatus 없음") - - user_status.challenge_id = assigned_question.id - user_status.submitted_at = None - user_status.is_correct = False - user_status.is_redeemed = False - - db.add(user_status) - - assigned_list.append(AssignedChallenge( - user_id=user_id, - assigned_challenge_id=assigned_question.id, - from_user_id=assigned_question.user_id, - category=assigned_question.category, - answer=assigned_question.answer - )) - - db.commit() - - return assigned_list[0] - - -def submit_challenges_logic(user_id: str, challenge_id: int, submitted_answer: str, db: Session) -> bool: - # 1. 사용자가 푼 문제 찾기 - challenge = db.query(ChallengeQuestion).filter( - ChallengeQuestion.user_id == user_id, - ChallengeQuestion.id == challenge_id - ).first() + if not team_questions: + raise ValueError("배정할 문제가 없습니다.") + + # 셔플 후 1개 선택 + selected_question = random.choice(team_questions) + + # AssignedChallenge로 변환 + assigned_challenge = AssignedChallenge( + assigned_challenge_id=selected_question.id, + user_id=selected_question.user_id, # 문제 출제자 + category=selected_question.category, + answer=selected_question.answer, + ) + + # ✅ UserChallengeStatus 업데이트 + user_status = ( + db.query(UserChallengeStatus) + .filter(UserChallengeStatus.user_id == my_id) + .first() + ) + + if not user_status: + raise HTTPException(status_code=404, detail="UserChallengeStatus 없음") + + user_status.challenge_id = selected_question.id + user_status.submitted_at = None + user_status.is_correct = False + user_status.is_redeemed = False + + db.add(user_status) + db.commit() + + return assigned_challenge + + +def submit_challenges_logic(my_id: str, challenge_id: int, submitted_answer: str, db: Session) -> bool: + # # 1. 사용자가 푼 문제 찾기 + # challenge = db.query(ChallengeQuestion).filter( + # ChallengeQuestion.user_id == user_id, + # ChallengeQuestion.id == challenge_id + # ).first() - if not challenge: - raise ValueError("해당 사용자의 할당된 문제가 없습니다.") + # if not challenge: + # raise ValueError("해당 사용자의 할당된 문제가 없습니다.") # 2. 원본 문제에서 정답 확인 question = db.query(ChallengeQuestion).filter( - ChallengeQuestion.id == challenge.id + ChallengeQuestion.id == challenge_id ).first() if not question: raise ValueError("문제 정보를 찾을 수 없습니다.") # 3. 정답 판별 - is_correct = (submitted_answer.strip().lower() == question.answer.strip().lower()) + answer_keyword = max(question.answer.lower().split(), key=len) + submitted = submitted_answer.strip().lower() + is_correct = answer_keyword in submitted # 4. UserChallengeStatus 조회 또는 생성 status = db.query(UserChallengeStatus).filter( - UserChallengeStatus.user_id == user_id, + UserChallengeStatus.user_id == my_id, UserChallengeStatus.challenge_id == challenge_id ).first() if not status: status = UserChallengeStatus( - user_id=user_id, + user_id=my_id, challenge_id=challenge_id, retry_count=0 )