Files
Fulfillment-Backend/routers/product.py
2024-08-08 07:49:53 +03:00

167 lines
4.7 KiB
Python

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)],
):
return await ProductService(session).create(request)
@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)],
session: Annotated[AsyncSession, Depends(get_session)]
):
return await ProductService(session).get_by_client_id(client_id, pagination)
@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)