Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions getcloser/backend/app/models/challenges.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
1 change: 0 additions & 1 deletion getcloser/backend/app/schemas/challenge_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class Config:
class AssignedChallenge(BaseModel):
user_id: int
assigned_challenge_id: int
from_user_id: int
category: str
answer: str

Expand Down
4 changes: 0 additions & 4 deletions getcloser/backend/app/scripts/challenge_question.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
92 changes: 51 additions & 41 deletions getcloser/backend/app/services/challenge_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -28,65 +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)

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)

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
))

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
)
Expand Down
Loading