feat: client endpoints for clients page
This commit is contained in:
47
modules/clients/repositories/client.py
Normal file
47
modules/clients/repositories/client.py
Normal file
@ -0,0 +1,47 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user