/test-sas-educacao

Teste técnico SAS Educação

Primary LanguagePythonMIT LicenseMIT

Teste técnico SAS Educação

Esse repositório tem o fim de apresentar o teste de engenharia para a SAS Educação.

Introduçã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.

Resolução proposta - Objetivo 1

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.

Arquitetura

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.

Scripts GitLab

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:

Teste

Envio de dados

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

Extração de dados

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.

Resolução proposta - Objetivo 2

Arquitetura

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.