mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
(api) add option to board delete route and logic to services
This commit is contained in:
parent
8297b7e1ae
commit
73f2092ec5
@ -71,11 +71,19 @@ async def update_board(
|
|||||||
@boards_router.delete("/{board_id}", operation_id="delete_board")
|
@boards_router.delete("/{board_id}", operation_id="delete_board")
|
||||||
async def delete_board(
|
async def delete_board(
|
||||||
board_id: str = Path(description="The id of board to delete"),
|
board_id: str = Path(description="The id of board to delete"),
|
||||||
|
include_images: bool = Path(
|
||||||
|
description="Permanently delete all images on the board", default=False
|
||||||
|
),
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Deletes a board"""
|
"""Deletes a board"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
ApiDependencies.invoker.services.boards.delete(board_id=board_id)
|
if include_images:
|
||||||
|
ApiDependencies.invoker.services.images.delete_images_on_board(
|
||||||
|
board_id=board_id
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
ApiDependencies.invoker.services.boards.delete(board_id=board_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# TODO: Does this need any exception handling at all?
|
# TODO: Does this need any exception handling at all?
|
||||||
pass
|
pass
|
||||||
|
@ -85,8 +85,10 @@ class DiskImageFileStorage(ImageFileStorageBase):
|
|||||||
self.__cache_ids = Queue()
|
self.__cache_ids = Queue()
|
||||||
self.__max_cache_size = 10 # TODO: get this from config
|
self.__max_cache_size = 10 # TODO: get this from config
|
||||||
|
|
||||||
self.__output_folder: Path = output_folder if isinstance(output_folder, Path) else Path(output_folder)
|
self.__output_folder: Path = (
|
||||||
self.__thumbnails_folder = self.__output_folder / 'thumbnails'
|
output_folder if isinstance(output_folder, Path) else Path(output_folder)
|
||||||
|
)
|
||||||
|
self.__thumbnails_folder = self.__output_folder / "thumbnails"
|
||||||
|
|
||||||
# Validate required output folders at launch
|
# Validate required output folders at launch
|
||||||
self.__validate_storage_folders()
|
self.__validate_storage_folders()
|
||||||
@ -179,7 +181,9 @@ class DiskImageFileStorage(ImageFileStorageBase):
|
|||||||
def __set_cache(self, image_name: Path, image: PILImageType):
|
def __set_cache(self, image_name: Path, image: PILImageType):
|
||||||
if not image_name in self.__cache:
|
if not image_name in self.__cache:
|
||||||
self.__cache[image_name] = image
|
self.__cache[image_name] = image
|
||||||
self.__cache_ids.put(image_name) # TODO: this should refresh position for LRU cache
|
self.__cache_ids.put(
|
||||||
|
image_name
|
||||||
|
) # TODO: this should refresh position for LRU cache
|
||||||
if len(self.__cache) > self.__max_cache_size:
|
if len(self.__cache) > self.__max_cache_size:
|
||||||
cache_id = self.__cache_ids.get()
|
cache_id = self.__cache_ids.get()
|
||||||
if cache_id in self.__cache:
|
if cache_id in self.__cache:
|
||||||
|
@ -94,6 +94,11 @@ class ImageRecordStorageBase(ABC):
|
|||||||
"""Deletes an image record."""
|
"""Deletes an image record."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def delete_many(self, image_names: list[str]) -> None:
|
||||||
|
"""Deletes many image records."""
|
||||||
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def save(
|
def save(
|
||||||
self,
|
self,
|
||||||
@ -385,6 +390,25 @@ class SqliteImageRecordStorage(ImageRecordStorageBase):
|
|||||||
finally:
|
finally:
|
||||||
self._lock.release()
|
self._lock.release()
|
||||||
|
|
||||||
|
def delete_many(self, image_names: list[str]) -> None:
|
||||||
|
try:
|
||||||
|
placeholders = ",".join("?" for _ in image_names)
|
||||||
|
|
||||||
|
self._lock.acquire()
|
||||||
|
|
||||||
|
# Construct the SQLite query with the placeholders
|
||||||
|
query = f"DELETE FROM images WHERE id_column IN ({placeholders})"
|
||||||
|
|
||||||
|
# Execute the query with the list of IDs as parameters
|
||||||
|
self._cursor.execute(query, placeholders)
|
||||||
|
|
||||||
|
self._conn.commit()
|
||||||
|
except sqlite3.Error as e:
|
||||||
|
self._conn.rollback()
|
||||||
|
raise ImageRecordDeleteException from e
|
||||||
|
finally:
|
||||||
|
self._lock.release()
|
||||||
|
|
||||||
def save(
|
def save(
|
||||||
self,
|
self,
|
||||||
image_name: str,
|
image_name: str,
|
||||||
|
@ -112,6 +112,11 @@ class ImageServiceABC(ABC):
|
|||||||
"""Deletes an image."""
|
"""Deletes an image."""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def delete_images_on_board(self, board_id: str):
|
||||||
|
"""Deletes all images on a board."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class ImageServiceDependencies:
|
class ImageServiceDependencies:
|
||||||
"""Service dependencies for the ImageService."""
|
"""Service dependencies for the ImageService."""
|
||||||
@ -341,6 +346,28 @@ class ImageService(ImageServiceABC):
|
|||||||
self._services.logger.error("Problem deleting image record and file")
|
self._services.logger.error("Problem deleting image record and file")
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
def delete_images_on_board(self, board_id: str):
|
||||||
|
try:
|
||||||
|
images = self._services.board_image_records.get_images_for_board(board_id)
|
||||||
|
image_name_list = list(
|
||||||
|
map(
|
||||||
|
lambda r: r.image_name,
|
||||||
|
images.items,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
for image_name in image_name_list:
|
||||||
|
self._services.image_files.delete(image_name)
|
||||||
|
self._services.image_records.delete_many(image_name_list)
|
||||||
|
except ImageRecordDeleteException:
|
||||||
|
self._services.logger.error(f"Failed to delete image records")
|
||||||
|
raise
|
||||||
|
except ImageFileDeleteException:
|
||||||
|
self._services.logger.error(f"Failed to delete image files")
|
||||||
|
raise
|
||||||
|
except Exception as e:
|
||||||
|
self._services.logger.error("Problem deleting image records and files")
|
||||||
|
raise e
|
||||||
|
|
||||||
def _get_metadata(
|
def _get_metadata(
|
||||||
self, session_id: Optional[str] = None, node_id: Optional[str] = None
|
self, session_id: Optional[str] = None, node_id: Optional[str] = None
|
||||||
) -> Union[ImageMetadata, None]:
|
) -> Union[ImageMetadata, None]:
|
||||||
|
Loading…
Reference in New Issue
Block a user