from datetime import timezone, datetime from sqlalchemy import update from modules.clients.models import Client, ClientDetails from modules.clients.schemas.client import UpdateClientSchema, CreateClientSchema from repositories.mixins import * class ClientRepository( BaseRepository, RepGetAllMixin[Client], RepDeleteMixin[Client], RepUpdateMixin[Client, UpdateClientSchema], RepGetByIdMixin[Client], ): entity_class = Client entity_not_found_msg = "Клиент не найден" def _process_get_all_stmt_with_args( self, stmt: Select, include_deleted: bool ) -> Select: if not include_deleted: stmt = stmt.where(Client.is_deleted.is_(False)) return stmt.order_by(Client.created_at) async def create(self, data: CreateClientSchema) -> int: details = ClientDetails(**data.details.model_dump()) data_dict = data.model_dump() data_dict["details"] = details client = Client(**data_dict) self.session.add(client) await self.session.commit() await self.session.refresh(client) return client.id async def update(self, client: Client, data: UpdateClientSchema) -> Client: if data.details is not None: stmt = ( update(ClientDetails) .where(ClientDetails.client_id == client.id) .values( **data.details.model_dump(), last_modified_at=datetime.now(timezone.utc), ) ) await self.session.execute(stmt) del data.details return await self._apply_update_data_to_model(client, data, True)