/onyo-backend-challenge

Technical Challenge proposed by Onyo (https://www.site.onyo.com/)

Primary LanguagePython

Desafio Técnico Onyo

Build Status

Este projeto é a implementação do desafio técnico proposto pela Onyo como parte do seu processo de contratação. O objetivo do desafio é criar dois microsserviços integrados, que disponibilizam informações através de uma REST API.

Conforme sugerido na especificação fornecida, um microsserviço oferece consulta de CEPs, e o outro serviço de cadastro de funcionários que usa o microsserviço de CEP para consultar endereços no cadastro de novos funcionários.

REST API

A API de cada sistema está documentado através do Swagger a partir dos seguintes links:

Attention!

Algumas operações só são disponibilizadas a usuários autenticados. Para visualizar todas as operações, faça o login no sistema de cep use fulano:1234. No sistema de funcionario, use beltrano:1234.

Exemplos de Uso

Os exemplos abaixo são baseados no projeto HTTPie

Obter Lista de CEPs

$ http GET http://onyo-cep.herokuapp.com/api/v1/ceps/
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Cache-Control: max-age=600
Connection: keep-alive
Content-Length: 541
Content-Type: application/json
Date: Mon, 10 Dec 2018 16:57:58 GMT
Expires: Mon, 10 Dec 2018 17:07:58 GMT
Server: gunicorn/19.9.0
Vary: Accept, Cookie
Via: 1.1 vegur
X-Frame-Options: SAMEORIGIN

[
    {
        "bairro": "Jardim Maria Estela",
        "cep": "04180112",
        "localidade": "São Paulo",
        "logradouro": "Travessa 19 de Agosto",
        "uf": "SP",
        "url": "http://onyo-cep.herokuapp.com/api/v1/ceps/04180112/"
    },
    {
        "bairro": "Parque Villa Flores",
        "cep": "13175667",
        "localidade": "Sumaré",
        "logradouro": "Avenida Ipê Amarelo",
        "uf": "SP",
        "url": "http://onyo-cep.herokuapp.com/api/v1/ceps/13175667/"
    },
    {
        "bairro": "Jardim da Penha",
        "cep": "29060480",
        "localidade": "Vitória",
        "logradouro": "Rua Marquês de Olinda",
        "uf": "ES",
        "url": "http://onyo-cep.herokuapp.com/api/v1/ceps/29060480/"
    }
]

Cadastrar Novo CEP

Atenção: o cadastro e alterações em registros são operações permitidas apenas a usuários autenticados. O projeto já tem um usuário autenticado cujo username e senha são fulano:1234.

$ http -a fulano:1234 POST http://onyo-cep.herokuapp.com/api/v1/ceps/ \
     cep=03047000 \
     logradouro="Rua 21 de Abril" \
     bairro=Brás \
     localidade="São Paulo" \
     uf=SP

HTTP/1.1 201 Created
Allow: GET, POST, HEAD, OPTIONS
Connection: keep-alive
Content-Length: 162
Content-Type: application/json
Date: Mon, 10 Dec 2018 17:05:26 GMT
Location: http://onyo-cep.herokuapp.com/api/v1/ceps/03047000/
Server: gunicorn/19.9.0
Vary: Accept, Cookie
Via: 1.1 vegur
X-Frame-Options: SAMEORIGIN

{
    "bairro": "Brás",
    "cep": "03047000",
    "localidade": "São Paulo",
    "logradouro": "Rua 21 de Abril",
    "uf": "SP",
    "url": "http://onyo-cep.herokuapp.com/api/v1/ceps/03047000/"
}

Obter Registro de um CEP

$ http GET http://onyo-cep.herokuapp.com/api/v1/ceps/29060480/
HTTP/1.1 200 OK
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
Cache-Control: max-age=600
Connection: keep-alive
Content-Length: 177
Content-Type: application/json
Date: Mon, 10 Dec 2018 17:09:31 GMT
Expires: Mon, 10 Dec 2018 17:19:31 GMT
Server: gunicorn/19.9.0
Vary: Accept, Cookie
Via: 1.1 vegur
X-Frame-Options: SAMEORIGIN

{
    "bairro": "Jardim da Penha",
    "cep": "29060480",
    "localidade": "Vitória",
    "logradouro": "Rua Marquês de Olinda",
    "uf": "ES",
    "url": "http://onyo-cep.herokuapp.com/api/v1/ceps/29060480/"
}

Obter Lista de Funcionários

$ http GET http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/
HTTP/1.1 200 OK
Allow: GET, POST, HEAD, OPTIONS
Cache-Control: max-age=600
Connection: keep-alive
Content-Length: 807
Content-Type: application/json
Date: Mon, 10 Dec 2018 17:11:30 GMT
Expires: Mon, 10 Dec 2018 17:21:30 GMT
Server: gunicorn/19.9.0
Vary: Accept, Cookie
Via: 1.1 vegur
X-Frame-Options: SAMEORIGIN

[
    {
        "bairro": "Parque Villa Flores",
        "cep": "13175667",
        "complemento": "casa 10",
        "cpf": "12345678901",
        "localidade": "Sumaré",
        "logradouro": "Avenida Ipê Amarelo",
        "nome": "Beltrano",
        "numero": "100",
        "uf": "SP",
        "url": "http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/12345678901/"
    },
    {
        "bairro": "Brás",
        "cep": "03047000",
        "complemento": null,
        "cpf": "22334455667",
        "localidade": "São Paulo",
        "logradouro": "Rua 21 de Abril",
        "nome": "Fulano",
        "numero": "21",
        "uf": "SP",
        "url": "http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/22334455667/"
    },
    {
        "bairro": "Jardim Maria Estela",
        "cep": "04180112",
        "complemento": null,
        "cpf": "11223344556",
        "localidade": "São Paulo",
        "logradouro": "Travessa 19 de Agosto",
        "nome": "Sicrano de Tal",
        "numero": "108",
        "uf": "SP",
        "url": "http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/11223344556/"
    }
]

Cadastro de Funcionário

Operações de alterações de registro só são permitidas para usuários autenticados. O sistema já possui um usuário autenticado: beltrano:1234.

$ http -a beltrano:1234 POST http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/ \
    cpf=12121212121 \
    nome="Bozo" \
    cep="03047000" \
    numero="1964" \
    complemento="i666"

HTTP/1.1 201 Created
Allow: GET, POST, HEAD, OPTIONS
Connection: keep-alive
Content-Length: 252
Content-Type: application/json
Date: Mon, 10 Dec 2018 17:15:21 GMT
Location: http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/12121212121/
Server: gunicorn/19.9.0
Vary: Accept, Cookie
Via: 1.1 vegur
X-Frame-Options: SAMEORIGIN

{
    "bairro": "Brás",
    "cep": "03047000",
    "complemento": "i666",
    "cpf": "12121212121",
    "localidade": "São Paulo",
    "logradouro": "Rua 21 de Abril",
    "nome": "Bozo",
    "numero": "1964",
    "uf": "SP",
    "url": "http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/12121212121/"
}

Obter Registro de Funcionário

$ http GET http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/22334455667/
HTTP/1.1 200 OK
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
Cache-Control: max-age=600
Connection: keep-alive
Content-Length: 250
Content-Type: application/json
Date: Mon, 10 Dec 2018 17:19:43 GMT
Expires: Mon, 10 Dec 2018 17:29:43 GMT
Server: gunicorn/19.9.0
Vary: Accept, Cookie
Via: 1.1 vegur
X-Frame-Options: SAMEORIGIN

{
    "bairro": "Brás",
    "cep": "03047000",
    "complemento": null,
    "cpf": "22334455667",
    "localidade": "São Paulo",
    "logradouro": "Rua 21 de Abril",
    "nome": "Fulano",
    "numero": "21",
    "uf": "SP",
    "url": "http://onyo-funcionario.herokuapp.com/api/v1/funcionarios/22334455667/"
}

Instruções para Desenvolvimento

As instruções para instalar, rodar e testar estão disponíveis no arquivo Makefile:

Alternativamente, você pode usar apenas os containers do Docker:

$ docker-compose up

Como os diretórios dos projetos cep e funcionario estão mapeados diretamente dentro dos containers, alterações locais nos projetos forçam o reinício dos serviços nos containers.

Tip

Veja docker-compose.yml para mais detalhes.

Instruções para Instalação no Heroku

$ docker-compose build
$ heroku container:login
$ docker push registry.heroku.com/onyo-cep/web
$ docker push registry.heroku.com/onyo-funcionario/web
$ heroku container:release web --app onyo-cep
$ heroku container:release web --app onyo-funcionario