FabioSantos commited on
Commit
9e07f58
·
verified ·
1 Parent(s): e27517c

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +131 -131
main.py CHANGED
@@ -1,131 +1,131 @@
1
- from fastapi import FastAPI, Depends, HTTPException, status, File, UploadFile, Form
2
- from fastapi.responses import JSONResponse
3
- from sqlalchemy.ext.asyncio import AsyncSession
4
- from sqlalchemy import select
5
- from database import async_session, engine
6
- import models
7
- import schemas
8
- import os
9
- from fastapi.middleware.cors import CORSMiddleware
10
-
11
- app = FastAPI()
12
-
13
- from fastapi.staticfiles import StaticFiles
14
-
15
- # Monta o diretório "uploads" para servir arquivos estáticos
16
- app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")
17
-
18
-
19
- UPLOAD_DIRECTORY = "uploads"
20
- if not os.path.exists(UPLOAD_DIRECTORY):
21
- os.makedirs(UPLOAD_DIRECTORY)
22
-
23
- app.add_middleware(
24
- CORSMiddleware,
25
- allow_origins=["*"],
26
- allow_credentials=True,
27
- allow_methods=["*"],
28
- allow_headers=["*"],
29
- )
30
-
31
- async def get_db():
32
- async with async_session() as session:
33
- yield session
34
-
35
- @app.on_event("startup")
36
- async def on_startup():
37
- async with engine.begin() as conn:
38
- await conn.run_sync(models.Base.metadata.create_all)
39
-
40
- from sqlalchemy import or_
41
-
42
- # Nova rota para buscar promoções por palavra-chave
43
- @app.get("/promocoes/search/", response_model=list[schemas.Promocao])
44
- async def buscar_promocoes(q: str, db: AsyncSession = Depends(get_db)):
45
- # Realiza a busca no título ou descrição
46
- result = await db.execute(
47
- select(models.Promocao)
48
- .where(or_(models.Promocao.titulo.contains(q), models.Promocao.descricao.contains(q)))
49
- )
50
- promocoes = result.scalars().all()
51
- return promocoes
52
-
53
-
54
- # 1. Criar Promoção
55
- @app.post("/empresas/{empresa_id}/promocoes/", response_model=schemas.Promocao)
56
- async def criar_promocao(
57
- empresa_id: int,
58
- titulo: str = Form(...),
59
- descricao: str = Form(...),
60
- imagem: UploadFile = File(...),
61
- db: AsyncSession = Depends(get_db)
62
- ):
63
- # Validações de campos obrigatórios
64
- if not titulo or not descricao:
65
- raise HTTPException(status_code=400, detail="Campos de título e descrição são obrigatórios")
66
-
67
- if not imagem:
68
- raise HTTPException(status_code=400, detail="O arquivo de imagem é obrigatório")
69
-
70
- # Salvar a imagem no diretório de uploads
71
- image_location = os.path.join(UPLOAD_DIRECTORY, imagem.filename)
72
- with open(image_location, "wb") as file:
73
- content = await imagem.read()
74
- file.write(content)
75
-
76
- image_url = f"http://127.0.0.1:8000/uploads/{imagem.filename}"
77
-
78
- # Criação da promoção
79
- nova_promocao = models.Promocao(
80
- titulo=titulo,
81
- descricao=descricao,
82
- imagem=image_url,
83
- empresa_id=empresa_id
84
- )
85
-
86
- db.add(nova_promocao)
87
- await db.commit()
88
- await db.refresh(nova_promocao)
89
- return nova_promocao
90
-
91
- # 2. Listar Promoções de uma Empresa
92
- @app.get("/empresas/{empresa_id}/promocoes/", response_model=list[schemas.Promocao])
93
- async def listar_promocoes_empresa(empresa_id: int, db: AsyncSession = Depends(get_db)):
94
- result = await db.execute(select(models.Promocao).where(models.Promocao.empresa_id == empresa_id))
95
- promocoes = result.scalars().all()
96
- return promocoes
97
-
98
- # 3. Atualizar Promoção
99
- @app.put("/empresas/{empresa_id}/promocoes/{promocao_id}", response_model=schemas.Promocao)
100
- async def atualizar_promocao(
101
- empresa_id: int,
102
- promocao_id: int,
103
- promocao: schemas.PromocaoCreate,
104
- db: AsyncSession = Depends(get_db)
105
- ):
106
- result = await db.execute(select(models.Promocao).where(models.Promocao.id == promocao_id, models.Promocao.empresa_id == empresa_id))
107
- promocao_db = result.scalars().first()
108
-
109
- if not promocao_db:
110
- raise HTTPException(status_code=404, detail="Promoção não encontrada.")
111
-
112
- promocao_db.titulo = promocao.titulo
113
- promocao_db.descricao = promocao.descricao
114
-
115
- await db.commit()
116
- await db.refresh(promocao_db)
117
- return promocao_db
118
-
119
- # 4. Deletar Promoção
120
- @app.delete("/empresas/{empresa_id}/promocoes/{promocao_id}", status_code=status.HTTP_204_NO_CONTENT)
121
- async def deletar_promocao(empresa_id: int, promocao_id: int, db: AsyncSession = Depends(get_db)):
122
- result = await db.execute(select(models.Promocao).where(models.Promocao.id == promocao_id, models.Promocao.empresa_id == empresa_id))
123
- promocao_db = result.scalars().first()
124
-
125
- if not promocao_db:
126
- raise HTTPException(status_code=404, detail="Promoção não encontrada.")
127
-
128
- await db.delete(promocao_db)
129
- await db.commit()
130
- return JSONResponse(status_code=status.HTTP_204_NO_CONTENT, content={"message": "Promoção deletada com sucesso"})
131
-
 
