This commit is contained in:
2024-04-10 03:45:52 +03:00
parent 5de5b9b3e4
commit 93eb6ae6b7
5 changed files with 107 additions and 16 deletions

View File

@@ -1,5 +1,5 @@
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, BigInteger from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, BigInteger
from sqlalchemy.orm import relationship, backref from sqlalchemy.orm import relationship
from models import BaseModel from models import BaseModel
@@ -12,6 +12,8 @@ class Client(BaseModel):
products = relationship('Product', back_populates='client') products = relationship('Product', back_populates='client')
details = relationship('ClientDetails', uselist=False, back_populates='client', cascade='all, delete')
class ClientDetails(BaseModel): class ClientDetails(BaseModel):
__tablename__ = 'client_details' __tablename__ = 'client_details'
@@ -19,7 +21,7 @@ class ClientDetails(BaseModel):
id = Column(Integer, autoincrement=True, primary_key=True, index=True) id = Column(Integer, autoincrement=True, primary_key=True, index=True)
client_id = Column(Integer, ForeignKey('clients.id'), unique=True, nullable=False, comment='ID клиента') 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) address = Column(String)
phone_number = Column(String) phone_number = Column(String)

View File

@@ -5,8 +5,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from backend.session import get_session from backend.session import get_session
from models import User from models import User
from schemas.client import ClientSearchRequest, ClientUpdateDetailsRequest, ClientUpdateDetailsResponse, \ from schemas.client import *
ClientGetAllResponse
from services.auth import get_current_user from services.auth import get_current_user
from services.client import ClientService from services.client import ClientService
@@ -48,3 +47,41 @@ async def get_all_clients(
session: Annotated[AsyncSession, Depends(get_session)], session: Annotated[AsyncSession, Depends(get_session)],
): ):
return await ClientService(session).get_all() 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)

View File

@@ -1,6 +1,6 @@
from typing import List from typing import List
from schemas.base import CustomModelCamel from schemas.base import CustomModelCamel, OkMessageSchema
class ClientDetailsSchema(CustomModelCamel): class ClientDetailsSchema(CustomModelCamel):
@@ -20,11 +20,6 @@ class ClientSearchRequest(CustomModelCamel):
name: str name: str
class ClientCreateRequest(CustomModelCamel):
name: str
address: str
class ClientSearchResponse(CustomModelCamel): class ClientSearchResponse(CustomModelCamel):
clients: List[ClientSchema] clients: List[ClientSchema]
@@ -40,3 +35,27 @@ class ClientUpdateDetailsResponse(CustomModelCamel):
class ClientGetAllResponse(CustomModelCamel): class ClientGetAllResponse(CustomModelCamel):
clients: List[ClientSchema] 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

View File

@@ -72,3 +72,37 @@ class ClientService(BaseService):
for client in query.all(): for client in query.all():
clients.append(ClientSchema.model_validate(client)) clients.append(ClientSchema.model_validate(client))
return ClientSearchResponse(clients=clients) 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))

View File

@@ -1,9 +1,8 @@
from typing import Annotated import string
def get_v(): def main():
return 123 pass
if __name__ == '__main__':
ockho: Annotated[int, get_v] main()
print(ockho)