Add endpoint for friend character public homeworks
This commit is contained in:
parent
f7ac481314
commit
55c5a1da01
@ -76,6 +76,7 @@ def update_character(
|
|||||||
character.name = req.name
|
character.name = req.name
|
||||||
character.server = req.server
|
character.server = req.server
|
||||||
character.combat_power = req.power
|
character.combat_power = req.power
|
||||||
|
character.is_public = req.is_public
|
||||||
db.commit()
|
db.commit()
|
||||||
return {"message": "캐릭터가 수정되었습니다."}
|
return {"message": "캐릭터가 수정되었습니다."}
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,14 @@
|
|||||||
from fastapi import APIRouter, Depends, HTTPException
|
from fastapi import APIRouter, Depends, HTTPException
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
from app.core.deps import get_db, get_current_user
|
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.character import CharacterResponse
|
||||||
|
from app.schemas.homework import HomeworkTypeResponse
|
||||||
from app.services import friend_service
|
from app.services import friend_service
|
||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
|
|
||||||
@ -55,7 +61,7 @@ def respond_to_request(
|
|||||||
return {"detail": "요청을 처리했습니다."}
|
return {"detail": "요청을 처리했습니다."}
|
||||||
|
|
||||||
|
|
||||||
@router.get("/list", response_model=list[int])
|
@router.get("/list", response_model=list[FriendListItem])
|
||||||
def get_friend_list(
|
def get_friend_list(
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
current_user: User = Depends(get_current_user)
|
current_user: User = Depends(get_current_user)
|
||||||
@ -70,6 +76,21 @@ def get_friend_characters(
|
|||||||
):
|
):
|
||||||
return friend_service.get_public_characters_of_friend(db, current_user.id, friend_id)
|
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[HomeworkTypeResponse])
|
||||||
|
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}")
|
@router.delete("/{friend_id}")
|
||||||
def delete_friend(
|
def delete_friend(
|
||||||
friend_id: int,
|
friend_id: int,
|
||||||
|
|||||||
@ -24,6 +24,7 @@ def register_homework_type(
|
|||||||
reset_type=homework_data.reset_type,
|
reset_type=homework_data.reset_type,
|
||||||
reset_time=homework_data.reset_time or time(6, 0),
|
reset_time=homework_data.reset_time or time(6, 0),
|
||||||
clear_count=homework_data.clear_count or 0,
|
clear_count=homework_data.clear_count or 0,
|
||||||
|
is_public=homework_data.is_public,
|
||||||
created_at=datetime.utcnow(),
|
created_at=datetime.utcnow(),
|
||||||
)
|
)
|
||||||
db.add(homework_type)
|
db.add(homework_type)
|
||||||
@ -56,6 +57,7 @@ def update_homework_type(
|
|||||||
homework_type.description = req.description
|
homework_type.description = req.description
|
||||||
homework_type.reset_type = req.reset_type
|
homework_type.reset_type = req.reset_type
|
||||||
homework_type.clear_count = req.clear_count
|
homework_type.clear_count = req.clear_count
|
||||||
|
homework_type.is_public = req.is_public
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
return {"message": "숙제가 수정되었습니다."}
|
return {"message": "숙제가 수정되었습니다."}
|
||||||
|
|||||||
@ -21,6 +21,7 @@ def create_character(user_id: int, character_data: CharacterCreate, db: Session)
|
|||||||
server=character_data.server,
|
server=character_data.server,
|
||||||
job=character_data.job,
|
job=character_data.job,
|
||||||
combat_power=character_data.combat_power, # ← 수동 입력 허용
|
combat_power=character_data.combat_power, # ← 수동 입력 허용
|
||||||
|
is_public=character_data.is_public,
|
||||||
created_at=datetime.utcnow(),
|
created_at=datetime.utcnow(),
|
||||||
updated_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_type=data.reset_type,
|
||||||
reset_time=data.reset_time,
|
reset_time=data.reset_time,
|
||||||
clear_count=data.clear_count,
|
clear_count=data.clear_count,
|
||||||
|
is_public=data.is_public,
|
||||||
)
|
)
|
||||||
db.add(new_homework)
|
db.add(new_homework)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|||||||
@ -10,6 +10,7 @@ class CharacterCreate(BaseModel):
|
|||||||
server: Optional[str] = None
|
server: Optional[str] = None
|
||||||
job: Optional[str] = None
|
job: Optional[str] = None
|
||||||
combat_power: Optional[int] = None # ← 추가
|
combat_power: Optional[int] = None # ← 추가
|
||||||
|
is_public: bool = False
|
||||||
|
|
||||||
# 캐릭터 응답용
|
# 캐릭터 응답용
|
||||||
class CharacterResponse(BaseModel):
|
class CharacterResponse(BaseModel):
|
||||||
@ -18,6 +19,7 @@ class CharacterResponse(BaseModel):
|
|||||||
server: Optional[str]
|
server: Optional[str]
|
||||||
job: Optional[str]
|
job: Optional[str]
|
||||||
combat_power: Optional[int] # ← 추가
|
combat_power: Optional[int] # ← 추가
|
||||||
|
is_public: bool
|
||||||
auto_synced_at: Optional[datetime]
|
auto_synced_at: Optional[datetime]
|
||||||
created_at: datetime
|
created_at: datetime
|
||||||
|
|
||||||
@ -28,6 +30,7 @@ class CharacterUpdateRequest(BaseModel):
|
|||||||
name: constr(min_length=1)
|
name: constr(min_length=1)
|
||||||
server: constr(min_length=1)
|
server: constr(min_length=1)
|
||||||
power: conint(ge=0) # 0 이상 정수
|
power: conint(ge=0) # 0 이상 정수
|
||||||
|
is_public: bool
|
||||||
|
|
||||||
class CharacterDetailResponse(BaseModel):
|
class CharacterDetailResponse(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
@ -35,6 +38,7 @@ class CharacterDetailResponse(BaseModel):
|
|||||||
server: str
|
server: str
|
||||||
combat_power: int
|
combat_power: int
|
||||||
user_id: int
|
user_id: int
|
||||||
|
is_public: bool
|
||||||
created_at: datetime
|
created_at: datetime
|
||||||
updated_at: datetime
|
updated_at: datetime
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,8 @@ class FriendRequestResponse(BaseModel):
|
|||||||
id: int
|
id: int
|
||||||
from_user_id: int
|
from_user_id: int
|
||||||
to_user_id: int
|
to_user_id: int
|
||||||
|
from_user_email: str | None = None
|
||||||
|
to_user_email: str | None = None
|
||||||
status: FriendRequestStatus
|
status: FriendRequestStatus
|
||||||
created_at: datetime
|
created_at: datetime
|
||||||
updated_at: datetime
|
updated_at: datetime
|
||||||
@ -34,3 +36,11 @@ class FriendResponse(BaseModel):
|
|||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
orm_mode = True
|
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_type: str
|
||||||
reset_time: Optional[time] = None
|
reset_time: Optional[time] = None
|
||||||
clear_count: Optional[int] = 0
|
clear_count: Optional[int] = 0
|
||||||
|
is_public: bool = False
|
||||||
|
|
||||||
class HomeworkTypeResponse(BaseModel):
|
class HomeworkTypeResponse(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
@ -18,6 +19,7 @@ class HomeworkTypeResponse(BaseModel):
|
|||||||
reset_type: str
|
reset_type: str
|
||||||
reset_time: time
|
reset_time: time
|
||||||
clear_count: int
|
clear_count: int
|
||||||
|
is_public: bool
|
||||||
created_at: datetime
|
created_at: datetime
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
@ -35,6 +37,7 @@ class HomeworkTypeUpdateRequest(BaseModel):
|
|||||||
description: str | None = None
|
description: str | None = None
|
||||||
reset_type: constr(min_length=1)
|
reset_type: constr(min_length=1)
|
||||||
clear_count: conint(ge=1)
|
clear_count: conint(ge=1)
|
||||||
|
is_public: bool
|
||||||
|
|
||||||
class HomeworkTypeDetailResponse(BaseModel):
|
class HomeworkTypeDetailResponse(BaseModel):
|
||||||
id: int
|
id: int
|
||||||
@ -44,6 +47,7 @@ class HomeworkTypeDetailResponse(BaseModel):
|
|||||||
reset_type: str
|
reset_type: str
|
||||||
reset_time: time
|
reset_time: time
|
||||||
clear_count: int
|
clear_count: int
|
||||||
|
is_public: bool
|
||||||
created_at: datetime
|
created_at: datetime
|
||||||
|
|
||||||
model_config = {
|
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.friend import FriendRequest, Friend, FriendRequestStatus
|
||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
from app.models.character import Character, CharacterHomework
|
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):
|
def get_received_requests(db: Session, user_id: int):
|
||||||
return db.query(FriendRequest).filter(
|
sender = aliased(User)
|
||||||
FriendRequest.to_user_id == user_id,
|
receiver = aliased(User)
|
||||||
FriendRequest.status == FriendRequestStatus.pending
|
stmt = (
|
||||||
).all()
|
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):
|
def get_sent_requests(db: Session, user_id: int):
|
||||||
return db.query(FriendRequest).filter(
|
sender = aliased(User)
|
||||||
FriendRequest.from_user_id == user_id,
|
receiver = aliased(User)
|
||||||
FriendRequest.status == FriendRequestStatus.pending
|
stmt = (
|
||||||
).all()
|
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):
|
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 = []
|
result = []
|
||||||
for f in friends:
|
for f in friends:
|
||||||
friend_id = f.user_id_2 if f.user_id_1 == user_id else f.user_id_1
|
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
|
return result
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user