# Copyright 2026 zhaoxi826 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from pretor.core.database.table.individual import WorkerIndividual from sqlmodel import select from typing import List, Optional from pretor.core.database.database_exception import database_exception from ulid import ULID class IndividualDatabase: def __init__(self, async_session_maker): self.async_session_maker = async_session_maker @database_exception async def add_worker_individual(self, **kwargs) -> WorkerIndividual: async with self.async_session_maker() as session: agent_id = str(ULID()) individual = WorkerIndividual(agent_id=agent_id, **kwargs) session.add(individual) await session.commit() await session.refresh(individual) return individual @database_exception async def get_worker_individual(self, agent_id: str) -> Optional[WorkerIndividual]: async with self.async_session_maker() as session: statement = select(WorkerIndividual).where(WorkerIndividual.agent_id == agent_id) results = await session.execute(statement) return results.scalar_one_or_none() @database_exception async def get_worker_individual_list(self, owner_id: str) -> List[WorkerIndividual]: async with self.async_session_maker() as session: statement = select(WorkerIndividual).where(WorkerIndividual.owner_id == owner_id) results = await session.execute(statement) return list(results.scalars().all()) @database_exception async def update_worker_individual(self, agent_id: str, **kwargs) -> Optional[WorkerIndividual]: async with self.async_session_maker() as session: statement = select(WorkerIndividual).where(WorkerIndividual.agent_id == agent_id) results = await session.execute(statement) individual = results.scalar_one_or_none() if not individual: return None for key, value in kwargs.items(): if value is not None: setattr(individual, key, value) session.add(individual) await session.commit() await session.refresh(individual) return individual @database_exception async def delete_worker_individual(self, agent_id: str) -> bool: async with self.async_session_maker() as session: statement = select(WorkerIndividual).where(WorkerIndividual.agent_id == agent_id) results = await session.execute(statement) individual = results.scalar_one_or_none() if not individual: return False session.delete(individual) await session.commit() return True @database_exception async def get_all_worker_individual(self) -> List[WorkerIndividual]: async with self.async_session_maker() as session: statement = select(WorkerIndividual) results = await session.execute(statement) return list(results.scalars().all())