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
36 changes: 32 additions & 4 deletions getcloser/backend/app/api/v1/teams/teams.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,39 @@
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from core.database import get_db
from schemas.team_schema import TeamCreateRequest, TeamResponse
from schemas.team_schema import TeamCreateRequest, TeamCreateResponse, TeamStatusResponse, MemberChallengeResponse
from services.team_service import create_team
from core.dependencies import get_current_user

router = APIRouter()

@router.post("/create", response_model=TeamResponse)
def create_team_route(req: TeamCreateRequest, db: Session = Depends(get_db)):
return create_team(db, req)
@router.post("/create", response_model=TeamCreateResponse)
async def create_team_route(req: TeamCreateRequest, db: Session = Depends(get_db), current_user=Depends(get_current_user)):
res = create_team(db, int(current_user["sub"]), req.member_ids)
return TeamCreateResponse(**res)

@router.post("/{team_id}/cancel")
def cancel_route(team_id: int, db: Session = Depends(get_db), current_user=Depends(get_current_user)):
return cancel_team(db, team_id, current_user["sub"])

@router.get("/{team_id}/status", response_model=TeamStatusResponse)
def status_route(team_id: int, db: Session = Depends(get_db), current_user=Depends(get_current_user)):
res = get_team_status(db, team_id, current_user["sub"])
return TeamStatusResponse(**res)

@router.get("/me")
def get_my_team_info(
db: Session = Depends(get_db),
current_user=Depends(get_current_user)
):
return get_team_info(db, current_user["sub"])

@router.get("/{team_id}/members/{user_id}/challenge",
response_model=MemberChallengeResponse)
def get_member_challenge(
team_id: int,
user_id: int,
db: Session = Depends(get_db),
current_user=Depends(get_current_user)
):
return get_team_member_challenge(db, current_user["sub"], team_id, user_id)
2 changes: 1 addition & 1 deletion getcloser/backend/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
origins = os.getenv("CORS_ORIGINS", "").split(",")
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
Expand Down
34 changes: 28 additions & 6 deletions getcloser/backend/app/models/teams.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,37 @@
from core.database import Base
from sqlalchemy import Column, Integer, Boolean, UniqueConstraint
from sqlalchemy import Column, Integer, Boolean, UniqueConstraint, Enum, DateTime, ForeignKey, String
import enum
from datetime import datetime, timedelta
from sqlalchemy.orm import relationship

class TeamStatus(str, enum.Enum):
PENDING = "PENDING"
ACTIVE = "ACTIVE"
CANCELLED = "CANCELLED"
FAILED = "FAILED"


class Team(Base):
__tablename__ = "teams"

id = Column(Integer, primary_key=True, index=True)
team_id = Column(Integer, index=True)
user_id = Column(Integer, index=True)
is_active = Column(Boolean, default=True)
group_hash = Column(String, index=True)
status = Column(Enum(TeamStatus), nullable=False, default=TeamStatus.PENDING)
created_at = Column(DateTime(timezone=True), default=datetime.utcnow)

members = relationship("TeamMember", back_populates="team", cascade="all, delete-orphan")


class TeamMember(Base):
__tablename__ = "team_members"

id = Column(Integer, primary_key=True, index=True)
team_id = Column(Integer, ForeignKey("teams.id", ondelete="CASCADE"), index=True, nullable=False)
user_id = Column(Integer, index=True, nullable=False)
confirmed = Column(Boolean, default=False)

team = relationship("Team", back_populates="members")

__table_args__ = (
UniqueConstraint('team_id', 'user_id', name='_team_user_uc'),
__table_args__ = (
UniqueConstraint("team_id", "user_id", name="u_team_user"),
)
39 changes: 28 additions & 11 deletions getcloser/backend/app/schemas/team_schema.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,36 @@
from pydantic import BaseModel, Field
from typing import List
from typing import List, Optional
from datetime import datetime


class TeamCreateRequest(BaseModel):
my_id: int
member_ids: List[int] = Field(..., min_items=4, max_items=4, description="ํŒ€์› 4๋ช…์˜ ID")
member_ids: List[int] = Field(..., min_items=1, max_items=4, description="ํŒ€์› 4๋ช…์˜ ID")

class Config:
json_schema_extra = {
"example": {
"my_id": 1,
"member_ids": [2, 3, 4, 5]
}
}
class TeamCreateResponse(BaseModel):
team_id: int
status: str
message: str

class TeamResponse(BaseModel):
class TeamStatusResponse(BaseModel):
team_id: int
status: str
members_ready: List[int]
members_ids: List[int]

class TeamMemberInfo(BaseModel):
user_id: int
name: str
github: Optional[str] = None
linkedin: Optional[str] = None

class TeamInfoResponse(BaseModel):
team_id: int
status: str
members: List[TeamMemberInfo]

class MemberChallengeResponse(BaseModel):
user_id: int
question: str
user_answer: str
correct_answer: str
is_correct: bool
Loading
Loading