- Upload de arquivos formato CNAB
- Processamento de arquivo CNAB
- Processamento assíncrono em segundo plano
- Cadastro no banco de dados (PostgreSQL) de informações
- API REST
- Endpoint de consulta a informações processadas de arquivos CNAB
- Endpoint de consulta a transações
- Autenticação de usuário
- Testes automatizados
- Lista de operações importadas
- Atenticação Oauth
- Melhor cobertura de testes
- Python 3.9
- Django 4
- Docker
- Git
- Docker - Instalando o Docker
- Docker compose - Instalando o Docker Compose
- GIT Instalando o Git
- Python Instalando o Python
- Clonando o repositório
git clone git@github.com:deividsonorio/desafio-dev.git- Na pasta clonada do projeto:
docker-compose up -d- Serão criados os contâiners necesários para aplicação.
- desafio-dev_app: Contâiner do aplicativo
- desafio-dev_db: Banco de dados PostgreSQL
- desafio-dev_redis: Contâiner Redis para criação de filas
- desafio-dev_celery: Contâiner Celery para tarefas e workers
- A aplicação estará disponível em:
OBS: será necessário um usuário e senha para o acesso às URLs de consultas e ao formulário.
Um super usuário é criado automaticamente:
Usuário: desafio
Senha: dev@passA autenticação é feita através de um usuário com permissões.
Na criação do projeto um usuário é criado automaticamente:
Usuário: desafio
Senha: dev@passGET /
curl -u 'desafio:dev@pass' -i -H 'Accept: application/json' http://localhost:8000/
HTTP/1.1 200 OK
Date: Mon, 07 Mar 2022 18:48:45 GMT
Server: WSGIServer/0.2 CPython/3.9.9
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Length: 189
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
{"users":"http://localhost:8000/users/","cnab_list":"http://localhost:8000/cnab_list/","transaction_list":"http://localhost:8000/transaction_list/","upload":"http://localhost:8000/upload/"}
GET /cnab_list/
curl -u 'desafio:dev@pass' -i -H 'Accept: application/json' http://localhost:8000/cnab_list/
HTTP/1.1 200 OK
Date: Mon, 07 Mar 2022 18:49:38 GMT
Server: WSGIServer/0.2 CPython/3.9.9
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, POST, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Length: 3409
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
[{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"},{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"}]
GET /cnab_list/<ID>
curl -u 'desafio:dev@pass' -i -H 'Accept: application/json' http://localhost:8000/cnab_list/3/
HTTP/1.1 200 OK
Date: Mon, 07 Mar 2022 18:53:19 GMT
Server: WSGIServer/0.2 CPython/3.9.9
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Length: 212
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
{"type":"http://localhost:8000/transaction_list/3/","date":"20190301","value":"0000019200","cpf":"84515254073","card":"6777****1313","hour":"172712","shop_owner":"MARCOS PEREIRA","shop_name":"MERCADO DA AVENIDA"}
GET /transaction_list/
curl -u 'desafio:dev@pass' -i -H 'Accept: application/json' http://localhost:8000/transaction_list/
HTTP/1.1 200 OK
Date: Mon, 07 Mar 2022 18:55:08 GMT
Server: WSGIServer/0.2 CPython/3.9.9
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, POST, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Length: 620
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
[{"type":1,"description":"Débito","nature":"Entrada","sign":"+"},{"type":2,"description":"Boleto","nature":"Saída","sign":"-"},{"type":3,"description":"Financiamento","nature":"Saída","sign":"-"},{"type":4,"description":"Crédito","nature":"Entrada","sign":"+"},{"type":5,"description":"Recebimento Empréstimo","nature":"Entrada","sign":"+"},{"type":6,"description":"Vendas","nature":"Entrada","sign":"+"},{"type":7,"description":"Recebimento TED","nature":"Entrada","sign":"+"},{"type":8,"description":"Recebimento DOC","nature":"Entrada","sign":"+"},{"type":9,"description":"Aluguel","nature":"Saída","sign":"-"}]
GET /transaction_list/<ID>/
curl -u 'desafio:dev@pass' -i -H 'Accept: application/json' http://localhost:8000/transaction_list/5/
HTTP/1.1 200 OK
Date: Mon, 07 Mar 2022 18:56:43 GMT
Server: WSGIServer/0.2 CPython/3.9.9
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Length: 80
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
{"type":5,"description":"Recebimento Empréstimo","nature":"Entrada","sign":"+"}
POST /upload/
OBS: arquiv_cnab é o nome do campo com o arquivo que a API espera receber
curl -u 'desafio:dev@pass' -i -X POST -H "Content-Type: multipart/form-data" -F "arquivo_cnab=@CNAB.txt" http://localhost:8000/upload/
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Mon, 07 Mar 2022 19:02:06 GMT
Server: WSGIServer/0.2 CPython/3.9.9
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, POST, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Length: 46
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
"Arquivo enviado para processamento. CNAB.txt"
Os testes podem ser realizados através do comando:
docker exec desafio-dev_app_1 ./manage.py test cnab