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"})