Esse repositório tem o fim de apresentar o teste de engenharia para a SAS Educação.
Existe dois desafios, o primeiro desafio é para fazer um fluxo de leitura, salvamento e leitura de um dado provindo de um json pré definido.
Pensando em não ter a necessidade de ter uma IDE, que seja escalável e em ser portável, fiz a utilização das ferramentas do Google Cloud Platform, em um ambiente de desenvolvimento que tenho.
A primeira função, a de recebimento do json, é uma função request, está online no link, a função recebe o dado, faz o salvamento do arquivo raw no Google Storage e após isso, ele faz os testes para verificar os campos do json, baseado no exemplo abaixo:
{
"id": 0,
"statement": "",
"options": [],
"answer_key": 0,
"difficulty": "",
"grade": 0,
"lecture": 0,
"skill": {},
"properties": []
}
Se não houver todos os campos, é retornado uma mensagem de erro para o usuário, também é testado o tipo de cada campo para verificar possíveis problemas, uma mensagem de erro é retornada para o usuário, caso haja problema. Para os dados sem problemas, ele é encaminhado para salvamento na “trusted zone”, aqui foi utilizado dois tipos de bancos o Google Storage, para segurança caso haja algum problema e seja necessário fazer uma recuperação e o banco Firestore, porque ele é extremamente escalável, visto que não tenho conhecimento dos campos mais utilizados pela parte de analise, decidi usar um banco de dados não tabelado, mas que possibilita a extração dos dados em json para analise, essa função verifica duplicações de id e não faz o salvamento dessas mensagens duplicadas.
O end point é uma função post também, para fazer o download desses dados, através do Firestore.
Os Scripts com os códigos que estão online nas Cloud Functions estão no Git Lab, pois o CI/CD com o GCP é extremamente funcional. Para mais detalhes, basta seguir os links listados abaixo:
Para fazer os testes, basta fazer um request no link passando o token enviado por email e o dado que deseja enviar, podendo ser um json único ou um array com vários dados para salvamento. Como nos exemplos abaixo:
https://us-central1-weather-1-a2ea6.cloudfunctions.net/test_input_data_json | POST
headers = {
'Authorization': 'Bearer <your_token>,
'Content-Type': 'application/json'
}
body = {
"id": 0,
"statement": "",
"options": [],
"answer_key": 0,
"difficulty": "",
"grade": 20,
"lecture": 0,
"skill": {},
"properties": []
}
Os retornos possiveis são:
- 200: Todos os dados foram salvos.
- 207: Nem todos os dados foram salvos, retornando um json com os problemas que os dados apresentaram.
- 401: Chave de segurança incorreta.
- 405: Método não encontrado.
Todas as funções retornam um json com mais detalhes.
Também existe um código pronto para fazer o request descrito acima, na função send_data.py
, basta executá-la, aparecerá duas mensagens, uma solicitando o json e o do ou o caminho do arquivo json que deseja enviar e a outra, solicitando o token. Como nos exemplos abaixo:
- Envio de dado:
$ pip install -r reuirements.txt
$ python send_data.py
Por favor, insira um valor json, ou o caminho de um arquivo json que você deseje enviar: {your_data: your_data}
Por favor, insira a chave de segurança: your_token
- Envio de dado através de arquivo:
$ pip install -r reuirements.txt
$ python send_data.py
Por favor, insira um valor json, ou o caminho de um arquivo json que você deseje enviar: C:\your_repository\your_file.json
Por favor, insira a chave de segurança: your_token
https://us-central1-weather-1-a2ea6.cloudfunctions.net/test_input_data_json | POST
headers = {
'Authorization': 'Bearer <your_token>,
'Content-Type': 'application/json'
}
body = {
"id_document": value [int]
}
ou
headers = {
'Authorization': 'Bearer <your_token>,
'Content-Type': 'application/json'
}
body = {
"name_filter": value [string],
"value_filter": value [string or array],
"value_operator": value [string]
}
Os retornos possiveis são:
- 200: Extração feita com sucesso.
- 401: Chave de segurança incorreta ou dado para extração faltando.
- 405: Método não encontrado.
Existe um código pronto para fazer o request para extração, na função get_data.py
, basta executá-la, aparecerá as mensagens, fazendo as solicitações como no exemplo abaixo.
- Extração do dado pelo ID:
$ pip install -r reuirements.txt
$ python get_data.py
Exemplo:
Por favor, insira o número da opção que você deseja:
1- ID do documento
2- Filtrar documento
Insira o valor entre 1 e 2: 1
Por favor, insira o ID do documento: 10
Por favor, insira a chave de segurança: your_token
O retorno será um json com o documento.
- Extração do dado por filtro:
$ pip install -r reuirements.txt
$ python get_data.py
Exemplo:
Por favor, insira o número da opção que você deseja:
1- ID do documento
2- Filtrar documento
Insira o valor entre 1 e 2: 2
Por favor, insira o nome do filtro que deseja usar: id
Por favor, insira um dos operadores listado ["<", "<=", "==", ">", ">=", "array-contains", "in"]: in
Por favor, insira o valor do filtro que deseja usar: [1,10]
Por favor, insira a chave de segurança: your_token
O retorno será um array com os documentos.
Para a construção das tabelas pode ser feito o salvamento utilizando o Postgresql, utilizando a chave primária dele o property_id e colocando todos os campos solicitados do desafio (sendo as colunas da tabela 1: property_id, property_name, question_id, question_statement, assessment_id, assessment_type, assessment_name. E para tabela 2: property_id, property_name, property_size, assessment_id, assessment_type, assessment_name, assessment_year), mas com todos os campos podendo aceitar campos null, minha escolha pelo postgresql é feita pensando na necessidade de fazer interpolações, pois esse banco já contem alguns métodos simples, mas extremamente poderosos, para se fazer interpolações e é possível mantê-lo em plataformas online como o Heroku ou em um servidor local ou cloud.