diff --git a/models/client.py b/models/client.py index 7b54fb3..15e606d 100644 --- a/models/client.py +++ b/models/client.py @@ -1,5 +1,5 @@ from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, BigInteger -from sqlalchemy.orm import relationship, backref +from sqlalchemy.orm import relationship from models import BaseModel @@ -12,6 +12,8 @@ class Client(BaseModel): products = relationship('Product', back_populates='client') + details = relationship('ClientDetails', uselist=False, back_populates='client', cascade='all, delete') + class ClientDetails(BaseModel): __tablename__ = 'client_details' @@ -19,7 +21,7 @@ class ClientDetails(BaseModel): id = Column(Integer, autoincrement=True, primary_key=True, index=True) client_id = Column(Integer, ForeignKey('clients.id'), unique=True, nullable=False, comment='ID клиента') - client = relationship('Client', backref=backref('details', uselist=False)) + client = relationship('Client', back_populates='details', cascade='all, delete', uselist=False) address = Column(String) phone_number = Column(String) diff --git a/routers/client.py b/routers/client.py index 5713c52..ac43a5b 100644 --- a/routers/client.py +++ b/routers/client.py @@ -5,8 +5,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from backend.session import get_session from models import User -from schemas.client import ClientSearchRequest, ClientUpdateDetailsRequest, ClientUpdateDetailsResponse, \ - ClientGetAllResponse +from schemas.client import * from services.auth import get_current_user from services.client import ClientService @@ -48,3 +47,41 @@ async def get_all_clients( session: Annotated[AsyncSession, Depends(get_session)], ): return await ClientService(session).get_all() + + +@client_router.post( + '/create', + operation_id='create_client', + response_model=ClientCreateResponse +) +async def create_client( + request: ClientCreateRequest, + user: Annotated[User, Depends(get_current_user)], + session: Annotated[AsyncSession, Depends(get_session)] +): + return await ClientService(session).create(request, user) + + +@client_router.post( + '/update', + operation_id='update_client', + response_model=ClientUpdateResponse +) +async def update_client( + request: ClientUpdateRequest, + user: Annotated[User, Depends(get_current_user)], + session: Annotated[AsyncSession, Depends(get_session)] +): + return await ClientService(session).update(request, user) + + +@client_router.post( + '/delete', + operation_id='delete_client', + response_model=ClientDeleteResponse +) +async def delete_client( + request: ClientDeleteRequest, + session: Annotated[AsyncSession, Depends(get_session)] +): + return await ClientService(session).delete(request) diff --git a/schemas/client.py b/schemas/client.py index 94ebdc4..18e00f5 100644 --- a/schemas/client.py +++ b/schemas/client.py @@ -1,6 +1,6 @@ from typing import List -from schemas.base import CustomModelCamel +from schemas.base import CustomModelCamel, OkMessageSchema class ClientDetailsSchema(CustomModelCamel): @@ -20,11 +20,6 @@ class ClientSearchRequest(CustomModelCamel): name: str -class ClientCreateRequest(CustomModelCamel): - name: str - address: str - - class ClientSearchResponse(CustomModelCamel): clients: List[ClientSchema] @@ -40,3 +35,27 @@ class ClientUpdateDetailsResponse(CustomModelCamel): class ClientGetAllResponse(CustomModelCamel): clients: List[ClientSchema] + + +class ClientCreateResponse(OkMessageSchema): + pass + + +class ClientCreateRequest(CustomModelCamel): + data: ClientSchema + + +class ClientUpdateRequest(CustomModelCamel): + data: ClientSchema + + +class ClientUpdateResponse(OkMessageSchema): + pass + + +class ClientDeleteRequest(CustomModelCamel): + client_id: int + + +class ClientDeleteResponse(OkMessageSchema): + pass diff --git a/services/client.py b/services/client.py index e096d72..0a9b630 100644 --- a/services/client.py +++ b/services/client.py @@ -72,3 +72,37 @@ class ClientService(BaseService): for client in query.all(): clients.append(ClientSchema.model_validate(client)) return ClientSearchResponse(clients=clients) + + async def create(self, request: ClientCreateRequest, user: User) -> ClientCreateResponse: + try: + client = await self.get_by_name(request.data.name) + if client: + return ClientCreateResponse(ok=False, message='Client already exists') + await self.create_client_raw(user, request.data.name, request.data.details) + await self.session.commit() + return ClientCreateResponse(ok=True, message='Client created') + except Exception as e: + return ClientCreateResponse(ok=False, message=str(e)) + + async def update(self, request: ClientUpdateRequest, user: User) -> ClientUpdateResponse: + try: + client = await self.get_by_id(request.data.id) + if not client: + return ClientUpdateResponse(ok=False, message='Client not found') + await self.session.execute(update(Client).where(Client.id == client.id).values(name=request.data.name)) + await self.update_details(user, client, request.data.details) + await self.session.commit() + return ClientUpdateResponse(ok=True, message='Client updated') + except Exception as e: + return ClientUpdateResponse(ok=False, message=str(e)) + + async def delete(self, request: ClientDeleteRequest) -> ClientDeleteResponse: + try: + client = await self.get_by_id(request.client_id) + if not client: + return ClientDeleteResponse(ok=False, message='Client not found') + await self.session.delete(client) + await self.session.commit() + return ClientDeleteResponse(ok=True, message='Client deleted') + except Exception as e: + return ClientDeleteResponse(ok=False, message=str(e)) diff --git a/test/ockho.py b/test/ockho.py index 74b0018..a868159 100644 --- a/test/ockho.py +++ b/test/ockho.py @@ -1,9 +1,8 @@ -from typing import Annotated +import string -def get_v(): - return 123 +def main(): + pass - -ockho: Annotated[int, get_v] -print(ockho) +if __name__ == '__main__': + main()