from typing import List from sqlalchemy.orm import Session from .schemas import Library, NewLibraryParam, Folder, NewEntityParam, Entity, Plugin, NewPluginParam, UpdateEntityParam, NewFolderParam from .models import LibraryModel, FolderModel, EntityModel, EntityModel, PluginModel, LibraryPluginModel def get_library_by_id(library_id: int, db: Session) -> Library | None: return db.query(LibraryModel).filter(LibraryModel.id == library_id).first() def create_library(library: NewLibraryParam, db: Session) -> Library: db_library = LibraryModel(name=library.name) db.add(db_library) db.commit() db.refresh(db_library) for folder_path in library.folders: db_folder = FolderModel(path=str(folder_path), library_id=db_library.id) db.add(db_folder) db.commit() return Library( id=db_library.id, name=db_library.name, folders=[Folder(id=db_folder.id, path=db_folder.path) for db_folder in db_library.folders], plugins=[] ) def get_libraries(db: Session) -> List[Library]: return db.query(LibraryModel).all() def add_folder(library_id: int, folder: NewFolderParam, db: Session) -> Folder: db_folder = FolderModel(path=str(folder.path), library_id=library_id) db.add(db_folder) db.commit() db.refresh(db_folder) return Folder(id=db_folder.id, path=db_folder.path) def create_entity(library_id: int, entity: NewEntityParam, db: Session) -> Entity: db_entity = EntityModel( **entity.model_dump(), library_id=library_id ) db.add(db_entity) db.commit() db.refresh(db_entity) return db_entity def get_entity_by_id(entity_id: int, db: Session) -> Entity | None: return db.query(EntityModel).filter(EntityModel.id == entity_id).first() def get_entities_of_folder(library_id: int, folder_id: int, db: Session, limit: int = 10, offset: int = 0) -> List[Entity]: folder = db.query(FolderModel).filter(FolderModel.id == folder_id, FolderModel.library_id == library_id).first() if folder is None: return [] entities = db.query(EntityModel).filter(EntityModel.folder_id == folder_id).limit(limit).offset(offset).all() return entities def get_entity_by_filepath(filepath: str, db: Session) -> Entity | None: return db.query(EntityModel).filter(EntityModel.filepath == filepath).first() def remove_entity(entity_id: int, db: Session): entity = db.query(EntityModel).filter(EntityModel.id == entity_id).first() if entity: db.delete(entity) db.commit() else: raise ValueError(f"Entity with id {entity_id} not found") def create_plugin(newPlugin: NewPluginParam, db: Session) -> Plugin: db_plugin = PluginModel(**newPlugin.model_dump(mode='json')) db.add(db_plugin) db.commit() db.refresh(db_plugin) return db_plugin def add_plugin_to_library(library_id: int, plugin_id: int, db: Session): library_plugin = LibraryPluginModel(library_id=library_id, plugin_id=plugin_id) db.add(library_plugin) db.commit() db.refresh(library_plugin) def get_entity_by_id(entity_id: int, db: Session) -> Entity | None: return db.query(EntityModel).filter(EntityModel.id == entity_id).first() def update_entity(entity_id: int, updated_entity: UpdateEntityParam, db: Session) -> Entity: db_entity = get_entity_by_id(entity_id, db) for key, value in updated_entity.model_dump().items(): setattr(db_entity, key, value) db.commit() db.refresh(db_entity) return db_entity