from typing import Generic, TypeVar, Any from uuid import UUID from pydantic.generics import GenericModel from core.service.mongo_db import use_collection from core.utils.crudify import mongo_inserter, mongo_soft_deleter, mongo_updater, mongo_find_one from core.utils.table_engine import TableEngineRequestType, TableEngineExport from core.utils.te import NewTableEngine T = TypeVar('T') class BaseRepository(GenericModel, Generic[T]): COLLECTION: str = 'asa' FETCH_COLS_SEARCH = ['v_id'] MODEL: T = None def __init__(self, collection: str, fetch_cols_search=None, model: T = None, **data: Any): super().__init__(**data) if fetch_cols_search is None: fetch_cols_search = ['v_id'] self.COLLECTION = collection self.MODEL = model self.FETCH_COLS_SEARCH = fetch_cols_search async def get(self, _id: UUID) -> T: return await mongo_find_one(_id, self.COLLECTION) async def fetch(self, _input: TableEngineRequestType) -> TableEngineExport[T]: return await NewTableEngine.mongo( query_class=use_collection(self.COLLECTION), soft_deleted=True, model=self.MODEL, search_cols=self.FETCH_COLS_SEARCH, inputs=_input.te) \ .to_dict() async def create(self, create: T) -> T: return await mongo_inserter(create, self.COLLECTION, getter=self.get) async def update(self, _id: UUID, update: T, extra_query: dict = None): return await mongo_updater(update, _id, self.COLLECTION, getter=self.get, extra_query=extra_query) async def delete(self, _id: UUID): return await mongo_soft_deleter(_id, self.COLLECTION)