@@ -573,42 +573,69 @@ def update_item(self, skylight_id: str, checked: bool, name: Optional[str] = Non
573573 logger .error (f"Failed to update item in Skylight: { e } " )
574574 raise
575575
576- def remove_item (self , skylight_id : str , list_name : str = None ) -> None :
576+ def bulk_delete_items (self , skylight_ids : List [ str ] , list_name : str ) -> None :
577577 """
578- Remove item from list
578+ Remove multiple items from list using bulk destroy endpoint
579579
580580 Args:
581- skylight_id: Skylight ID of the item to remove
582- list_name: Optional list name to search in (REQUIRED for security)
581+ skylight_ids: List of Skylight IDs of items to remove
582+ list_name: Name of the list to remove items from (REQUIRED for security)
583583 """
584584 try :
585- logger .debug (f"Removing item from Skylight: { skylight_id } " )
585+ if not skylight_ids :
586+ logger .debug ("No items to delete" )
587+ return
588+
589+ logger .debug (f"Bulk removing { len (skylight_ids )} items from Skylight list '{ list_name } ': { skylight_ids } " )
586590
587591 if not list_name :
588592 raise ValueError ("list_name is required - will not search all lists for security" )
589593
590- list_id = None
594+ # Get the list ID
595+ list_id = self .get_list_id_by_name (list_name )
596+ if not list_id :
597+ raise Exception (f"List '{ list_name } ' not found" )
591598
592- # Only search in the specified list (NEVER search other lists)
593- try :
594- target_list_id = self .get_list_id_by_name (list_name )
595- if not target_list_id :
596- raise Exception (f"List '{ list_name } ' not found" )
597-
598- # Check if item exists in this specific list
599- items = self .get_list_items (list_name )
600- if any (item .skylight_id == skylight_id for item in items ):
601- list_id = target_list_id
602- logger .debug (f"Found item { skylight_id } in target list '{ list_name } '" )
599+ # Verify all items exist in this specific list (optional validation)
600+ existing_items = self .get_list_items (list_name )
601+ existing_ids = {item .skylight_id for item in existing_items }
602+
603+ # Filter out items that don't exist (log warning but don't fail)
604+ valid_ids = []
605+ for skylight_id in skylight_ids :
606+ if skylight_id in existing_ids :
607+ valid_ids .append (skylight_id )
603608 else :
604- raise Exception (f"Item { skylight_id } not found in list '{ list_name } '" )
609+ logger . warning (f"Item { skylight_id } not found in list '{ list_name } ' - skipping " )
605610
606- except Exception as e :
607- raise Exception (f"Cannot remove item { skylight_id } : { e } " )
611+ if not valid_ids :
612+ logger .info ("No valid items to delete after validation" )
613+ return
614+
615+ # Use bulk destroy endpoint - the only working deletion method
616+ endpoint = f"/frames/{ self .frame_id } /lists/{ list_id } /list_items/bulk_destroy"
617+ payload = {"ids" : valid_ids }
618+
619+ self ._make_request ("DELETE" , endpoint , payload )
620+ logger .info (f"Bulk removed { len (valid_ids )} items from Skylight list '{ list_name } ': { valid_ids } " )
621+
622+ except Exception as e :
623+ logger .error (f"Failed to bulk remove items from Skylight: { e } " )
624+ raise
625+
626+ def remove_item (self , skylight_id : str , list_name : str = None ) -> None :
627+ """
628+ Remove single item from list (wrapper around bulk delete)
629+
630+ Args:
631+ skylight_id: Skylight ID of the item to remove
632+ list_name: Name of the list to search in (REQUIRED for security)
633+ """
634+ try :
635+ logger .debug (f"Removing single item from Skylight: { skylight_id } " )
608636
609- # DELETE request
610- self ._make_request ("DELETE" , f"/frames/{ self .frame_id } /lists/{ list_id } /list_items/{ skylight_id } " )
611- logger .info (f"Removed item from Skylight list '{ list_name } ': { skylight_id } " )
637+ # Use bulk delete for single item (since individual delete doesn't work)
638+ self .bulk_delete_items ([skylight_id ], list_name )
612639
613640 except Exception as e :
614641 logger .error (f"Failed to remove item from Skylight: { e } " )
0 commit comments