-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
180 lines (153 loc) · 7.02 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
from flask_openapi3 import OpenAPI, Info, Tag
from flask import redirect
from urllib.parse import unquote
from sqlalchemy.exc import IntegrityError
from model import Session, Produto, Comentario
from logger import logger
from schemas import *
from flask_cors import CORS
info = Info(title="Borcelle Fashion Parts Inventory", version="1.0.0")
app = OpenAPI(__name__, info=info)
CORS(app)
# ------------------------------------------------------------------------------------
# Definindo tags
# -------------------------------------------------------------------------------------
home_tag = Tag(name="Documentação", description="Seleção de documentação: Swagger, Redoc ou Rapnomeoc")
produto_tag = Tag(name="Produto", description="Adição, visualização e remoção de produtos à base")
comentario_tag = Tag(name="Comentario", description="Adição de um comentário à um produtos cadastrado na base")
@app.get('/', tags=[home_tag])
def home():
"""Redireciona para /openapi, tela que permite a escolha do estilo de documentação.
"""
return redirect('/openapi')
# ------------------------------------------------------------------------------------
# Definindo rota POST
# -------------------------------------------------------------------------------------
@app.post('/produto', tags=[produto_tag],
responses={"200": ProdutoViewSchema, "409": ErrorSchema, "400": ErrorSchema})
def add_produto(form: ProdutoSchema):
"""Adiciona um novo Produto à base de dados
Retorna uma representação dos produtos e comentários associados.
"""
produto = Produto(
nome=form.nome,
size=form.size,
quantity=form.quantity)
logger.debug(f"Adicionando produto de nome: '{produto.nome}'")
try:
# criando conexão com a base
session = Session()
# adicionando produto
session.add(produto)
# efetivando o camando de adição de novo nome na tabela
session.commit()
logger.debug(f"Adicionado produto de nome: '{produto.nome}'")
return apresenta_produto(produto), 200
except IntegrityError as e:
# como a duplicnomeade do nome é a provável razão do IntegrityError
error_msg = "Produto de mesmo nome já salvo na base :/"
logger.warning(f"Erro ao adicionar produto '{produto.nome}', {error_msg}")
return {"mesage": error_msg}, 409
except Exception as e:
# caso um erro fora do previsto
error_msg = "Não foi possível salvar novo nome :/"
logger.warning(f"Erro ao adicionar produto '{produto.nome}', {error_msg}")
return {"mesage": error_msg}, 400
# ------------------------------------------------------------------------------------
# Definindo rota GET
# -------------------------------------------------------------------------------------
@app.get('/produtos', tags=[produto_tag],
responses={"200": ListagemProdutosSchema, "404": ErrorSchema})
def get_produtos():
"""Faz a busca por todos os Produto cadastrados
Retorna uma representação da listagem de produtos.
"""
logger.debug(f"Coletando produtos ")
# criando conexão com a base
session = Session()
# fazendo a busca
produtos = session.query(Produto).all()
if not produtos:
# se não há produtos cadastrados
return {"produtos": []}, 200
else:
logger.debug(f"%d Produtos econtrados" % len(produtos))
# retorna a representação de produto
print(produtos)
return apresenta_produtos(produtos), 200
@app.get('/produto', tags=[produto_tag],
responses={"200": ProdutoViewSchema, "404": ErrorSchema})
def get_produto(query: ProdutoBuscaSchema):
"""Faz a busca por um Produto a partir do nome
Retorna uma representação dos produtos e comentários associados.
"""
produto_nome = query.nome
logger.debug(f"Coletando dados sobre produto #{produto_nome}")
# criando conexão com a base
session = Session()
# fazendo a busca
produto = session.query(Produto).filter(Produto.nome == produto_nome).first()
if not produto:
# se o produto não foi encontrado
error_msg = "Produto não encontrado na base :/"
logger.warning(f"Erro ao buscar produto '{produto_nome}', {error_msg}")
return {"mesage": error_msg}, 404
else:
logger.debug(f"Produto econtrado: '{produto.nome}'")
# retorna a representação de produto
return apresenta_produto(produto), 200
# ------------------------------------------------------------------------------------
# Definindo rota DELETE
# -------------------------------------------------------------------------------------
@app.delete('/produto', tags=[produto_tag],
responses={"200": ProdutoDelSchema, "404": ErrorSchema})
def del_produto(query: ProdutoBuscaSchema):
"""Deleta um Produto a partir do nome de produto informado
Retorna uma mensagem de confirmação da remoção.
"""
produto_nome = unquote(unquote(query.nome))
print(produto_nome)
logger.debug(f"Deletando dados sobre produto #{produto_nome}")
# criando conexão com a base
session = Session()
# fazendo a remoção
count = session.query(Produto).filter(Produto.nome == produto_nome).delete()
session.commit()
if count:
# retorna a representação da mensagem de confirmação
logger.debug(f"Deletado produto #{produto_nome}")
return {"mesage": "Produto removido", "id": produto_nome}
else:
# se o produto não foi encontrado
error_msg = "Produto não encontrado na base :/"
logger.warning(f"Erro ao deletar produto #'{produto_nome}', {error_msg}")
return {"mesage": error_msg}, 404
# ------------------------------------------------------------------------------------
# POST de comentários
# -------------------------------------------------------------------------------------
@app.post('/cometario', tags=[comentario_tag],
responses={"200": ProdutoViewSchema, "404": ErrorSchema})
def add_comentario(form: ComentarioSchema):
"""Adiciona de um novo comentário à um produtos cadastrado na base nomeentificado pelo nome
Retorna uma representação dos produtos e comentários associados.
"""
produto_id = form.produto_id
logger.debug(f"Adicionando comentários ao produto #{produto_id}")
# criando conexão com a base
session = Session()
# fazendo a busca pelo produto
produto = session.query(Produto).filter(Produto.id == produto_id).first()
if not produto:
# se produto não encontrado
error_msg = "Produto não encontrado na base :/"
logger.warning(f"Erro ao adicionar comentário ao produto '{produto_id}', {error_msg}")
return {"mesage": error_msg}, 404
# criando o comentárioss
texto = form.texto
comentario = Comentario(texto)
# adicionando o comentário ao produto
produto.adiciona_comentario(comentario)
session.commit()
logger.debug(f"Adicionado comentário ao produto #{produto_id}")
# retorna a representação de produto
return apresenta_produto(produto), 200