Skip to content

Commit dc3a7ba

Browse files
committed
Adicionar implementação da API
Colocando a implementação da API que estava no repo do app para esse repo
1 parent 19a96a4 commit dc3a7ba

File tree

4 files changed

+225
-0
lines changed

4 files changed

+225
-0
lines changed

API/app.py

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
# -*- coding: utf-8 -*-
2+
3+
__author__ = "The Midway"
4+
__copyright__ = "COPYRIGHT © 2021 The Midway"
5+
__version__ = "0.1"
6+
__status__ = "local communication"
7+
__license__ = "https://github.com/biaduque/TheMidway/blob/main/LICENSE"
8+
9+
10+
## Bibliotecas necessárias:
11+
from datetime import datetime, timedelta
12+
13+
from flask import Flask, request, Response
14+
from flask.json import jsonify
15+
from flask_mysqldb import MySQL
16+
17+
from os import getenv, environ
18+
19+
20+
## Criando a aplicação:
21+
app = Flask(__name__)
22+
23+
app.secret_key = str(environ.get("SECRET_KEY", 'nada'))
24+
25+
26+
# Configuração do JSON
27+
app.config['JSON_AS_ASCII'] = False
28+
29+
# Conexão com o banco de dados
30+
app.config['MYSQL_HOST'] = str(environ.get("MYSQL_HOST", 'localhost'))
31+
app.config['MYSQL_USER'] = str(environ.get("MYSQL_USER", 'root'))
32+
app.config['MYSQL_PASSWORD'] = str(environ.get("MYSQL_PASSWORD", getenv("SENHA_BD")))
33+
app.config['MYSQL_DB'] = str(environ.get("MYSQL_DB", 'themidway'))
34+
35+
36+
# MySql -> Banco de dados
37+
mysql = MySQL(app)
38+
39+
40+
# Tabela sendo usada
41+
TABELA = "encontros"
42+
43+
COLUNAS: tuple = ("data", "hora", "nome", "tipo", "longitude", "latitude", "pais", "cidade", "bairro", "endereco", "numero")
44+
45+
# Cria a rota principal (encontros) com os métodos GET e POST.
46+
@app.route(f'/{TABELA}', methods=['GET', 'POST'])
47+
def home():
48+
r"""Função principal que é executada assim que faz uma requisição."""
49+
50+
if request.method == "GET":
51+
# Se comunica com o banco de dados
52+
data = database_maneger("GET", ())
53+
54+
# Ajeita os dados
55+
new_data = convert_data(data)
56+
57+
# Cria o JSON
58+
to_json = jsonify({"itens": new_data})
59+
60+
return to_json
61+
62+
63+
elif request.method == "POST":
64+
# Pega os dados passados por parâmetro
65+
data_parameters = []
66+
for col in COLUNAS:
67+
try:
68+
data = request.args.get(col)
69+
if data == "":
70+
data = None
71+
except:
72+
data = None
73+
finally:
74+
data_parameters.append(data)
75+
76+
# Se comunica com a banco de dados
77+
data = database_maneger("POST", tuple(data_parameters))
78+
79+
return Response(status=200)
80+
81+
return Response(status=404)
82+
83+
84+
#### MANIPULAÇÃO DOS DADOS ####
85+
86+
def convert_data(data: tuple) -> str:
87+
r"""Função responsável por criar os itens da lista do JSON."""
88+
itens: list = []
89+
for line in data:
90+
data_filtred = create_encontro_item(line)
91+
itens.append(data_filtred)
92+
93+
return itens
94+
95+
96+
def create_encontro_item(data: tuple) -> dict:
97+
r"""Cria o dicionário para cada linha recebida do banco de dados."""
98+
99+
column_names = ["id","", "date", "hour", "name", "type", "latitude", "longitude", "country", "city", "district", "address", "number"]
100+
101+
dict_data = {}
102+
for x in range(len(data)):
103+
if x != 1:
104+
if x == 2:
105+
data_date: datetime = data[x]
106+
dict_data[column_names[x]] = data_date.strftime("%d/%m/%Y")
107+
elif x == 3:
108+
dict_data[column_names[x]] = str(data[x])[:5]
109+
else:
110+
dict_data[column_names[x]] = data[x]
111+
return dict_data
112+
113+
114+
#### COMUNICAÇÃO COM O BANCO DE DADOS ####
115+
116+
def database_maneger(type: str, data: tuple) -> tuple:
117+
r"""Toda comunicação com o banco de dados é feita nessa função"""
118+
119+
# Cria a conecção
120+
cur = mysql.connection.cursor()
121+
122+
if type == "GET":
123+
# Executa o comando
124+
cur.execute(f"SELECT * FROM {TABELA}")
125+
126+
# Salva em uma variável
127+
data = cur.fetchall()
128+
129+
130+
elif type == "POST":
131+
# Cria uma lista para poder editar
132+
data_list = list(data)
133+
134+
# Converte a data em str para o tipo data (str -> datetime)
135+
data_list[0] = datetime.strptime(data_list[0], '%d/%m/%Y')
136+
137+
# Converte a hora em str para o tipo hora (str -> timedelta)
138+
hour_datetime = datetime.strptime(data_list[1], '%H:%M')
139+
data_list[1] = timedelta(hours=hour_datetime.hour, minutes=hour_datetime.minute)
140+
141+
# Latitude: (str -> float)
142+
data_list[4] = float(data_list[4])
143+
144+
# Longitude: (str -> float)
145+
data_list[5] = float(data_list[5])
146+
147+
148+
# Cria uma tupla
149+
data_tuple = tuple(data_list)
150+
151+
152+
# Configurações para o comando:
153+
column_str = str(COLUNAS).replace("\'", "")
154+
infos: str = "(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
155+
156+
# Executa o comando
157+
cur.execute(f"INSERT INTO {TABELA} {column_str} VALUES {infos}", data_tuple)
158+
159+
160+
cur.close() # Fecha a comunicação
161+
mysql.connection.commit() # Da um commit no MySQL
162+
return data
163+
164+
165+
166+
def main() -> None:
167+
r"""Função main, o que precisa pra rodar"""
168+
169+
port = int(environ.get("PORT", 5000))
170+
app.run(host='0.0.0.0', port=port, debug=True)
171+
172+
173+
# Execução da função main.
174+
if __name__ == '__main__':
175+
main()

