Skip to content

Commit 098d26e

Browse files
authored
Merge pull request #238 from Pseudo-Lab/feat/getcloser/team-member-info
feat(getcloser): get team info and member challenge info
2 parents 9ee355a + ec60175 commit 098d26e

5 files changed

Lines changed: 124 additions & 37 deletions

File tree

getcloser/backend/app/api/v1/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,13 @@
44
from api.v1.teams import teams
55
from core.dependencies import get_current_user
66
from fastapi import APIRouter, Depends
7-
import core.websocket as websocket
87

98
private_router = APIRouter(
109
dependencies=[Depends(get_current_user)]
1110
)
1211
private_router.include_router(users.router, prefix="/users", tags=["users"])
1312
private_router.include_router(challenges.router, prefix="/challenges", tags=["challenges"])
1413
private_router.include_router(teams.router, prefix="/teams", tags=["teams"])
15-
private_router.include_router(websocket.router, prefix="/ws", tags=["ws"])
1614

1715
public_router = APIRouter()
1816
public_router.include_router(auth.router, prefix="/auth", tags=["auth"])

getcloser/backend/app/api/v1/teams/teams.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
from fastapi import APIRouter, Depends
22
from sqlalchemy.orm import Session
33
from core.database import get_db
4-
from schemas.team_schema import TeamCreateRequest, TeamCreateResponse, TeamStatusResponse
4+
from schemas.team_schema import TeamCreateRequest, TeamCreateResponse, TeamStatusResponse, MemberChallengeResponse
55
from services.team_service import create_team
66
from core.dependencies import get_current_user
7-
from core.websocket import notify_invitation
87

98
router = APIRouter()
109

@@ -21,3 +20,20 @@ def cancel_route(team_id: int, db: Session = Depends(get_db), current_user=Depen
2120
def status_route(team_id: int, db: Session = Depends(get_db), current_user=Depends(get_current_user)):
2221
res = get_team_status(db, team_id, current_user["sub"])
2322
return TeamStatusResponse(**res)
23+
24+
@router.get("/me")
25+
def get_my_team_info(
26+
db: Session = Depends(get_db),
27+
current_user=Depends(get_current_user)
28+
):
29+
return get_team_info(db, current_user["sub"])
30+
31+
@router.get("/{team_id}/members/{user_id}/challenge",
32+
response_model=MemberChallengeResponse)
33+
def get_member_challenge(
34+
team_id: int,
35+
user_id: int,
36+
db: Session = Depends(get_db),
37+
current_user=Depends(get_current_user)
38+
):
39+
return get_team_member_challenge(db, current_user["sub"], team_id, user_id)

getcloser/backend/app/core/websocket.py

Lines changed: 0 additions & 32 deletions
This file was deleted.

getcloser/backend/app/schemas/team_schema.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,22 @@ class TeamStatusResponse(BaseModel):
1515
team_id: int
1616
status: str
1717
members_ready: List[int]
18+
members_ids: List[int]
19+
20+
class TeamMemberInfo(BaseModel):
21+
user_id: int
22+
name: str
23+
github: Optional[str] = None
24+
linkedin: Optional[str] = None
25+
26+
class TeamInfoResponse(BaseModel):
27+
team_id: int
28+
status: str
29+
members: List[TeamMemberInfo]
30+
31+
class MemberChallengeResponse(BaseModel):
32+
user_id: int
33+
question: str
34+
user_answer: str
35+
correct_answer: str
36+
is_correct: bool

getcloser/backend/app/services/team_service.py

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from sqlalchemy import func
33
from sqlalchemy.orm import Session
44
from models.teams import Team, TeamMember, TeamStatus
5-
from schemas.team_schema import TeamCreateRequest
5+
from schemas.team_schema import TeamCreateRequest, TeamInfoResponse, MemberChallengeResponse, TeamMemberInfo
66
from fastapi import HTTPException
77
from typing import List
88
import os
@@ -184,3 +184,89 @@ def dissolve_team_by_user(db: Session, user_id: int):
184184
db.commit()
185185

186186
return {"message": f"Team {team_entry.id} dissolved due to quiz failure.", "team_id": team_entry.id}
187+
188+
def get_team_info(db: Session, user_id: int):
189+
team_member = (
190+
db.query(TeamMembers)
191+
.join(Team)
192+
.filter(
193+
TeamMember.user_id == user_id,
194+
Team.status.in_([TeamStatus.ACTIVE])
195+
)
196+
.order_by(Team.created_at.desc())
197+
.first()
198+
)
199+
200+
if not team_member:
201+
return {"message": "NOT ACTIVE TEAM"}
202+
203+
team = team_member.team
204+
205+
members = (
206+
db.query(User)
207+
.join(TeamMember, Team.user_id == User.id)
208+
.filter(TeamMember.team_id == team.id)
209+
.all()
210+
)
211+
212+
member_info = [
213+
TeamMemberInfo(
214+
user_id=member.id,
215+
name=member.name,
216+
github=member.github,
217+
linkedin=member.linkedin
218+
)
219+
for member in members
220+
]
221+
222+
return TeamInfoResponse(
223+
team_id=team.id,
224+
status=team.status.value,
225+
members=member_info
226+
)
227+
228+
def get_team_member_challenge(
229+
db: Session, requester_id: int, team_id: int, user_id: int
230+
) -> MemberChallengeResponse | dict:
231+
232+
is_member = (
233+
db.query(TeamMember)
234+
.filter(
235+
TeamMember.team_id == team_id,
236+
TeamMember.user_id == requester_id
237+
)
238+
.first()
239+
)
240+
if not is_member:
241+
raise HTTPException(status_code=403, detail="You are not in this team")
242+
243+
target = (
244+
db.query(TeamMember)
245+
.filter(
246+
TeamMember.team_id == team_id,
247+
TeamMember.user_id == user_id
248+
)
249+
.first()
250+
)
251+
252+
if not target:
253+
raise HTTPException(status_code=404, detail="User not in this team")
254+
255+
record = (
256+
db.query(UserChallengeStatus)
257+
.join(Challenge, Challenge.id == UserChallengeStatus.challenge_id)
258+
.filter(UserChallengeStatus.user_id == user_id)
259+
.order_by(UserChallengeStatus.created_at.desc())
260+
.first()
261+
)
262+
263+
if not record:
264+
return {"status": "NO_CHALLENGE"}
265+
266+
return MemberChallengeResponse(
267+
user_id=user_id,
268+
question=record.challenge.question,
269+
user_answer=record.answer,
270+
correct_answer=record.challenge.answer,
271+
is_correct=record.is_correct
272+
)

0 commit comments

Comments
 (0)