-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
173 lines (141 loc) · 5.64 KB
/
Copy pathapp.py
File metadata and controls
173 lines (141 loc) · 5.64 KB
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
from flask_openapi3 import OpenAPI, Info, Tag
from flask import redirect, request, jsonify
from urllib.parse import unquote
from sqlalchemy.exc import IntegrityError
from model import Session, Cupom
from logger import logger
from schemas import *
from flask_cors import CORS
from schemas.cupom import CupomDelSchema
info = Info(title="Cupom", 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 RapiDoc")
cupom_tag = Tag(name="Cupom", description="CRUD de CUPOM")
@app.get('/', tags=[home_tag])
def home():
"""Redireciona para /openapi, tela que permite a escolha do estilo de documentação.
"""
return redirect('/openapi')
@app.post('/cupom', tags=[cupom_tag],
responses={"200": CupomViewSchema, "409": ErrorSchema, "400": ErrorSchema})
def add_produto(form: CupomSchema):
"""Adiciona um cupom
Retorna uma representação de cupom.
{
"nome": "TIAGO10",
"valor": 0.9
}
"""
cupom = Cupom(
nome = request.json['nome'],
valor = request.json['valor'])
logger.debug(f"Adicionando produto de nome: '{cupom.nome}'")
try:
# criando conexão com a base
session = Session()
# adicionando um cupom
session.add(cupom)
# efetivando o camando de adição de novo item na tabela
session.commit()
logger.debug(f"Adicionado cupom de nome: '{cupom.nome}'")
return apresenta_produto(cupom), 200
except IntegrityError as e:
# como a duplicidade do nome é a provável razão do IntegrityError
error_msg = "Cupom de mesmo nome já salvo na base :/"
logger.warning(f"Erro ao adicionar cupom '{cupom.nome}', {error_msg}")
return {"message": error_msg}, 409
except Exception as e:
# caso um erro fora do previsto
error_msg = "Não foi possível salvar novo item :/"
logger.warning(f"Erro ao adicionar cupom '{cupom.nome}', {error_msg}")
return {"message": error_msg}, 400
@app.get('/cupom', tags=[cupom_tag],
responses={"200": ListagemCuponsSchema, "404": ErrorSchema})
def get_produtos():
"""Faz a busca por todas os cupons cadastradas
Retorna uma representação da listagem de cupons.
"""
logger.debug(f"Coletando cupons")
# criando conexão com a base
session = Session()
# fazendo a busca
cupons = session.query(Cupom).all()
if not cupons:
# se não há cupons cadastrados
return {"cupons": []}, 200
else:
logger.debug(f"%d Cupons econtradas" % len(cupons))
# retorna a representação de produto
print(cupons)
return apresenta_produtos(cupons), 200
@app.get('/cupom', tags=[cupom_tag],
responses={"200": CupomViewSchema, "404": ErrorSchema})
def get_produto(query: CupomBuscaSchema):
"""Faz a busca por um Cupom a partir do id de um CUPOM
Retorna uma representação das Cupom e lances associados.
"""
cupom_id = query.nome
logger.debug(f"Coletando dados sobre produto #{cupom_id}")
# criando conexão com a base
session = Session()
# fazendo a busca
cupom = session.query(Cupom).filter(Cupom.nome == cupom_id).first()
if not cupom:
# se o cupom não foi encontrado
error_msg = "Cupom não encontrada na base :/"
logger.warning(f"Erro ao buscar produto '{cupom_id}', {error_msg}")
return {"message": error_msg}, 404
else:
logger.debug(f"Produto econtrado: '{cupom.nome}'")
# retorna a representação da cupom
return apresenta_produto(cupom), 200
@app.delete('/cupom', tags=[cupom_tag],
responses={"200": CupomDelSchema, "404": ErrorSchema})
def del_produto(query: CupomBuscaSchema):
"""Deleta um cupom a partir do nome de cupom
Retorna uma mensagem de confirmação da remoção.
"""
cupom_nome = unquote(unquote(query.nome))
logger.debug(f"Deletando dados sobre produto #{cupom_nome}")
# criando conexão com a base
session = Session()
# fazendo a remoção
count = session.query(Cupom).filter(Cupom.nome == cupom_nome).delete()
session.commit()
if count:
# retorna a representação da mensagem de confirmação
logger.debug(f"Deletado produto #{cupom_nome}")
return {"message": "Produto removido", "id": cupom_nome}
else:
# se o produto não foi encontrado
error_msg = "Produto não encontrado na base :/"
logger.warning(f"Erro ao deletar produto #'{cupom_nome}', {error_msg}")
return {"message": error_msg}, 404
@app.put('/cupom', tags=[cupom_tag],
responses={"200": CupomViewSchema, "404": ErrorSchema})
def update_produto():
"""Edita o cupom
Retorna uma mensagem de confirmação da atualização.
"""
idItem = request.json['id']
nome = request.json['nome']
valor = request.json['valor']
# criando conexão com a base
session = Session()
cupomBanco = session.query(Cupom).filter_by(id = idItem).first()
logger.debug(f"Atualizando dados do cupom #{cupomBanco.id} com nome #{cupomBanco.nome} ")
# fazendo a atualizacao
cupomBanco.nome = nome
cupomBanco.valor = valor
session.commit()
if cupomBanco:
# retorna a representação da mensagem de confirmação
logger.debug(f"Atualizando cupom #{idItem}")
return {"message": "Cupom atualizado", "id": idItem}
else:
# se o produto não foi encontrado
error_msg = "Cupom não encontrado na base :/"
logger.warning(f"Erro ao atualizar cupom #'{idItem}', {error_msg}")
return {"message": error_msg}, 404