2022-01-20 12:12:44 +00:00
|
|
|
from datetime import datetime
|
2022-01-19 15:53:42 +00:00
|
|
|
import json
|
2022-01-20 12:12:44 +00:00
|
|
|
from time import time
|
2022-01-19 15:53:42 +00:00
|
|
|
|
|
|
|
import requests
|
|
|
|
|
|
|
|
class DataAPI:
|
|
|
|
"""
|
|
|
|
## Data API
|
|
|
|
---
|
|
|
|
Esta classe permite a execução de comandos básicos SQL para o banco de dados remoto do Replay.
|
|
|
|
|
|
|
|
Para que a classe funcione corretamente, é necessário que o usuário tenha acesso à chave da API do BD remoto. Devendo passá-la como parâmetro ao instanciar a classe DataAPI. Por exemplo:
|
|
|
|
d_api = DataAPI ("ahsgcn21390-dsaf_dain2eq81288sad9")
|
|
|
|
"""
|
|
|
|
|
|
|
|
ep: str = ""
|
|
|
|
|
|
|
|
def __init__ (self, api_key: str):
|
|
|
|
self.ep = "https://dataapi.digitalcircle.com.br"
|
|
|
|
self.api_key = api_key
|
|
|
|
|
|
|
|
def __request_json_post__ (self, object: dict):
|
|
|
|
|
|
|
|
"""
|
|
|
|
## HTTP JSON POST
|
|
|
|
---
|
|
|
|
Este método é responsável por realizar requisições HTTP do tipo POST para objetos JSON.
|
|
|
|
|
|
|
|
Ele retorna o corpo de resposta da requisição, ou uma mensagem de erro, que indica qual foi a irregularidade ocorrida ao chamar a API.
|
|
|
|
"""
|
|
|
|
|
|
|
|
url = self.ep + "/"
|
|
|
|
print("Calling: " + url)
|
|
|
|
|
|
|
|
headers = {"X-API-KEY": self.api_key}
|
|
|
|
res = requests.post(url, json = object, headers = headers, verify = False)
|
|
|
|
|
|
|
|
if res.status_code >= 400:
|
|
|
|
raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}")
|
|
|
|
if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1:
|
|
|
|
return json.loads(res.text)
|
|
|
|
else:
|
|
|
|
return res.text
|
|
|
|
|
2022-01-20 12:12:44 +00:00
|
|
|
def do (self, dataAPI_request: dict):
|
2022-01-19 15:53:42 +00:00
|
|
|
"""
|
|
|
|
## DataAPI Do
|
|
|
|
Este método é responsável pela execução dos comandos SQL no Banco de Dados remoto.
|
|
|
|
|
|
|
|
---
|
2022-01-20 12:12:44 +00:00
|
|
|
#### Parâmetros de dataAPI_request:
|
|
|
|
- Col: Nome da tabela SQL em que se quer realizar a operação (OBRIGATÓRIO)
|
|
|
|
- Op: Operação que se quer desenvolver. São elas: "R", "C", "D", "U" (OBRIGATÓRIO)
|
2022-01-19 15:53:42 +00:00
|
|
|
- R: Retrieve (Busca informações da coluna da tabela)
|
|
|
|
- C: Create (Cria uma nova tabela)
|
|
|
|
- D: Delete (Deleta uma tabela ou as colunas de uma tabela)
|
|
|
|
- U: Update (Atualiza as informações de uma tabela)
|
|
|
|
|
2022-01-20 12:12:44 +00:00
|
|
|
- Q: Nome do atributo (coluna) que se quer consultar ou alterar na tabela SQL
|
|
|
|
- Id: Identificador da instância (linha) da tabela que se quer realizar a operação
|
|
|
|
- Data: Dados que se quer inserir na tabela
|
2022-01-19 15:53:42 +00:00
|
|
|
|
|
|
|
---
|
|
|
|
#### Retorna:
|
|
|
|
-> O retorno do comando feito, qualquer que seja ele.
|
|
|
|
"""
|
|
|
|
|
2022-01-20 12:12:44 +00:00
|
|
|
return self.__request_json_post__(dataAPI_request)
|
|
|
|
|
|
|
|
def registrar_exec (self, register_table: str, check: bool):
|
|
|
|
"""
|
|
|
|
## Registrar Execução
|
|
|
|
Esta função é utilizada para realizar um registro de execuções falhas e bem sucedidas de um robô. Tudo é feito diretamente na Base de Dados remota, eliminando a necessidade de planilhas Excel locais.
|
|
|
|
|
|
|
|
---
|
|
|
|
#### Parâmetros:
|
|
|
|
- register_table: Tabela utilizada para os registros de execução. Para começos de projeto, procure criar uma nova tabela, cheque se ela já existe utilizando a operação de Retrieve pelo método Do.
|
|
|
|
- check: Assume dois valores dependendo do sucesso da execução do robô: True ou False.
|
|
|
|
- True: Execução obteve sucesso.
|
|
|
|
- False: Execução falhou em algum ponto.
|
|
|
|
|
|
|
|
---
|
|
|
|
#### Retorna:
|
|
|
|
---
|
|
|
|
"""
|
|
|
|
|
|
|
|
table_check = self.do({
|
|
|
|
"Col": register_table,
|
|
|
|
"Op": "R",
|
|
|
|
"Q": f"@[?date=='{datetime.now().isoformat()}']"
|
|
|
|
})
|
2022-01-19 15:53:42 +00:00
|
|
|
|
2022-01-20 12:12:44 +00:00
|
|
|
if len(table_check["data"]) > 0:
|
|
|
|
data = table_check["data"][0]
|
|
|
|
id = str(int(data["ID"]))
|
2022-01-19 15:53:42 +00:00
|
|
|
|
2022-01-20 12:12:44 +00:00
|
|
|
if check:
|
|
|
|
success = int(data["exec"]) + 1
|
2022-01-19 15:53:42 +00:00
|
|
|
|
2022-01-20 12:12:44 +00:00
|
|
|
try:
|
|
|
|
self.do({
|
|
|
|
"Col": register_table,
|
|
|
|
"Op": "U",
|
|
|
|
"Id": id,
|
|
|
|
"Data": {
|
|
|
|
"exec": success
|
|
|
|
}
|
|
|
|
})
|
|
|
|
except:
|
|
|
|
return "Algo falhou ao registrar a execução"
|
|
|
|
|
|
|
|
else:
|
|
|
|
fail = int(data["err"]) + 1
|
|
|
|
|
|
|
|
try:
|
|
|
|
self.do({
|
|
|
|
"Col": register_table,
|
|
|
|
"Op": "U",
|
|
|
|
"Id": id,
|
|
|
|
"Data": {
|
|
|
|
"err": fail
|
|
|
|
}
|
|
|
|
})
|
|
|
|
except:
|
|
|
|
return "Algo falhou ao registrar a execução"
|
|
|
|
|
|
|
|
else:
|
|
|
|
if check:
|
|
|
|
success = 1
|
|
|
|
fail = 0
|
|
|
|
else:
|
|
|
|
success = 0
|
|
|
|
fail = 1
|
|
|
|
|
|
|
|
try:
|
|
|
|
self.do({
|
|
|
|
"Col": register_table,
|
|
|
|
"Op": "C",
|
|
|
|
"Data": {
|
|
|
|
"date": datetime.now().isoformat(),
|
|
|
|
"exec": success,
|
|
|
|
"err": fail,
|
|
|
|
}
|
|
|
|
})
|
|
|
|
except:
|
|
|
|
return "Algo falhou ao registrar a execução"
|