TreeNut-KR / ChatBot

ChatBot 웹사이트 프로젝트
GNU General Public License v3.0
1 stars 0 forks source link

채팅 기록 스택 기능 #3

Closed CutTheWire closed 3 months ago

CutTheWire commented 4 months ago
CutTheWire commented 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가 구성되어 있으므로 참고 바람.