Team Ai
Apppublic

Underground-Digital/Workflow-Engine

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
web_conversation_service.py102 linesDownload Raw Back to services
1from typing import Optional, Union2 3from core.app.entities.app_invoke_entities import InvokeFrom4from extensions.ext_database import db5from libs.infinite_scroll_pagination import InfiniteScrollPagination6from models.account import Account7from models.model import App, EndUser8from models.web import PinnedConversation9from services.conversation_service import ConversationService10 11 12class WebConversationService:13    @classmethod14    def pagination_by_last_id(15        cls,16        app_model: App,17        user: Optional[Union[Account, EndUser]],18        last_id: Optional[str],19        limit: int,20        invoke_from: InvokeFrom,21        pinned: Optional[bool] = None,22        sort_by="-updated_at",23    ) -> InfiniteScrollPagination:24        include_ids = None25        exclude_ids = None26        if pinned is not None:27            pinned_conversations = (28                db.session.query(PinnedConversation)29                .filter(30                    PinnedConversation.app_id == app_model.id,31                    PinnedConversation.created_by_role == ("account" if isinstance(user, Account) else "end_user"),32                    PinnedConversation.created_by == user.id,33                )34                .order_by(PinnedConversation.created_at.desc())35                .all()36            )37            pinned_conversation_ids = [pc.conversation_id for pc in pinned_conversations]38            if pinned:39                include_ids = pinned_conversation_ids40            else:41                exclude_ids = pinned_conversation_ids42 43        return ConversationService.pagination_by_last_id(44            app_model=app_model,45            user=user,46            last_id=last_id,47            limit=limit,48            invoke_from=invoke_from,49            include_ids=include_ids,50            exclude_ids=exclude_ids,51            sort_by=sort_by,52        )53 54    @classmethod55    def pin(cls, app_model: App, conversation_id: str, user: Optional[Union[Account, EndUser]]):56        pinned_conversation = (57            db.session.query(PinnedConversation)58            .filter(59                PinnedConversation.app_id == app_model.id,60                PinnedConversation.conversation_id == conversation_id,61                PinnedConversation.created_by_role == ("account" if isinstance(user, Account) else "end_user"),62                PinnedConversation.created_by == user.id,63            )64            .first()65        )66 67        if pinned_conversation:68            return69 70        conversation = ConversationService.get_conversation(71            app_model=app_model, conversation_id=conversation_id, user=user72        )73 74        pinned_conversation = PinnedConversation(75            app_id=app_model.id,76            conversation_id=conversation.id,77            created_by_role="account" if isinstance(user, Account) else "end_user",78            created_by=user.id,79        )80 81        db.session.add(pinned_conversation)82        db.session.commit()83 84    @classmethod85    def unpin(cls, app_model: App, conversation_id: str, user: Optional[Union[Account, EndUser]]):86        pinned_conversation = (87            db.session.query(PinnedConversation)88            .filter(89                PinnedConversation.app_id == app_model.id,90                PinnedConversation.conversation_id == conversation_id,91                PinnedConversation.created_by_role == ("account" if isinstance(user, Account) else "end_user"),92                PinnedConversation.created_by == user.id,93            )94            .first()95        )96 97        if not pinned_conversation:98            return99 100        db.session.delete(pinned_conversation)101        db.session.commit()102