|
2 | 2 | from sqlalchemy import func |
3 | 3 | from sqlalchemy.orm import Session |
4 | 4 | from models.teams import Team, TeamMember, TeamStatus |
5 | | -from schemas.team_schema import TeamCreateRequest |
| 5 | +from schemas.team_schema import TeamCreateRequest, TeamInfoResponse, MemberChallengeResponse, TeamMemberInfo |
6 | 6 | from fastapi import HTTPException |
7 | 7 | from typing import List |
8 | 8 | import os |
@@ -184,3 +184,89 @@ def dissolve_team_by_user(db: Session, user_id: int): |
184 | 184 | db.commit() |
185 | 185 |
|
186 | 186 | 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