Skip to content

Commit fc3ebc7

Browse files
authored
Merge pull request #277 from Pseudo-Lab/feat/getcloser/status
feat(getcloser): user status response
2 parents e459822 + 5c74d07 commit fc3ebc7

4 files changed

Lines changed: 87 additions & 3 deletions

File tree

โ€Žgetcloser/backend/app/api/v1/users/users.pyโ€Ž

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,31 @@
22
from core.dependencies import get_current_user
33
from fastapi import APIRouter, Depends
44
from models.users import User
5-
from services.user_service import get_user, parse_user_id
5+
from services.user_service import get_user, parse_user_id, progress_status
66
from sqlalchemy.orm import Session
7+
from schemas.user_schema import MeResponse
78

89
router = APIRouter()
910

1011
@router.get("/me")
1112
def get_my_info(
13+
db: Session = Depends(get_db),
1214
current_user: User = Depends(get_current_user),
1315
):
14-
return current_user
16+
team_id, challenge_id, status = progress_status(
17+
db=db,
18+
user_id=current_user["sub"],
19+
)
20+
return MeResponse(
21+
sub=str(current_user["sub"]),
22+
email=current_user["email"],
23+
name=current_user["name"],
24+
exp=current_user["exp"],
25+
26+
team_id=team_id,
27+
challenge_id=challenge_id,
28+
progress_status=status,
29+
)
1530

1631

1732
@router.get("/{id}")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import enum
2+
3+
class ProgressStatus(str, enum.Enum):
4+
NONE_TEAM = "NONE_TEAM" # ํŒ€ ์—†์Œ
5+
TEAM_WAITING = "TEAM_WAITING" # ํŒ€ ์ƒ์„ฑ๋จ, ๋Œ€๊ธฐ
6+
CHALLENGE_ASSIGNED = "CHALLENGE_ASSIGNED" # ๋ฌธ์ œ ํ• ๋‹น๋จ
7+
CHALLENGE_SUCCESS = "CHALLENGE_SUCCESS" # ๋ฌธ์ œ ์„ฑ๊ณต
8+
CHALLENGE_FAILED = "CHALLENGE_FAILED" # ์žฌ์‹œ๋„ ์ดˆ๊ณผ
9+
REDEEMED = "REDEEMED" # ๊ตฟ์ฆˆ ์ˆ˜๋ น ์™„๋ฃŒ

โ€Žgetcloser/backend/app/schemas/user_schema.pyโ€Ž

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
from pydantic import BaseModel, EmailStr
2+
from typing import Optional
3+
from core.enums import ProgressStatus
24

35
class UserAuth(BaseModel):
46
email: EmailStr
@@ -12,6 +14,16 @@ class Config:
1214

1315
class UserResponse(BaseModel):
1416
accessToken: str
15-
17+
18+
class MeResponse(BaseModel):
19+
sub: str
20+
email: str
21+
name: str
22+
exp: int
23+
24+
team_id: Optional[int]
25+
challenge_id: Optional[int]
26+
progress_status: ProgressStatus
27+
1628
class Config:
1729
orm_mode = True

โ€Žgetcloser/backend/app/services/user_service.pyโ€Ž

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from core.security import create_access_token
22
from exceptions.user_exceptions import UserNotFoundException
33
from models.users import User
4+
from models.teams import Team, TeamMember, TeamStatus
5+
from models.challenges import UserChallengeStatus
46
from sqlalchemy.orm import Session
7+
from core.enums import ProgressStatus
58

69

710
def auth_user(db: Session, email: str):
@@ -31,3 +34,48 @@ def parse_user_id(tag: str):
3134
return {"id": user_id}
3235
except ValueError:
3336
return {"error": "์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์˜ ์œ ์ € ํƒœ๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ: ๊น€๋ฏผ์ค€#0001"}
37+
38+
39+
def progress_status(
40+
db: Session,
41+
user_id: int,
42+
):
43+
# 1. ์œ ์ € ํŒ€ ์กฐํšŒ
44+
team_member = (
45+
db.query(TeamMember)
46+
.filter(TeamMember.user_id == user_id)
47+
.first()
48+
)
49+
50+
if not team_member:
51+
return None, None, ProgressStatus.NONE_TEAM
52+
53+
team = db.query(Team).get(team_member.team_id)
54+
55+
# 2. ํŒ€ ์ƒํƒœ
56+
if team.status == TeamStatus.PENDING:
57+
return team.id, None, ProgressStatus.TEAM_WAITING
58+
59+
if team.status == TeamStatus.FAILED:
60+
return team.id, None, ProgressStatus.FAILED
61+
62+
# 3. ๋ฌธ์ œ ์ƒํƒœ
63+
ucs = (
64+
db.query(UserChallengeStatus)
65+
.filter(UserChallengeStatus.user_id == user_id)
66+
.first()
67+
)
68+
69+
if not ucs:
70+
return team.id, None, ProgressStatus.CHALLENGE_ASSIGNED
71+
72+
if ucs.is_redeemed:
73+
return team.id, ucs.challenge_id, ProgressStatus.REDEEMED
74+
75+
if ucs.is_correct:
76+
return team.id, ucs.challenge_id, ProgressStatus.CHALLENGE_SUCCESS
77+
78+
if ucs.retry_count >= 2:
79+
return team.id, ucs.challenge_id, ProgressStatus.CHALLENGE_FAILED
80+
81+
return team.id, ucs.challenge_id, ProgressStatus.CHALLENGE_ASSIGNED

0 commit comments

Comments
ย (0)