import base64 from io import BytesIO from typing import Annotated from fastapi import APIRouter, Depends, UploadFile from sqlalchemy.ext.asyncio import AsyncSession import utils.dependecies from backend.dependecies import CurrentUserDependency from backend.session import get_session from schemas.barcode import GetProductBarcodeResponse, GetProductBarcodeRequest, GetProductBarcodePdfResponse, \ GetProductBarcodePdfRequest from schemas.base import PaginationSchema from schemas.product import * from services.auth import guest_user from services.barcode import BarcodeService from services.product import ProductService product_router = APIRouter( prefix="/product", tags=["product"], dependencies=[Depends(guest_user)] ) @product_router.post( '/create', response_model=ProductCreateResponse, operation_id='create_product' ) async def create_product( request: ProductCreateRequest, session: Annotated[AsyncSession, Depends(get_session)], user: CurrentUserDependency, ): return await ProductService(session).create(request, user) @product_router.post( '/delete', response_model=ProductDeleteResponse, operation_id='delete_product' ) async def delete_product( request: ProductDeleteRequest, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).delete(request) @product_router.post( '/update', response_model=ProductUpdateResponse, operation_id='update_product' ) async def delete_product( request: ProductUpdateRequest, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).update(request) @product_router.get( '/get', response_model=ProductGetResponse, operation_id='get_products_by_client_id' ) async def get_product( client_id: int, pagination: Annotated[PaginationSchema, Depends(utils.dependecies.pagination_parameters)], search_input: str, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).get_by_client_id(client_id, pagination, search_input) @product_router.get('/get-by-id', response_model=ProductSchema, operation_id='get_product_by_id') async def get_product_by_id( product_id: int, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).get_by_id(product_id) @product_router.post( '/barcode/add', response_model=ProductAddBarcodeResponse, operation_id='add_product_barcode' ) async def add_product_barcode( request: ProductAddBarcodeRequest, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).add_barcode(request) @product_router.get( '/barcode/exists', response_model=ProductExistsBarcodeResponse, operation_id='exists_product_barcode' ) async def exists_product_barcode( product_id: int, barcode: str, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).exists_barcode(product_id, barcode) @product_router.post( '/barcode/generate', response_model=ProductGenerateBarcodeResponse, operation_id='generate_product_barcode' ) async def generate_product_barcode( request: ProductGenerateBarcodeRequest, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).generate_barcode(request) @product_router.post( '/barcode/get', response_model=GetProductBarcodeResponse, operation_id='get_product_barcode' ) async def get_product_barcode( request: GetProductBarcodeRequest, session: Annotated[AsyncSession, Depends(get_session)] ): return await BarcodeService(session).get_barcode(request) @product_router.post( '/barcode/get-pdf', operation_id='get_product_barcode_pdf', response_model=GetProductBarcodePdfResponse ) async def get_product_barcode_pdf( request: GetProductBarcodePdfRequest, session: Annotated[AsyncSession, Depends(get_session)] ): filename, pdf_buffer = await BarcodeService(session).get_barcode_pdf(request) pdf_buffer: BytesIO base64_string = base64.b64encode(pdf_buffer.read()).decode('utf-8') return GetProductBarcodePdfResponse( base64_string=base64_string, filename=filename, mime_type='application/pdf' ) @product_router.post( '/images/upload/{product_id}', response_model=ProductUploadImageResponse, operation_id='upload_product_image' ) async def upload_product_image( product_id: int, upload_file: UploadFile, session: Annotated[AsyncSession, Depends(get_session)] ): file_bytes = upload_file.file.read() return await ProductService(session).upload_image(product_id, file_bytes) @product_router.post( '/barcode/upload-image/{product_id}', response_model=ProductUploadBarcodeImageResponse, operation_id='upload_product_barcode_image' ) async def upload_product_barcode_image( product_id: int, upload_file: UploadFile, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).upload_barcode_image(product_id, upload_file) @product_router.post( '/barcode/delete-image/{product_id}', response_model=ProductDeleteBarcodeImageResponse, operation_id='delete_product_barcode_image' ) async def delete_product_barcode_image( product_id: int, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).delete_barcode_image(product_id) @product_router.post( '/barcode/image/{product_id}', response_model=ProductGetBarcodeImageResponse, operation_id='get_product_barcode_image' ) async def get_product_barcode_image( product_id: int, session: Annotated[AsyncSession, Depends(get_session)] ): return await ProductService(session).get_barcode_image(product_id)