from typing import Annotated from fastapi import APIRouter, Depends from sqlalchemy.ext.asyncio import AsyncSession from backend.dependecies import SessionDependency, CurrentUserDependency from backend.session import get_session from models import User from schemas.deal import * from services.auth import get_current_user, authorized_user, guest_user from services.deal import DealService deal_router = APIRouter( prefix='/deal', tags=['deal'], ) # region Deal @deal_router.post( '/create', dependencies=[Depends(authorized_user)] ) async def create( request: DealCreateRequest, session: Annotated[AsyncSession, Depends(get_session)], user: Annotated[User, Depends(get_current_user)] ): return await DealService(session).create(request, user) @deal_router.post( '/delete', response_model=DealDeleteResponse, operation_id='deleteDeal', dependencies=[Depends(authorized_user)] ) async def delete( request: DealDeleteRequest, session: Annotated[AsyncSession, Depends(get_session)] ): return await DealService(session).delete(request) @deal_router.post( '/quickCreate', response_model=DealQuickCreateResponse, dependencies=[Depends(authorized_user)] ) async def quick_create( request: DealQuickCreateRequest, session: Annotated[AsyncSession, Depends(get_session)], user: Annotated[User, Depends(get_current_user)] ): return await DealService(session).quick_create(request, user) @deal_router.post( '/changeStatus', response_model=DealChangeStatusResponse, dependencies=[Depends(authorized_user)] ) async def change_status( request: DealChangeStatusRequest, session: Annotated[AsyncSession, Depends(get_session)], user: Annotated[User, Depends(get_current_user)] ): return await DealService(session).change_status_manual(request, user) @deal_router.get( '/summaries', response_model=DealSummaryResponse, operation_id='getDealSummaries', dependencies=[Depends(authorized_user)] ) async def get_summary( session: Annotated[AsyncSession, Depends(get_session)] ): return await DealService(session).get_summary() @deal_router.post( '/summaries/reorder', response_model=DealSummaryResponse, operation_id='reorderDealSummaries', dependencies=[Depends(authorized_user)] ) async def reorder( session: Annotated[AsyncSession, Depends(get_session)], request: DealSummaryReorderRequest, user: Annotated[User, Depends(get_current_user)] ): return await DealService(session).reorder(request, user) @deal_router.get( '/get-all', response_model=DealGetAllResponse, operation_id='getAllDeals', dependencies=[Depends(authorized_user)] ) async def get_all( session: Annotated[AsyncSession, Depends(get_session)] ): return await DealService(session).get_all() # endpoint to get deal by id @deal_router.get( '/get/{deal_id}', response_model=DealSchema, operation_id='getDealById', dependencies=[Depends(guest_user)] ) async def get_deal_by_id( deal_id: int, user: CurrentUserDependency, session: Annotated[AsyncSession, Depends(get_session)] ): return await DealService(session).get_by_id(user, deal_id) @deal_router.post( '/update-general-info', response_model=DealUpdateGeneralInfoResponse, operation_id='updateDealGeneralInfo', dependencies=[Depends(authorized_user)] ) async def update_general_info( request: DealUpdateGeneralInfoRequest, session: Annotated[AsyncSession, Depends(get_session)] ): return await DealService(session).update_general_info(request) @deal_router.post( '/add-kit', response_model=DealAddKitResponse, operation_id='add_kit_to_deal' ) async def add_kit_to_deal( session: SessionDependency, request: DealAddKitRequest ): return await DealService(session).add_kit_to_deal(request) @deal_router.post( '/create-guest-url', response_model=DealCreateGuestUrlResponse, operation_id='create_deal_guest_url', dependencies=[Depends(authorized_user)] ) async def create_guest_url( session: SessionDependency, request: DealCreateGuestUrlRequest, user: CurrentUserDependency ): return DealService(session).create_guest_url(user, request) # endregion # region Deal services @deal_router.post( '/services/add/multiple', response_model=DealAddServicesResponse, operation_id='addMultipleDealServices', dependencies=[Depends(guest_user)] ) async def services_add( request: DealAddServicesRequest, session: Annotated[AsyncSession, Depends(get_session)], ): return await DealService(session).add_services(request) @deal_router.post( '/services/add', response_model=DealAddServiceResponse, operation_id='addDealService', dependencies=[Depends(guest_user)] ) async def services_add( request: DealAddServiceRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).add_service(user, request) @deal_router.post( '/services/update-quantity', response_model=DealUpdateServiceQuantityResponse, operation_id='updateDealServiceQuantity', dependencies=[Depends(guest_user)] ) async def services_update_quantity( request: DealUpdateServiceQuantityRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).update_service_quantity(user, request) @deal_router.post( '/services/update', response_model=DealUpdateServiceResponse, operation_id='updateDealService', dependencies=[Depends(guest_user)] ) async def services_update( request: DealUpdateServiceRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).update_service(user, request) @deal_router.post( '/services/delete', response_model=DealDeleteServiceResponse, operation_id='deleteDealService', dependencies=[Depends(guest_user)] ) async def services_delete( request: DealDeleteServiceRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).delete_service(user, request) @deal_router.post( '/services/delete/multiple', response_model=DealDeleteServicesResponse, operation_id='deleteMultipleDealServices', dependencies=[Depends(guest_user)] ) async def services_delete( request: DealDeleteServicesRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).delete_services(user, request) @deal_router.post( '/services/copy', response_model=DealServicesCopyResponse, operation_id='copy_product_services', dependencies=[Depends(guest_user)] ) async def services_copy( session: SessionDependency, request: DealServicesCopyRequest, user: CurrentUserDependency ): return await DealService(session).copy_services(user, request) # endregion # region Deal products @deal_router.post( '/products/update-quantity', response_model=DealUpdateProductQuantityResponse, operation_id='updateDealProductQuantity', dependencies=[Depends(guest_user)] ) async def products_update( request: DealUpdateProductQuantityRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).update_product_quantity(user, request) @deal_router.post( '/products/add', response_model=DealAddProductResponse, operation_id='addDealProduct', dependencies=[Depends(guest_user)] ) async def products_add( request: DealAddProductRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).add_product(user, request) @deal_router.post( '/products/delete', response_model=DealDeleteProductResponse, operation_id='deleteDealProduct', dependencies=[Depends(guest_user)] ) async def products_delete( request: DealDeleteProductRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).delete_product(user, request) @deal_router.post( '/products/delete/multiple', response_model=DealDeleteProductsResponse, operation_id='deleteMultipleDealProducts', dependencies=[Depends(guest_user)] ) async def products_delete( request: DealDeleteProductsRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).delete_products(user, request) @deal_router.post( '/product/update', response_model=DealUpdateProductResponse, operation_id='updateDealProduct', dependencies=[Depends(guest_user)] ) async def products_update( request: DealUpdateProductRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency ): return await DealService(session).update_product(user, request) @deal_router.post( '/product/add-kit', response_model=DealProductAddKitResponse, operation_id='add_kit_to_deal_product', dependencies=[Depends(guest_user)] ) async def add_kit_to_deal_product( session: SessionDependency, request: DealProductAddKitRequest, user: CurrentUserDependency ): return await DealService(session).add_kit_to_deal_product(user, request) # endregion