Closed CutTheWire closed 3 months ago
async def remove_chatlog_value(self, user_id: str, document_id: str, selected_count: int) -> str:
"""
특정 대화의 최신 대화 ~ 선택한 대화를 지웁니다.
:param user_id: 사용자 ID
:param document_id: 문서의 ID
:param selected_count: 선택한 대화의 인덱스
:return: 성공 메시지
:raises NotFoundException: 문서가 존재하지 않을 경우
:raises InternalServerErrorException: 데이터를 제거하는 도중 문제가 발생할 경우
"""
try:
collection = self.db[f'chatlog_{user_id}']
document = await collection.find_one({"id": document_id})
if document is None:
raise NotFoundException(f"No document found with ID: {document_id}")
# 'value' 필드에서 삭제할 항목 필터링 (selected_count 이상)
value_to_remove = [item for item in document.get("value", []) if item.get("index") >= selected_count]
if not value_to_remove:
raise NotFoundException(f"No data found to remove starting from index: {selected_count}")
# 해당 index부터 마지막 데이터까지 삭제
result = await collection.update_one(
{"id": document_id},
{"$pull": {"value": {"index": {"$gte": selected_count}}}}
)
if result.modified_count > 0:
return f"Successfully removed data from index: {selected_count} to the end in document with ID: {document_id}"
else:
raise NotFoundException(f"No data removed for document with ID: {document_id}")
except PyMongoError as e:
raise InternalServerErrorException(detail=f"Error removing chatlog value: {str(e)}")
except Exception as e:
raise InternalServerErrorException(detail=f"Unexpected error: {str(e)}")
스택형태로 가장 최신 데이터부터 지정한 index까지 삭제하는 기능으로 @mongo_router.delete의 "/chat/delete_log"에 해당 기능을 사용 중이다.
class ChatLog_delete_Request(BaseModel):
user_id: str = Field(
examples=["shaa97102"],
title="유저 id",
min_length=6, max_length=50,
description="유저 id 길이 제약"
)
id: str = Field(
examples=["123e4567-e89b-12d3-a456-426614174000"],
title="채팅방 id",
min_length=1, max_length=36,
description="UUID 형식"
)
index: int = Field(
examples=[1],
title="채팅방 log index",
description="int 형식"
)
@field_validator('id', mode='before')
def check_id(cls, v):
return Validators.validate_uuid(v)
위에 BaseModel로 Request가 구성되어 있으므로 참고 바람.
구현해야될 기능
대화형 캐릭터 채팅 기록 형식
대화 기록 삭제 대화의 기록을 로그로 이전 분기로 돌아가기
스택을 사용하여 대화를 기록, 대화진행 1 → 2 → 3 → 4 → … → n ex) 만약 내가 18까지 대화를 진행, 16번까지의 대화를 삭제하려할때 18번까지 제거