buscaofertaapi / main.py
FabioSantos's picture
Update main.py
9e07f58 verified
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
@app.on_event("startup")
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
@app.get("/promocoes/search/", response_model=list[schemas.Promocao])
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
@app.post("/empresas/{empresa_id}/promocoes/", response_model=schemas.Promocao)
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
@app.get("/empresas/{empresa_id}/promocoes/", response_model=list[schemas.Promocao])
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
@app.put("/empresas/{empresa_id}/promocoes/{promocao_id}", response_model=schemas.Promocao)
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
@app.delete("/empresas/{empresa_id}/promocoes/{promocao_id}", status_code=status.HTTP_204_NO_CONTENT)
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"})