Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI, Depends, HTTPException, status, File, UploadFile, Form | |
| from fastapi.responses import JSONResponse | |
| from sqlalchemy.ext.asyncio import AsyncSession | |
| from sqlalchemy import select | |
| from database import async_session, engine | |
| import models | |
| import schemas | |
| import os | |
| from fastapi.middleware.cors import CORSMiddleware | |
| app = FastAPI() | |
| from fastapi.staticfiles import StaticFiles | |
| # Monta o diretório "uploads" para servir arquivos estáticos | |
| app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads") | |
| UPLOAD_DIRECTORY = "uploads" | |
| if not os.path.exists(UPLOAD_DIRECTORY): | |
| os.makedirs(UPLOAD_DIRECTORY) | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], | |
| allow_credentials=True, | |
| allow_methods=["*"], | |
| allow_headers=["*"], | |
| ) | |
| async def get_db(): | |
| async with async_session() as session: | |
| yield session | |
| async def on_startup(): | |
| async with engine.begin() as conn: | |
| await conn.run_sync(models.Base.metadata.create_all) | |
| from sqlalchemy import or_ | |
| # Nova rota para buscar promoções por palavra-chave | |
| async def buscar_promocoes(q: str, db: AsyncSession = Depends(get_db)): | |
| # Realiza a busca no título ou descrição | |
| result = await db.execute( | |
| select(models.Promocao) | |
| .where(or_(models.Promocao.titulo.contains(q), models.Promocao.descricao.contains(q))) | |
| ) | |
| promocoes = result.scalars().all() | |
| return promocoes | |
| # 1. Criar Promoção | |
| async def criar_promocao( | |
| empresa_id: int, | |
| titulo: str = Form(...), | |
| descricao: str = Form(...), | |
| imagem: UploadFile = File(...), | |
| db: AsyncSession = Depends(get_db) | |
| ): | |
| # Validações de campos obrigatórios | |
| if not titulo or not descricao: | |
| raise HTTPException(status_code=400, detail="Campos de título e descrição são obrigatórios") | |
| if not imagem: | |
| raise HTTPException(status_code=400, detail="O arquivo de imagem é obrigatório") | |
| # Salvar a imagem no diretório de uploads | |
| image_location = os.path.join(UPLOAD_DIRECTORY, imagem.filename) | |
| with open(image_location, "wb") as file: | |
| content = await imagem.read() | |
| file.write(content) | |
| image_url = f"https://fabiosantos-buscaofertaapi.hf.space/uploads/{imagem.filename}" | |
| # Criação da promoção | |
| nova_promocao = models.Promocao( | |
| titulo=titulo, | |
| descricao=descricao, | |
| imagem=image_url, | |
| empresa_id=empresa_id | |
| ) | |
| db.add(nova_promocao) | |
| await db.commit() | |
| await db.refresh(nova_promocao) | |
| return nova_promocao | |
| # 2. Listar Promoções de uma Empresa | |
| async def listar_promocoes_empresa(empresa_id: int, db: AsyncSession = Depends(get_db)): | |
| result = await db.execute(select(models.Promocao).where(models.Promocao.empresa_id == empresa_id)) | |
| promocoes = result.scalars().all() | |
| return promocoes | |
| # 3. Atualizar Promoção | |
| async def atualizar_promocao( | |
| empresa_id: int, | |
| promocao_id: int, | |
| promocao: schemas.PromocaoCreate, | |
| db: AsyncSession = Depends(get_db) | |
| ): | |
| result = await db.execute(select(models.Promocao).where(models.Promocao.id == promocao_id, models.Promocao.empresa_id == empresa_id)) | |
| promocao_db = result.scalars().first() | |
| if not promocao_db: | |
| raise HTTPException(status_code=404, detail="Promoção não encontrada.") | |
| promocao_db.titulo = promocao.titulo | |
| promocao_db.descricao = promocao.descricao | |
| await db.commit() | |
| await db.refresh(promocao_db) | |
| return promocao_db | |
| # 4. Deletar Promoção | |
| async def deletar_promocao(empresa_id: int, promocao_id: int, db: AsyncSession = Depends(get_db)): | |
| result = await db.execute(select(models.Promocao).where(models.Promocao.id == promocao_id, models.Promocao.empresa_id == empresa_id)) | |
| promocao_db = result.scalars().first() | |
| if not promocao_db: | |
| raise HTTPException(status_code=404, detail="Promoção não encontrada.") | |
| await db.delete(promocao_db) | |
| await db.commit() | |
| return JSONResponse(status_code=status.HTTP_204_NO_CONTENT, content={"message": "Promoção deletada com sucesso"}) | |