48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
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(self, stmt: Select) -> Select:
|
|
return stmt.where(Client.is_deleted.is_(False)).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)
|