API/scripts.sql

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
-- Oberservação: Tire os comentários que estão na frente de um comando, se não não irá funcionar.
2+
3+
-- Criando o banco de dados
4+
create database theMidway
5+
default character set utf8mb4;
6+
7+
8+
-- Criando a tabela
9+
use theMidway;
10+
create table encontros (
11+
id int not null auto_increment PRIMARY KEY, -- Chave primária
12+
data_post datetime default CURRENT_TIMESTAMP, -- Data da adição do dado
13+
data date, -- Data do encontro
14+
hora time, -- Hora do Encontro
15+
nome varchar(100), -- Nome do Local
16+
tipo varchar(20), -- Tipo do local (restaurante, bar..)
17+
longitude float,
18+
latitude float,
19+
pais char(3),
20+
cidade char(2),
21+
bairro varchar(60),
22+
endereco varchar(100),
23+
numero varchar(20)
24+
) default character set utf8mb4 ;
25+
26+
27+
-- Ver todos valores
28+
use theMidway;
29+
select * from encontros;
30+
31+
32+
-- Apagar o banco de dados
33+
use theMidway;
34+
drop database theMidway;
35+
36+
37+
-- Apagar todos os dados de uma tabela
38+
use theMidway;
39+
truncate table encontros;

Procfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
web: cd API; gunicorn app:app

requirements.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
click==8.0.3
2+
colorama==0.4.4
3+
Flask==2.0.2
4+
Flask-MySQLdb==0.2.0
5+
gunicorn==20.1.0
6+
itsdangerous==2.0.1
7+
Jinja2==3.0.3
8+
MarkupSafe==2.0.1
9+
mysqlclient==2.1.0
10+
Werkzeug==2.0.2

0 commit comments

Comments
 (0)