Team Ai
Apppublic

Multimedika/Bot_Development

sourceHugging Facemitupdated 2y agoView on Hugging Face
0likes
query_user_meta.py108 linesDownload Raw Back to query
1from sqlalchemy import select2from db.models import User_Meta, Metadata, Category3from db.query.base_query import BaseQuery4 5 6class UserMetaQuery(BaseQuery):7    def __init__(self, user):8        super().__init__(user)9    10    def get_user_meta_entries(self, db):11        """Fetch all user meta entries joined with metadata and category."""12        join_models = [Metadata, Category]13        join_conditions = [14            User_Meta.metadata_id == Metadata.id,15            Metadata.category_id == Category.id,16        ]17        18        filter_conditions = [User_Meta.user_id == self.user_id]19 20        result = self.get_with_joins(21            db,22            model=User_Meta,23            join_models=join_models,24            join_conditions=join_conditions,25            filter_conditions=filter_conditions,26            multiple=True27        )28        return result29        30    def insert_user_meta_entries(self, db, metadata_ids):31        """Insert new user meta entries if they don't already exist."""32        # Fetch existing metadata IDs for the user33        existing_metadata_ids = {34            entry.metadata_id35            for entry in db.query(User_Meta).filter_by(user_id=self.user.get("id")).all()36        }37 38        # Filter out metadata IDs that already exist39        new_metadata_ids = [40            mid for mid in metadata_ids if mid not in existing_metadata_ids41        ]42 43        if not new_metadata_ids:44            return {45                "message": "No new entries to add; all specified metadata IDs already exist.",46                "existing_metadata_ids": existing_metadata_ids,47            }48 49        user_meta_entries = [50            User_Meta(user_id=self.user.get("id"), metadata_id=mid)51            for mid in new_metadata_ids52        ]53 54        # Use the method from BaseQuery to insert entries55        self.insert_entries(db, user_meta_entries)56        return {57            "message": "User meta entries added successfully.",58            "metadata_ids": new_metadata_ids,  # Include only new metadata IDs in the result59        }60 61    62    def update_user_meta_entries(self, db, metadata_ids):63        """Update user meta entries: keep, delete, or add new entries based on metadata_ids."""64        filter_conditions = [User_Meta.user_id == self.user_id]65        66        # Fetch existing user meta entries67        existing_user_meta = self.get(db, model=User_Meta, filter_conditions=filter_conditions, multiple=True)68        existing_user_meta = [user_meta[0] for user_meta in existing_user_meta]69        existing_meta_ids = [entry.metadata_id for entry in existing_user_meta]70 71        # Convert both lists to sets once for efficiency72        metadata_ids_set = set(metadata_ids)73        existing_meta_ids_set = set(existing_meta_ids)74 75        # Find metadata to add, keep, or delete76        metadata_to_add = list(metadata_ids_set - existing_meta_ids_set)77        metadata_to_keep = list(metadata_ids_set & existing_meta_ids_set)78        metadata_to_delete = list(existing_meta_ids_set - metadata_ids_set)79 80        # Delete entries that are no longer in the updated metadata_ids list81        if metadata_to_delete:82            db.query(User_Meta).filter(User_Meta.user_id == self.user_id, User_Meta.metadata_id.in_(metadata_to_delete)).delete(synchronize_session=False)83 84        # Add new entries for metadata that are not in the existing user meta85        for meta_id in metadata_to_add:86            new_entry = User_Meta(user_id=self.user_id, metadata_id=meta_id)87            self.add(db, new_entry)88 89        db.commit()90        91        return {92            "status": "success",93            "added_meta": list(metadata_to_add),94            "deleted_meta": list(metadata_to_delete),95            "kept_meta": list(metadata_to_keep),96        }97 98    def delete_user_meta(self, db, metadata_id):99        """Delete user meta entries by metadata_id."""100        filter_conditions = [User_Meta.metadata_id==metadata_id,101                             User_Meta.user_id==self.user_id]102        self.delete(db, model=User_Meta, filter_conditions=filter_conditions)103        return {"message": f"Book user with id {metadata_id} deleted successfully."}104 105    def delete_all_user_meta(self, db):106        """Delete all user meta entries for a user."""107        self.delete_all(db, model=User_Meta)108