Include completion count in friend homework listing
This commit is contained in:
parent
f7ac481314
commit
a4b90e8219
@ -76,6 +76,7 @@ def update_character(
|
||||
character.name = req.name
|
||||
character.server = req.server
|
||||
character.combat_power = req.power
|
||||
character.is_public = req.is_public
|
||||
db.commit()
|
||||
return {"message": "캐릭터가 수정되었습니다."}
|
||||
|
||||
|
||||
@ -1,8 +1,14 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
from app.core.deps import get_db, get_current_user
|
||||
from app.schemas.friend import FriendRequestCreate, FriendRequestResponse, FriendResponse
|
||||
from app.schemas.friend import (
|
||||
FriendRequestCreate,
|
||||
FriendRequestResponse,
|
||||
FriendResponse,
|
||||
FriendListItem,
|
||||
)
|
||||
from app.schemas.character import CharacterResponse
|
||||
from app.schemas.dashboard import DashboardHomework
|
||||
from app.services import friend_service
|
||||
from app.models.user import User
|
||||
|
||||
@ -55,7 +61,7 @@ def respond_to_request(
|
||||
return {"detail": "요청을 처리했습니다."}
|
||||
|
||||
|
||||
@router.get("/list", response_model=list[int])
|
||||
@router.get("/list", response_model=list[FriendListItem])
|
||||
def get_friend_list(
|
||||
db: Session = Depends(get_db),
|
||||
current_user: User = Depends(get_current_user)
|
||||
@ -70,6 +76,24 @@ def get_friend_characters(
|
||||
):
|
||||
return friend_service.get_public_characters_of_friend(db, current_user.id, friend_id)
|
||||
|
||||
|
||||
@router.get(
|
||||
"/{friend_id}/characters/{character_id}/homeworks",
|
||||
response_model=list[DashboardHomework],
|
||||
)
|
||||
def get_friend_character_homeworks(
|
||||
friend_id: int,
|
||||
character_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: User = Depends(get_current_user)
|
||||
):
|
||||
return friend_service.get_public_homeworks_of_friend_character(
|
||||
db,
|
||||
current_user.id,
|
||||
friend_id,
|
||||
character_id,
|
||||
)
|
||||
|
||||
@router.delete("/{friend_id}")
|
||||
def delete_friend(
|
||||
friend_id: int,
|
||||
|
||||
@ -24,6 +24,7 @@ def register_homework_type(
|
||||
reset_type=homework_data.reset_type,
|
||||
reset_time=homework_data.reset_time or time(6, 0),
|
||||
clear_count=homework_data.clear_count or 0,
|
||||
is_public=homework_data.is_public,
|
||||
created_at=datetime.utcnow(),
|
||||
)
|
||||
db.add(homework_type)
|
||||
@ -56,6 +57,7 @@ def update_homework_type(
|
||||
homework_type.description = req.description
|
||||
homework_type.reset_type = req.reset_type
|
||||
homework_type.clear_count = req.clear_count
|
||||
homework_type.is_public = req.is_public
|
||||
|
||||
db.commit()
|
||||
return {"message": "숙제가 수정되었습니다."}
|
||||
|
||||
@ -21,6 +21,7 @@ def create_character(user_id: int, character_data: CharacterCreate, db: Session)
|
||||
server=character_data.server,
|
||||
job=character_data.job,
|
||||
combat_power=character_data.combat_power, # ← 수동 입력 허용
|
||||
is_public=character_data.is_public,
|
||||
created_at=datetime.utcnow(),
|
||||
updated_at=datetime.utcnow(),
|
||||
)
|
||||
|
||||
@ -10,6 +10,7 @@ def create_homework_type(user_id: int, data: HomeworkTypeCreate, db: Session):
|
||||
reset_type=data.reset_type,
|
||||
reset_time=data.reset_time,
|
||||
clear_count=data.clear_count,
|
||||
is_public=data.is_public,
|
||||
)
|
||||
db.add(new_homework)
|
||||
db.commit()
|
||||
|
||||
@ -10,6 +10,7 @@ class CharacterCreate(BaseModel):
|
||||
server: Optional[str] = None
|
||||
job: Optional[str] = None
|
||||
combat_power: Optional[int] = None # ← 추가
|
||||
is_public: bool = False
|
||||
|
||||
# 캐릭터 응답용
|
||||
class CharacterResponse(BaseModel):
|
||||
@ -18,6 +19,7 @@ class CharacterResponse(BaseModel):
|
||||
server: Optional[str]
|
||||
job: Optional[str]
|
||||
combat_power: Optional[int] # ← 추가
|
||||
is_public: bool
|
||||
auto_synced_at: Optional[datetime]
|
||||
created_at: datetime
|
||||
|
||||
@ -28,6 +30,7 @@ class CharacterUpdateRequest(BaseModel):
|
||||
name: constr(min_length=1)
|
||||
server: constr(min_length=1)
|
||||
power: conint(ge=0) # 0 이상 정수
|
||||
is_public: bool
|
||||
|
||||
class CharacterDetailResponse(BaseModel):
|
||||
id: int
|
||||
@ -35,6 +38,7 @@ class CharacterDetailResponse(BaseModel):
|
||||
server: str
|
||||
combat_power: int
|
||||
user_id: int
|
||||
is_public: bool
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
|
||||
@ -18,6 +18,8 @@ class FriendRequestResponse(BaseModel):
|
||||
id: int
|
||||
from_user_id: int
|
||||
to_user_id: int
|
||||
from_user_email: str | None = None
|
||||
to_user_email: str | None = None
|
||||
status: FriendRequestStatus
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
@ -34,3 +36,11 @@ class FriendResponse(BaseModel):
|
||||
|
||||
class Config:
|
||||
orm_mode = True
|
||||
|
||||
|
||||
class FriendListItem(BaseModel):
|
||||
id: int
|
||||
email: str
|
||||
|
||||
class Config:
|
||||
orm_mode = True
|
||||
|
||||
@ -10,6 +10,7 @@ class HomeworkTypeCreate(BaseModel):
|
||||
reset_type: str
|
||||
reset_time: Optional[time] = None
|
||||
clear_count: Optional[int] = 0
|
||||
is_public: bool = False
|
||||
|
||||
class HomeworkTypeResponse(BaseModel):
|
||||
id: int
|
||||
@ -18,6 +19,7 @@ class HomeworkTypeResponse(BaseModel):
|
||||
reset_type: str
|
||||
reset_time: time
|
||||
clear_count: int
|
||||
is_public: bool
|
||||
created_at: datetime
|
||||
|
||||
class Config:
|
||||
@ -35,6 +37,7 @@ class HomeworkTypeUpdateRequest(BaseModel):
|
||||
description: str | None = None
|
||||
reset_type: constr(min_length=1)
|
||||
clear_count: conint(ge=1)
|
||||
is_public: bool
|
||||
|
||||
class HomeworkTypeDetailResponse(BaseModel):
|
||||
id: int
|
||||
@ -44,6 +47,7 @@ class HomeworkTypeDetailResponse(BaseModel):
|
||||
reset_type: str
|
||||
reset_time: time
|
||||
clear_count: int
|
||||
is_public: bool
|
||||
created_at: datetime
|
||||
|
||||
model_config = {
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy.orm import Session, aliased
|
||||
from sqlalchemy import select
|
||||
from app.models.friend import FriendRequest, Friend, FriendRequestStatus
|
||||
from app.models.user import User
|
||||
from app.models.character import Character, CharacterHomework
|
||||
@ -44,17 +45,51 @@ def send_friend_request(db: Session, from_user_id: int, to_user_email: str):
|
||||
|
||||
|
||||
def get_received_requests(db: Session, user_id: int):
|
||||
return db.query(FriendRequest).filter(
|
||||
FriendRequest.to_user_id == user_id,
|
||||
FriendRequest.status == FriendRequestStatus.pending
|
||||
).all()
|
||||
sender = aliased(User)
|
||||
receiver = aliased(User)
|
||||
stmt = (
|
||||
select(
|
||||
FriendRequest.id,
|
||||
FriendRequest.from_user_id,
|
||||
FriendRequest.to_user_id,
|
||||
sender.email.label("from_user_email"),
|
||||
receiver.email.label("to_user_email"),
|
||||
FriendRequest.status,
|
||||
FriendRequest.created_at,
|
||||
FriendRequest.updated_at,
|
||||
)
|
||||
.join(sender, FriendRequest.from_user_id == sender.id)
|
||||
.join(receiver, FriendRequest.to_user_id == receiver.id)
|
||||
.where(
|
||||
FriendRequest.to_user_id == user_id,
|
||||
FriendRequest.status == FriendRequestStatus.pending,
|
||||
)
|
||||
)
|
||||
return db.execute(stmt).mappings().all()
|
||||
|
||||
|
||||
def get_sent_requests(db: Session, user_id: int):
|
||||
return db.query(FriendRequest).filter(
|
||||
FriendRequest.from_user_id == user_id,
|
||||
FriendRequest.status == FriendRequestStatus.pending
|
||||
).all()
|
||||
sender = aliased(User)
|
||||
receiver = aliased(User)
|
||||
stmt = (
|
||||
select(
|
||||
FriendRequest.id,
|
||||
FriendRequest.from_user_id,
|
||||
FriendRequest.to_user_id,
|
||||
sender.email.label("from_user_email"),
|
||||
receiver.email.label("to_user_email"),
|
||||
FriendRequest.status,
|
||||
FriendRequest.created_at,
|
||||
FriendRequest.updated_at,
|
||||
)
|
||||
.join(sender, FriendRequest.from_user_id == sender.id)
|
||||
.join(receiver, FriendRequest.to_user_id == receiver.id)
|
||||
.where(
|
||||
FriendRequest.from_user_id == user_id,
|
||||
FriendRequest.status == FriendRequestStatus.pending,
|
||||
)
|
||||
)
|
||||
return db.execute(stmt).mappings().all()
|
||||
|
||||
|
||||
def cancel_sent_request(db: Session, request_id: int, user_id: int):
|
||||
@ -104,7 +139,9 @@ def get_friend_list(db: Session, user_id: int):
|
||||
result = []
|
||||
for f in friends:
|
||||
friend_id = f.user_id_2 if f.user_id_1 == user_id else f.user_id_1
|
||||
result.append(friend_id)
|
||||
friend = db.query(User).filter(User.id == friend_id).first()
|
||||
friend_email = friend.email if friend else None
|
||||
result.append({"id": friend_id, "email": friend_email})
|
||||
|
||||
return result
|
||||
|
||||
@ -151,13 +188,34 @@ def get_public_homeworks_of_friend_character(
|
||||
if not character:
|
||||
raise HTTPException(status_code=404, detail="공개된 캐릭터를 찾을 수 없습니다.")
|
||||
|
||||
# 3. 공개된 숙제만 조회
|
||||
results = db.query(HomeworkType).join(CharacterHomework).filter(
|
||||
CharacterHomework.character_id == character_id,
|
||||
HomeworkType.is_public == True
|
||||
).all()
|
||||
# 3. 공개된 숙제만 조회하며 완료 횟수도 포함
|
||||
rows = (
|
||||
db.query(
|
||||
HomeworkType.id.label("homework_id"),
|
||||
HomeworkType.title,
|
||||
HomeworkType.reset_type,
|
||||
HomeworkType.clear_count,
|
||||
CharacterHomework.complete_cnt,
|
||||
)
|
||||
.join(CharacterHomework, CharacterHomework.homework_type_id == HomeworkType.id)
|
||||
.filter(
|
||||
CharacterHomework.character_id == character_id,
|
||||
HomeworkType.is_public == True,
|
||||
)
|
||||
.order_by(HomeworkType.order.asc())
|
||||
.all()
|
||||
)
|
||||
|
||||
return results
|
||||
return [
|
||||
{
|
||||
"homework_id": row[0],
|
||||
"title": row[1],
|
||||
"reset_type": row[2],
|
||||
"clear_count": row[3],
|
||||
"complete_cnt": row[4],
|
||||
}
|
||||
for row in rows
|
||||
]
|
||||
|
||||
def delete_friend(db: Session, user_id: int, friend_id: int):
|
||||
user_ids = sorted([user_id, friend_id])
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user