Skip to content

Commit 9f3a97d

Browse files
authored
Merge pull request #191 from Pseudo-Lab/feat/team-dissolve
feat(getcloser): Team disbandment function after 2 failures
2 parents 9e9e8af + f97ca41 commit 9f3a97d

File tree

3 files changed

+60
-24
lines changed

3 files changed

+60
-24
lines changed

getcloser/backend/app/models/teams.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from core.database import Base
2-
from sqlalchemy import Column, Integer, UniqueConstraint
2+
from sqlalchemy import Column, Integer, Boolean, UniqueConstraint
33

44

55
class Team(Base):
66
__tablename__ = "teams"
77

88
id = Column(Integer, primary_key=True, index=True)
99
team_id = Column(Integer, index=True)
10-
user_id = Column(Integer, unique=True, index=True)
10+
user_id = Column(Integer, index=True)
11+
is_active = Column(Boolean, default=True)
1112

1213
__table_args__ = (
1314
UniqueConstraint('team_id', 'user_id', name='_team_user_uc'),

getcloser/backend/app/services/challenge_service.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from services import team_service
12
import random
23
from sqlalchemy.orm import Session
34
from fastapi import HTTPException
@@ -58,14 +59,17 @@ def retry_challenge(db: Session, user_id: int):
5859
raise HTTPException(status=404, detail="User not found")
5960
if user_status.is_correct:
6061
raise HTTPException(status_code=400, detail="Already solved correctly")
61-
if user_status.retry_count >= 1:
62-
raise HTTPException(status_code=400, detail="Retry limit reached")
6362

64-
user_status.retry_count += 1
65-
db.commit()
66-
db.refresh(user_status)
67-
68-
return {
69-
"message": "Retry granted",
70-
"retry_count": user_status.retry_count
71-
}
63+
if user_status.retry_count == 0:
64+
user_status.retry_count += 1
65+
db.commit()
66+
return {
67+
"message": "Retry granted",
68+
"retry_count": user_status.retry_count
69+
}
70+
elif user_status.retry_count >= 1:
71+
team_service.dissolve_team_by_user(db, user_id)
72+
return {
73+
"message": "Team dissolved due to repeated failure",
74+
"retry_count": user_status.retry_count
75+
}
Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from models.challenges import UserChallengeStatus
2+
from sqlalchemy import func
13
from sqlalchemy.orm import Session
24
from models.teams import Team
35
from schemas.team_schema import TeamCreateRequest, TeamResponse
@@ -6,22 +8,51 @@
68
def create_team(db: Session, req: TeamCreateRequest) -> TeamResponse:
79
all_ids = [req.my_id] + req.member_ids
810

9-
existing = db.query(Team).filter(Team.user_id.in_(all_ids)).all()
10-
if existing:
11-
raise HTTPException(status_code=400, detail="Some users are already in a team.")
12-
13-
last_team = (
14-
db.query(Team)
15-
.order_by(Team.team_id.desc())
16-
.with_for_update()
17-
.first()
11+
records = (
12+
db.query(Team.user_id, Team.is_active, UserChallengeStatus.is_correct)
13+
.outerjoin(UserChallengeStatus, Team.user_id == UserChallengeStatus.user_id)
14+
.filter(Team.user_id.in_(all_ids))
15+
.all()
1816
)
17+
18+
active_ids = [r.user_id for r in records if r.is_active]
19+
corrected_ids = [r.user_id for r in records if r.is_correct]
20+
21+
if active_ids:
22+
raise HTTPException(
23+
status_code=400,
24+
detail=f"Users already in active team: {active_ids}",
25+
)
26+
27+
if corrected_ids:
28+
raise HTTPException(
29+
status_code=400,
30+
detail=f"Users already corrected: {corrected_ids}",
31+
)
1932

20-
new_team_id = (last_team.team_id + 1) if last_team else 1
33+
last_team_id = db.query(func.max(Team.team_id)).scalar()
34+
new_team_id = (last_team_id or 0) + 1
2135

22-
for uid in all_ids:
23-
db.add(Team(team_id=new_team_id, user_id=uid))
36+
teams_to_add = [
37+
{"team_id": new_team_id, "user_id": uid, "is_active": True}
38+
for uid in all_ids
39+
]
2440

41+
db.bulk_insert_mappings(Team, teams_to_add)
2542
db.commit()
2643

2744
return TeamResponse(team_id=new_team_id, members_ids=all_ids)
45+
46+
def dissolve_team_by_user(db: Session, user_id: int):
47+
team_entry = db.query(Team).filter(Team.user_id == user_id, Team.is_active == True).first()
48+
if not team_entry:
49+
raise HTTPException(status_code=400, detail="User not in active team")
50+
51+
team_id = team_entry.team_id
52+
team_members = db.query(Team).filter(Team.team_id == team_id, Team.is_active == True).all()
53+
54+
for member in team_members:
55+
member.is_active = False
56+
57+
db.commit()
58+
return {"message": f"Team {team_id} dissolved", "team_id": team_id}

0 commit comments

Comments
 (0)