1
+ from fastapi import FastAPI, Depends, HTTPException, status, File, UploadFile, Form
2
+ from fastapi.responses import JSONResponse
3
+ from sqlalchemy.ext.asyncio import AsyncSession
4
+ from sqlalchemy import select
5
+ from database import async_session, engine
6
+ import models
7
+ import schemas
8
+ import os
9
+ from fastapi.middleware.cors import CORSMiddleware
10
+
11
+ app = FastAPI()
12
+
13
+ from fastapi.staticfiles import StaticFiles
14
+
15
+ # Monta o diretório "uploads" para servir arquivos estáticos
16
+ app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")
17
+
18
+
19
+ UPLOAD_DIRECTORY = "uploads"
20
+ if not os.path.exists(UPLOAD_DIRECTORY):
21
+ os.makedirs(UPLOAD_DIRECTORY)
22
+
23
+ app.add_middleware(
24
+ CORSMiddleware,
25
+ allow_origins=["*"],
26
+ allow_credentials=True,
27
+ allow_methods=["*"],
28
+ allow_headers=["*"],
29
+ )
30
+
31
+ async def get_db():
32
+ async with async_session() as session:
33
+ yield session
34
+
35
+ @app.on_event("startup")
36
+ async def on_startup():
37
+ async with engine.begin() as conn:
38
+ await conn.run_sync(models.Base.metadata.create_all)
39
+
40
+ from sqlalchemy import or_
41
+
42
+ # Nova rota para buscar promoções por palavra-chave
43
+ @app.get("/promocoes/search/", response_model=list[schemas.Promocao])
44
+ async def buscar_promocoes(q: str, db: AsyncSession = Depends(get_db)):
45
+ # Realiza a busca no título ou descrição
46
+ result = await db.execute(
47
+ select(models.Promocao)
48
+ .where(or_(models.Promocao.titulo.contains(q), models.Promocao.descricao.contains(q)))
49
+ )
50
+ promocoes = result.scalars().all()
51
+ return promocoes
52
+
53
+
54
+ # 1. Criar Promoção
55
+ @app.post("/empresas/{empresa_id}/promocoes/", response_model=schemas.Promocao)
56
+ async def criar_promocao(
57
+ empresa_id: int,
58
+ titulo: str = Form(...),
59
+ descricao: str = Form(...),
60
+ imagem: UploadFile = File(...),
61
+ db: AsyncSession = Depends(get_db)
62
+ ):
63
+ # Validações de campos obrigatórios
64
+ if not titulo or not descricao:
65
+ raise HTTPException(status_code=400, detail="Campos de título e descrição são obrigatórios")
66
+
67
+ if not imagem:
68
+ raise HTTPException(status_code=400, detail="O arquivo de imagem é obrigatório")
69
+
70
+ # Salvar a imagem no diretório de uploads
71
+ image_location = os.path.join(UPLOAD_DIRECTORY, imagem.filename)
72
+ with open(image_location, "wb") as file:
73
+ content = await imagem.read()
74
+ file.write(content)
75
+
76
+ image_url = f"https://fabiosantos-buscaofertaapi.hf.space/uploads/{imagem.filename}"
77
+
78
+ # Criação da promoção
79
+ nova_promocao = models.Promocao(
80
+ titulo=titulo,
81
+ descricao=descricao,
82
+ imagem=image_url,
83
+ empresa_id=empresa_id
84
+ )
85
+
86
+ db.add(nova_promocao)
87
+ await db.commit()
88
+ await db.refresh(nova_promocao)
89
+ return nova_promocao
90
+
91
+ # 2. Listar Promoções de uma Empresa
92
+ @app.get("/empresas/{empresa_id}/promocoes/", response_model=list[schemas.Promocao])
93
+ async def listar_promocoes_empresa(empresa_id: int, db: AsyncSession = Depends(get_db)):
94
+ result = await db.execute(select(models.Promocao).where(models.Promocao.empresa_id == empresa_id))
95
+ promocoes = result.scalars().all()
96
+ return promocoes
97
+
98
+ # 3. Atualizar Promoção
99
+ @app.put("/empresas/{empresa_id}/promocoes/{promocao_id}", response_model=schemas.Promocao)
100
+ async def atualizar_promocao(
101
+ empresa_id: int,
102
+ promocao_id: int,
103
+ promocao: schemas.PromocaoCreate,
104
+ db: AsyncSession = Depends(get_db)
105
+ ):
106
+ result = await db.execute(select(models.Promocao).where(models.Promocao.id == promocao_id, models.Promocao.empresa_id == empresa_id))
107
+ promocao_db = result.scalars().first()
108
+
109
+ if not promocao_db:
110
+ raise HTTPException(status_code=404, detail="Promoção não encontrada.")
111
+
112
+ promocao_db.titulo = promocao.titulo
113
+ promocao_db.descricao = promocao.descricao
114
+
115
+ await db.commit()
116
+ await db.refresh(promocao_db)
117
+ return promocao_db
118
+
119
+ # 4. Deletar Promoção
120
+ @app.delete("/empresas/{empresa_id}/promocoes/{promocao_id}", status_code=status.HTTP_204_NO_CONTENT)
121
+ async def deletar_promocao(empresa_id: int, promocao_id: int, db: AsyncSession = Depends(get_db)):
122
+ result = await db.execute(select(models.Promocao).where(models.Promocao.id == promocao_id, models.Promocao.empresa_id == empresa_id))
123
+ promocao_db = result.scalars().first()
124
+
125
+ if not promocao_db:
126
+ raise HTTPException(status_code=404, detail="Promoção não encontrada.")
127
+
128
+ await db.delete(promocao_db)
129
+ await db.commit()
130
+ return JSONResponse(status_code=status.HTTP_204_NO_CONTENT, content={"message": "Promoção deletada com sucesso"})
131
+