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