feat: billing guest access
This commit is contained in:
120
services/deal.py
120
services/deal.py
@@ -1,16 +1,16 @@
|
||||
import lexorank
|
||||
|
||||
import models.secondary
|
||||
from typing import Union
|
||||
import models.deal
|
||||
from fastapi import HTTPException
|
||||
from sqlalchemy import select, func, update, delete, insert
|
||||
from sqlalchemy.orm import joinedload, selectinload
|
||||
from starlette import status
|
||||
|
||||
import models.deal
|
||||
import models.secondary
|
||||
from models import User, Service, Client
|
||||
from models.deal import *
|
||||
from schemas.client import ClientDetailsSchema
|
||||
from schemas.deal import *
|
||||
from services.auth import AuthService
|
||||
from services.base import BaseService
|
||||
from services.client import ClientService
|
||||
from services.service import ServiceService
|
||||
@@ -20,6 +20,15 @@ from services.shipping_warehouse import ShippingWarehouseService
|
||||
class DealService(BaseService):
|
||||
|
||||
# region Deal
|
||||
|
||||
@staticmethod
|
||||
def grant_access(user: Union[models.User, dict], deal_id):
|
||||
if type(user) is models.User:
|
||||
return
|
||||
user_deal_id = user['deal_id']
|
||||
if int(user_deal_id) != int(deal_id):
|
||||
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Invalid token')
|
||||
|
||||
async def _get_deal_by_id(self, deal_id) -> Union[Deal, None]:
|
||||
return await self.session.get(Deal, deal_id)
|
||||
|
||||
@@ -211,7 +220,9 @@ class DealService(BaseService):
|
||||
result.append(DealSchema.model_validate(deal))
|
||||
return DealGetAllResponse(deals=result)
|
||||
|
||||
async def get_by_id(self, deal_id: int) -> DealSchema:
|
||||
async def get_by_id(self, user: Union[models.User, dict], deal_id: int, return_raw=False) -> Union[
|
||||
DealSchema, models.Deal]:
|
||||
self.grant_access(user, deal_id)
|
||||
|
||||
deal = await self.session.scalar(
|
||||
select(Deal)
|
||||
@@ -244,7 +255,8 @@ class DealService(BaseService):
|
||||
)
|
||||
.where(Deal.id == deal_id)
|
||||
)
|
||||
|
||||
if return_raw:
|
||||
return deal
|
||||
if not deal:
|
||||
raise HTTPException(status_code=404, detail="Сделка не найдена")
|
||||
return DealSchema.model_validate(deal)
|
||||
@@ -360,11 +372,17 @@ class DealService(BaseService):
|
||||
except Exception as e:
|
||||
return DealAddKitResponse(ok=False, message=str(e))
|
||||
|
||||
def create_guest_url(self, user: models.User, request: DealCreateGuestUrlRequest) -> DealCreateGuestUrlResponse:
|
||||
if not user.is_admin:
|
||||
return DealCreateGuestUrlResponse(ok=False, message='Создать ссылку может только администратор', url="")
|
||||
access_token = AuthService(self.session).create_deal_guest_token(request.deal_id)
|
||||
url = f"deals/{request.deal_id}?accessToken={access_token}"
|
||||
return DealCreateGuestUrlResponse(ok=True, message='Ссылка успешно создана!', url=url)
|
||||
|
||||
# endregion
|
||||
|
||||
# region Deal services
|
||||
async def add_services(self, request: DealAddServicesRequest):
|
||||
# TODO refactor
|
||||
deal: Deal = await self.session.scalar(
|
||||
select(Deal)
|
||||
.options(selectinload(Deal.services))
|
||||
@@ -404,9 +422,13 @@ class DealService(BaseService):
|
||||
await self.session.commit()
|
||||
return DealAddServicesResponse(ok=True, message='Услуги успешно добавлены')
|
||||
|
||||
async def update_service_quantity(self,
|
||||
request: DealUpdateServiceQuantityRequest) -> DealUpdateServiceQuantityResponse:
|
||||
async def update_service_quantity(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealUpdateServiceQuantityRequest
|
||||
) -> DealUpdateServiceQuantityResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
deal_service = await self.session.scalar(
|
||||
select(models.secondary.DealService)
|
||||
.where(models.secondary.DealService.deal_id == request.deal_id,
|
||||
@@ -421,8 +443,12 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealUpdateServiceQuantityResponse(ok=False, message=str(e))
|
||||
|
||||
async def add_service(self, request: DealAddServiceRequest) -> DealAddServiceResponse:
|
||||
async def add_service(self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealAddServiceRequest
|
||||
) -> DealAddServiceResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
deal = await self.session.scalar(select(Deal).where(Deal.id == request.deal_id))
|
||||
if not deal:
|
||||
raise HTTPException(status_code=404, detail="Сделка не найдена")
|
||||
@@ -450,8 +476,13 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealAddServiceResponse(ok=False, message=str(e))
|
||||
|
||||
async def delete_service(self, request: DealDeleteServiceRequest) -> DealDeleteServiceResponse:
|
||||
async def delete_service(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealDeleteServiceRequest
|
||||
) -> DealDeleteServiceResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
deal_service = await self.session.scalar(
|
||||
select(models.secondary.DealService)
|
||||
.where(models.secondary.DealService.deal_id == request.deal_id,
|
||||
@@ -466,8 +497,13 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealDeleteServiceResponse(ok=False, message=str(e))
|
||||
|
||||
async def delete_services(self, request: DealDeleteServicesRequest) -> DealDeleteServicesResponse:
|
||||
async def delete_services(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealDeleteServicesRequest
|
||||
) -> DealDeleteServicesResponse:
|
||||
try:
|
||||
self.grant_access(user, request)
|
||||
deal_services = await self.session.scalars(
|
||||
select(models.secondary.DealService)
|
||||
.where(models.secondary.DealService.deal_id == request.deal_id,
|
||||
@@ -481,8 +517,13 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealDeleteServicesResponse(ok=False, message=str(e))
|
||||
|
||||
async def update_service(self, request: DealUpdateServiceRequest) -> DealUpdateServiceResponse:
|
||||
async def update_service(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealUpdateServiceRequest
|
||||
) -> DealUpdateServiceResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
deal_service = await self.session.scalar(
|
||||
select(models.secondary.DealService)
|
||||
.where(models.secondary.DealService.deal_id == request.deal_id,
|
||||
@@ -535,9 +576,13 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealUpdateServiceQuantityResponse(ok=False, message=str(e))
|
||||
|
||||
async def copy_services(self, request: DealServicesCopyRequest) -> DealServicesCopyResponse:
|
||||
async def copy_services(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealServicesCopyRequest
|
||||
) -> DealServicesCopyResponse:
|
||||
try:
|
||||
|
||||
self.grant_access(user, request.deal_id)
|
||||
source_services_stmt = (
|
||||
select(
|
||||
models.DealProductService
|
||||
@@ -614,9 +659,13 @@ class DealService(BaseService):
|
||||
# endregion
|
||||
|
||||
# region Deal products
|
||||
async def update_product_quantity(self,
|
||||
request: DealUpdateProductQuantityRequest) -> DealUpdateProductQuantityResponse:
|
||||
async def update_product_quantity(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealUpdateProductQuantityRequest
|
||||
) -> DealUpdateProductQuantityResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
# check if there is no deal or no product with different exceptions
|
||||
deal_product = await self.session.scalar(
|
||||
select(models.secondary.DealProduct)
|
||||
@@ -632,8 +681,15 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealUpdateProductQuantityResponse(ok=False, message=str(e))
|
||||
|
||||
async def add_product(self, request: DealAddProductRequest) -> DealAddProductResponse:
|
||||
async def add_product(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
|
||||
request: DealAddProductRequest
|
||||
) -> DealAddProductResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
|
||||
deal = await self.session.scalar(select(Deal).where(Deal.id == request.deal_id))
|
||||
if not deal:
|
||||
raise HTTPException(status_code=404, detail="Сделка не найдена")
|
||||
@@ -670,8 +726,13 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealAddProductResponse(ok=False, message=str(e))
|
||||
|
||||
async def delete_product(self, request: DealDeleteProductRequest) -> DealDeleteProductResponse:
|
||||
async def delete_product(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealDeleteProductRequest
|
||||
) -> DealDeleteProductResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
deal_product = await self.session.scalar(
|
||||
select(models.secondary.DealProduct)
|
||||
.where(models.secondary.DealProduct.deal_id == request.deal_id,
|
||||
@@ -686,8 +747,13 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealDeleteProductResponse(ok=False, message=str(e))
|
||||
|
||||
async def delete_products(self, request: DealDeleteProductsRequest) -> DealDeleteProductsResponse:
|
||||
async def delete_products(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealDeleteProductsRequest
|
||||
) -> DealDeleteProductsResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
deal_products = await self.session.scalars(
|
||||
select(models.secondary.DealProduct)
|
||||
.where(models.secondary.DealProduct.deal_id == request.deal_id,
|
||||
@@ -701,8 +767,13 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealDeleteProductsResponse(ok=False, message=str(e))
|
||||
|
||||
async def update_product(self, request: DealUpdateProductRequest):
|
||||
async def update_product(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealUpdateProductRequest
|
||||
):
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
deal_product: models.DealProduct = await self.session.scalar(
|
||||
select(models.secondary.DealProduct)
|
||||
.where(models.secondary.DealProduct.deal_id == request.deal_id,
|
||||
@@ -781,8 +852,13 @@ class DealService(BaseService):
|
||||
await self.session.rollback()
|
||||
return DealUpdateProductResponse(ok=False, message=str(e))
|
||||
|
||||
async def add_kit_to_deal_product(self, request: DealProductAddKitRequest) -> DealProductAddKitResponse:
|
||||
async def add_kit_to_deal_product(
|
||||
self,
|
||||
user: Union[models.User, dict],
|
||||
request: DealProductAddKitRequest
|
||||
) -> DealProductAddKitResponse:
|
||||
try:
|
||||
self.grant_access(user, request.deal_id)
|
||||
service_service = ServiceService(self.session)
|
||||
kit = await service_service.get_kit_by_id(request.kit_id)
|
||||
if not kit:
|
||||
|
||||
Reference in New Issue
Block a user