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 ()
0 commit comments