Essa é uma API feita em Rust, para um desafio de processo seletivo, que deve verificar se um determinado email é valido e confiavel, possui 2 métodos de validação, o v1 que utiliza de código próprio (básico) para validar um email, e o v3 que faz consulta a outra API para determinar se é valido.
O código foi construido usando o framework web Rocket na versão 0.5 para uso de async e await. Foi utilizado o SQLx para comunicação com o banco Postgres. E reqwest para requisições a API EVA
- Requisitos:
- Criar servidor com duas rotas de acesso
/
e/health
. - Adicionar rota de validação v1 (código próprio).
- Adicionar rota de validação v3 (API EVA).
- Criar banco de dados com as tabelas email_data_v1 e email_data_v3
- Atualizar rotas para salvar os dados nas tabelas
- Criar rotas com query string para consultas nas tabelas
- Suporte a docker
- Atualizar a rota de validação v3 para funcionar com concorrência, nos casos de um array.
- Criar servidor com duas rotas de acesso
- Extras:
- Adicionar mais condições para um email válido na rota de validação v1
- Implementar testes unitários para as rotas.
- Fazer tratamento de erros e remover os
.unwrap()
.
- Instale o PostgreSQL
- Instale o Rustup (ele gerencia as ferramentas do rust)
- (Em sistemas Ubuntu, recomendo rodar:
sudo apt install build-essential
) - Rode
rustup update nightly
- Verifique se os componentes, como
cargo
estão presentes no PATH do seu sistema - Rode
cargo install sqlx-cli --no-default-features --features postgres
- Clone esse projeto
- Dentro do diretorio, copie o arquivo .env.example para um novo arquivo .env
- Modifique de acordo com a configuração do seu postgres (usuario e senha)
- Rode
sqlx database create
esqlx migrate run
- Isso vai criar o banco no postgres se não existir, e rodar as migrations
- Se tudo der certo, voce está pronto para rodar:
cargo run
oucargo run --release
- O comando vai compilar e executar o binário gerado, o segundo comando irá aplicar o perfil release, e então aplicar as otimizações de código (mais demorado)
- Instale o docker e o docker-compose
- Clone esse projeto
- Entre no diretorio do projeto e rode
docker-compose up
- Aguarde a criação dos containers e o projeto compilar (essa fase é demorada)
- Se tudo estiver certo, a api estara rodando em http://localhost:8080/
URL | / |
Metodo | GET |
Paramêtros da URL | n/a |
Resposta 200 |
{
"status": "OK",
"code": 200,
"results": []
} |
URL | /health |
Metodo | GET |
Paramêtros da URL | n/a |
Resposta 200 |
{
"status": "OK",
"code": 200,
"results": [
{
"message": "Servidor executando na porta 8080"
},
]
} |
URL | /mail/db/v1 |
Metodo | GET |
Paramêtros da URL | Opcionais
id=[integer] email_address=[string] domain=[string] valid_syntax=[boolean] |
Exemplo | /mail/db/[email protected]&valid_syntax=true |
Resposta 200 |
{
"status": "OK",
"code": 200,
"results": [
{
"id": 1,
"email_address": "[email protected]",
"domain": "mail",
"valid_syntax": true,
"created_at": "2021-05-12T11:37:01.684178Z"
},
]
} |
URL | /mail/db/v3 |
Metodo | GET |
Paramêtros da URL | Opcionais
id=[integer] email_address=[string] domain=[string] valid_syntax=[boolean] disposable=[boolean] webmail=[boolean] deliverable=[boolean] catch_all=[boolean] gibberish=[boolean] spam=[boolean] |
Exemplo | /mail/db/[email protected]&valid_syntax=true |
Resposta 200 |
{
"status": "OK",
"code": 200,
"results": [
{
"email_address": "[email protected]",
"domain": "gmail.com",
"valid_syntax": true,
"disposable": false,
"webmail": true,
"deliverable": true,
"catch_all": false,
"gibberish": false,
"spam": false,
"created_at": "2021-05-12T11:18:11.413685Z"
}
]
} |
URL | /mail/validation/v1 |
Metodo | POST |
Body da Requisição |
{
"email_address": "[email protected]",
"domain": "mail"
} |
Resposta 200 |
{
"status": "OK",
"code": 200,
"results": [
{
"email_address": "[email protected]",
"domain": "mail",
"valid_syntax": true,
}
]
} |
Observação | Pode ser tambem enviado um array no body |
URL | /mail/validation/v3 |
Metodo | POST |
Body da Requisição |
{
"email_address": "[email protected]",
} |
Resposta 200 |
{
"status": "OK",
"code": 200,
"results": [
{
"email_address": "[email protected]",
"domain": "gmail.com",
"valid_syntax": true,
"disposable": false,
"webmail": true,
"deliverable": true,
"catch_all": false,
"gibberish": false,
"spam": false
}
]
} |
Observação |
Pode ser tambem enviado um array no body. Esse método ira demorar mais, devido a consulta a api Eva. |