mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
2a35d93a4d
**Service Dependencies** Services that depend on other services now access those services via the `Invoker` object. This object is provided to the service as a kwarg to its `start()` method. Until now, most services did not utilize this feature, and several services required their dependencies to be initialized and passed in on init. Additionally, _all_ services are now registered as invocation services - including the low-level services. This obviates issues with inter-dependent services we would otherwise experience as we add workflow storage. **Database Access** Previously, we were passing in a separate sqlite connection and corresponding lock as args to services in their init. A good amount of posturing was done in each service that uses the db. These objects, along with the sqlite startup and cleanup logic, is now abstracted into a simple `SqliteDatabase` class. This creates the shared connection and lock objects, enables foreign keys, and provides a `clean()` method to do startup db maintenance. This is not a service as it's only used by sqlite services.
86 lines
2.3 KiB
Python
86 lines
2.3 KiB
Python
from abc import ABC, abstractmethod
|
|
from typing import Optional
|
|
|
|
from invokeai.app.services.board_record_storage import BoardRecord
|
|
from invokeai.app.services.invoker import Invoker
|
|
from invokeai.app.services.models.board_record import BoardDTO
|
|
|
|
|
|
class BoardImagesServiceABC(ABC):
|
|
"""High-level service for board-image relationship management."""
|
|
|
|
@abstractmethod
|
|
def add_image_to_board(
|
|
self,
|
|
board_id: str,
|
|
image_name: str,
|
|
) -> None:
|
|
"""Adds an image to a board."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def remove_image_from_board(
|
|
self,
|
|
image_name: str,
|
|
) -> None:
|
|
"""Removes an image from a board."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_all_board_image_names_for_board(
|
|
self,
|
|
board_id: str,
|
|
) -> list[str]:
|
|
"""Gets all board images for a board, as a list of the image names."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
def get_board_for_image(
|
|
self,
|
|
image_name: str,
|
|
) -> Optional[str]:
|
|
"""Gets an image's board id, if it has one."""
|
|
pass
|
|
|
|
|
|
class BoardImagesService(BoardImagesServiceABC):
|
|
__invoker: Invoker
|
|
|
|
def start(self, invoker: Invoker) -> None:
|
|
self.__invoker = invoker
|
|
|
|
def add_image_to_board(
|
|
self,
|
|
board_id: str,
|
|
image_name: str,
|
|
) -> None:
|
|
self.__invoker.services.board_image_records.add_image_to_board(board_id, image_name)
|
|
|
|
def remove_image_from_board(
|
|
self,
|
|
image_name: str,
|
|
) -> None:
|
|
self.__invoker.services.board_image_records.remove_image_from_board(image_name)
|
|
|
|
def get_all_board_image_names_for_board(
|
|
self,
|
|
board_id: str,
|
|
) -> list[str]:
|
|
return self.__invoker.services.board_image_records.get_all_board_image_names_for_board(board_id)
|
|
|
|
def get_board_for_image(
|
|
self,
|
|
image_name: str,
|
|
) -> Optional[str]:
|
|
board_id = self.__invoker.services.board_image_records.get_board_for_image(image_name)
|
|
return board_id
|
|
|
|
|
|
def board_record_to_dto(board_record: BoardRecord, cover_image_name: Optional[str], image_count: int) -> BoardDTO:
|
|
"""Converts a board record to a board DTO."""
|
|
return BoardDTO(
|
|
**board_record.dict(exclude={"cover_image_name"}),
|
|
cover_image_name=cover_image_name,
|
|
image_count=image_count,
|
|
)
|