Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Leonardo scalabrini patch 1 #44

Open
wants to merge 67 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
160dd4d
Initial commit
Jul 30, 2023
6fddd9c
Adjusts
LeonardoScalabrini Jul 30, 2023
d59a3ff
Formatted code
LeonardoScalabrini Jul 30, 2023
ee09de5
Added .upload folder
LeonardoScalabrini Jul 30, 2023
cd6c97e
Added .upload folder
LeonardoScalabrini Jul 30, 2023
17b45c2
Fixed some vulnerabilities
LeonardoScalabrini Jul 30, 2023
b5438b7
Fixed some vulnerabilities
LeonardoScalabrini Jul 30, 2023
43ef2ae
Implemented domains
LeonardoScalabrini Jul 31, 2023
f30e561
Implemented domains tests
LeonardoScalabrini Jul 31, 2023
d829210
Implemented domains tests
LeonardoScalabrini Jul 31, 2023
34190d0
Fixed some code smells
LeonardoScalabrini Jul 31, 2023
86e2b96
Implemented a refactor
LeonardoScalabrini Jul 31, 2023
998e236
Implemented entity
LeonardoScalabrini Jul 31, 2023
1c2936c
Implemented Cnab
LeonardoScalabrini Jul 31, 2023
f83804d
Implemented Cnab test
LeonardoScalabrini Aug 1, 2023
22affe4
Implemented more Cnab test
LeonardoScalabrini Aug 1, 2023
525dce7
Implemented UploadService
LeonardoScalabrini Aug 1, 2023
2e5062b
Optimized imports
LeonardoScalabrini Aug 1, 2023
c9617eb
Formatted code
LeonardoScalabrini Aug 1, 2023
24725da
Implemented store
LeonardoScalabrini Aug 1, 2023
94a502c
Fixed jpa tests
LeonardoScalabrini Aug 1, 2023
042c5a1
Solved some code smells
LeonardoScalabrini Aug 1, 2023
2738272
Implemented dto and storage service
LeonardoScalabrini Aug 1, 2023
a35943c
Solved encoding problem
LeonardoScalabrini Aug 1, 2023
4e7fa2f
Solved code smells
LeonardoScalabrini Aug 1, 2023
efe15de
Solved balance not updating
LeonardoScalabrini Aug 1, 2023
e157cf2
Updated readme
LeonardoScalabrini Aug 1, 2023
2e36756
Updated readme
LeonardoScalabrini Aug 1, 2023
830b35a
Implemented to transaction controller filter by store
LeonardoScalabrini Aug 2, 2023
1c1c3ae
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
52c5b6c
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
58fc367
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
5ffdb91
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
f2acf4b
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
100a6e4
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
4337cbe
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
8ae9bd6
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
1358a08
Add build and regitry image ci
LeonardoScalabrini Aug 4, 2023
b5de53b
Updated the README.md file
LeonardoScalabrini Aug 4, 2023
757a2db
Update targetFile.tmp
LeonardoScalabrini Aug 5, 2023
c26afe3
Implemented IaC
LeonardoScalabrini Aug 6, 2023
f0a8763
Implemented IaC
LeonardoScalabrini Aug 6, 2023
28880a3
Implemented IaC
LeonardoScalabrini Aug 6, 2023
9cf26b1
Implemented IaC
LeonardoScalabrini Aug 6, 2023
0951243
Implemented IaC
LeonardoScalabrini Aug 6, 2023
bc21848
Implemented IaC
LeonardoScalabrini Aug 6, 2023
dfa536f
Implemented IaC
LeonardoScalabrini Aug 6, 2023
c9ac1c6
Implemented IaC
LeonardoScalabrini Aug 6, 2023
a6eabc3
Implemented IaC
LeonardoScalabrini Aug 6, 2023
1715467
Implemented IaC
LeonardoScalabrini Aug 6, 2023
a80d09c
Implemented IaC
LeonardoScalabrini Aug 6, 2023
ad87017
Implemented IaC
LeonardoScalabrini Aug 8, 2023
d428335
Implemented IaC
LeonardoScalabrini Aug 8, 2023
4d55e70
Implemented IaC
LeonardoScalabrini Aug 8, 2023
faa9dbe
Implemented deploy
LeonardoScalabrini Aug 8, 2023
662887d
Implemented deploy
LeonardoScalabrini Aug 8, 2023
940d8e2
Implemented deploy
LeonardoScalabrini Aug 8, 2023
4d0623f
Implemented deploy
LeonardoScalabrini Aug 8, 2023
08db634
Implemented deploy
LeonardoScalabrini Aug 8, 2023
5f3fe57
Implemented deploy
LeonardoScalabrini Aug 8, 2023
f41e8de
Implemented deploy
LeonardoScalabrini Aug 8, 2023
3ac51db
Implemented deploy
LeonardoScalabrini Aug 8, 2023
d65df0f
Implemented deploy
LeonardoScalabrini Aug 8, 2023
4b50b4b
Create api-scan
LeonardoScalabrini Aug 8, 2023
1168f8b
Update and rename api-scan to api-scan.yml
LeonardoScalabrini Aug 8, 2023
5819e3d
Update api-scan.yml
LeonardoScalabrini Aug 8, 2023
db3f421
Update github-ci.yml
LeonardoScalabrini Aug 8, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .cache/google-java-format-1.7-all-deps.jar
Binary file not shown.
2 changes: 2 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*
!target/desafio-dev-0.0.1-SNAPSHOT.jar
16 changes: 16 additions & 0 deletions .github/workflows/api-scan.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: API Scan workflow

on:
workflow_call:
secrets:
END_POINT:
required: true

jobs:
reusable_workflow_job:
runs-on: ubuntu-latest
name: API Scan
steps:
- uses: zaproxy/[email protected]
with:
target: ${{ secrets.END_POINT }}
30 changes: 30 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: Build and Publish Docker image

on:
workflow_call:
secrets:
PROJECT_ID:
required: true
CLOUD_CREDENTIAL:
required: true
ZONE:
required: true
CLUSTER_NAME:
required: true

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: google-github-actions/auth@v1
with:
credentials_json: ${{ secrets.CLOUD_CREDENTIAL }}
- uses: google-github-actions/get-gke-credentials@v1
with:
cluster_name: ${{ secrets.CLUSTER_NAME }}
location: ${{ secrets.ZONE }}
- run: kubectl apply -f kube\
- run: kubectl rollout status deployment/desafio-dev
- run: kubectl get services -o wide

28 changes: 28 additions & 0 deletions .github/workflows/docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Build and Publish Docker image

on:
workflow_call:
secrets:
DOCKERHUB_USERNAME:
required: true
DOCKERHUB_TOKEN:
required: true

jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK
uses: actions/setup-java@v1
with:
java-version: 1.11
- name: Build with Maven
run: mvn clean install -DskipTests
- name: Publish to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
repository: leonardoscalabrini/desafio-dev
tags: latest
35 changes: 35 additions & 0 deletions .github/workflows/github-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: GitHub CI

on:
push:
branches: [ main ]

jobs:
quality-check:
uses: ./.github/workflows/sonarcloud.yml
secrets:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
build-image:
needs: [quality-check]
uses: ./.github/workflows/docker.yml
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
create-infrastructure:
needs: [ build-image ]
uses: ./.github/workflows/iac.yml
secrets:
TF_API_TOKEN: ${{ secrets.TF_API_TOKEN }}
deploy:
needs: [ create-infrastructure ]
uses: ./.github/workflows/deploy.yml
secrets:
PROJECT_ID: ${{ secrets.PROJECT_ID }}
CLOUD_CREDENTIAL: ${{ secrets.CLOUD_CREDENTIAL }}
ZONE: ${{ secrets.ZONE }}
CLUSTER_NAME: ${{ secrets.CLUSTER_NAME }}
api-scan:
needs: [ deploy ]
uses: ./.github/workflows/api-scan.yml
secrets:
END_POINT: ${{ secrets.END_POINT }}
22 changes: 22 additions & 0 deletions .github/workflows/iac.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: IaC workflow

on:
workflow_call:
secrets:
TF_API_TOKEN:
required: true

jobs:
reusable_workflow_job:
runs-on: ubuntu-latest
name: IaC
steps:
- uses: actions/checkout@v2
- uses: hashicorp/setup-terraform@v1
with:
cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}
- run: terraform init
- run: terraform fmt
- run: terraform validate
- run: terraform plan
- run: terraform apply -auto-approve
39 changes: 39 additions & 0 deletions .github/workflows/sonarcloud.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: SonarCloud

on:
workflow_call:
secrets:
SONAR_TOKEN:
required: true

pull_request:
types: [opened, synchronize, reopened]
jobs:
build:
name: Build and analyze
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache SonarCloud packages
uses: actions/cache@v1
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Maven packages
uses: actions/cache@v1
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Build and analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=leonardoscalabrini_desafio-dev
33 changes: 33 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**
!**/src/test/**

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/

### VS Code ###
.vscode/

upload/targetFile.tmp
6 changes: 6 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FROM openjdk:slim
LABEL maintainer="[email protected]"
ENV JAR_FILE=desafio-dev-0.0.1-SNAPSHOT.jar
COPY /target/${JAR_FILE} desafio-dev.jar
HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 CMD ["curl --fail --silent localhost:8080/actuator/health | grep UP || exit 1"]
ENTRYPOINT ["java","-jar","/desafio-dev.jar"]
166 changes: 81 additions & 85 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,85 +1,81 @@
# Desafio programação - para vaga desenvolvedor

Por favor leiam este documento do começo ao fim, com muita atenção.
O intuito deste teste é avaliar seus conhecimentos técnicos em programação.
O teste consiste em parsear [este arquivo de texto(CNAB)](https://github.com/ByCodersTec/desafio-ruby-on-rails/blob/master/CNAB.txt) e salvar suas informações(transações financeiras) em uma base de dados a critério do candidato.
Este desafio deve ser feito por você em sua casa. Gaste o tempo que você quiser, porém normalmente você não deve precisar de mais do que algumas horas.

# Instruções de entrega do desafio

1. Primeiro, faça um fork deste projeto para sua conta no Github (crie uma se você não possuir).
2. Em seguida, implemente o projeto tal qual descrito abaixo, em seu clone local.
3. Por fim, envie via email o projeto ou o fork/link do projeto para seu contato Bycoders_ com cópia para [email protected].

# Descrição do projeto

Você recebeu um arquivo CNAB com os dados das movimentações finanaceira de várias lojas.
Precisamos criar uma maneira para que estes dados sejam importados para um banco de dados.

Sua tarefa é criar uma interface web que aceite upload do [arquivo CNAB](https://github.com/ByCodersTec/desafio-ruby-on-rails/blob/master/CNAB.txt), normalize os dados e armazene-os em um banco de dados relacional e exiba essas informações em tela.

**Sua aplicação web DEVE:**

1. Ter uma tela (via um formulário) para fazer o upload do arquivo(pontos extras se não usar um popular CSS Framework )
2. Interpretar ("parsear") o arquivo recebido, normalizar os dados, e salvar corretamente a informação em um banco de dados relacional, **se atente as documentações** que estão logo abaixo.
3. Exibir uma lista das operações importadas por lojas, e nesta lista deve conter um totalizador do saldo em conta
4. Ser escrita na sua linguagem de programação de preferência
5. Ser simples de configurar e rodar, funcionando em ambiente compatível com Unix (Linux ou Mac OS X). Ela deve utilizar apenas linguagens e bibliotecas livres ou gratuitas.
6. Git com commits atomicos e bem descritos
7. PostgreSQL, MySQL ou SQL Server
8. Ter testes automatizados
9. Docker compose (Pontos extras se utilizar)
10. Readme file descrevendo bem o projeto e seu setup
11. Incluir informação descrevendo como consumir o endpoint da API

**Sua aplicação web não precisa:**

1. Lidar com autenticação ou autorização (pontos extras se ela fizer, mais pontos extras se a autenticação for feita via OAuth).
2. Ser escrita usando algum framework específico (mas não há nada errado em usá-los também, use o que achar melhor).
3. Documentação da api.(Será um diferencial e pontos extras se fizer)

# Documentação do CNAB

| Descrição do campo | Inicio | Fim | Tamanho | Comentário
| ------------- | ------------- | -----| ---- | ------
| Tipo | 1 | 1 | 1 | Tipo da transação
| Data | 2 | 9 | 8 | Data da ocorrência
| Valor | 10 | 19 | 10 | Valor da movimentação. *Obs.* O valor encontrado no arquivo precisa ser divido por cem(valor / 100.00) para normalizá-lo.
| CPF | 20 | 30 | 11 | CPF do beneficiário
| Cartão | 31 | 42 | 12 | Cartão utilizado na transação
| Hora | 43 | 48 | 6 | Hora da ocorrência atendendo ao fuso de UTC-3
| Dono da loja | 49 | 62 | 14 | Nome do representante da loja
| Nome loja | 63 | 81 | 19 | Nome da loja

# Documentação sobre os tipos das transações

| Tipo | Descrição | Natureza | Sinal |
| ---- | -------- | --------- | ----- |
| 1 | Débito | Entrada | + |
| 2 | Boleto | Saída | - |
| 3 | Financiamento | Saída | - |
| 4 | Crédito | Entrada | + |
| 5 | Recebimento Empréstimo | Entrada | + |
| 6 | Vendas | Entrada | + |
| 7 | Recebimento TED | Entrada | + |
| 8 | Recebimento DOC | Entrada | + |
| 9 | Aluguel | Saída | - |

# Avaliação

Seu projeto será avaliado de acordo com os seguintes critérios.

1. Sua aplicação preenche os requerimentos básicos?
2. Você documentou a maneira de configurar o ambiente e rodar sua aplicação?
3. Você seguiu as instruções de envio do desafio?
4. Qualidade e cobertura dos testes unitários.

Adicionalmente, tentaremos verificar a sua familiarização com as bibliotecas padrões (standard libs), bem como sua experiência com programação orientada a objetos a partir da estrutura de seu projeto.

# Referência

Este desafio foi baseado neste outro desafio: https://github.com/lschallenges/data-engineering

---

Boa sorte!
# desafio-dev

[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=leonardoscalabrini_desafio-dev&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=leonardoscalabrini_desafio-dev)
[<img src="https://img.shields.io/badge/dockerhub-imagens-orange.svg?logo=DOCKER">][dockerhub]

[dockerhub]: https://hub.docker.com/r/leonardoscalabrini/desafio-dev

## Dev quick start ##

1. Install dependencies
````
mvn clean install
````

2. Install Infraestructure
````
docker-compose up db
````

3. Start locally
````
mvn spring-boot:run
````

## Build and run image ##

1. Install Infraestructure and Image
````
docker-compose up
````

## Build and run image ##

1. Prepare minikube
````
minikube tunnel
````

2. Apply kube
````
kubectl apply -f .\kube\
````


# API Documentation #

POST http://localhost:8080/api/v1/upload/cnab
```JSON
Content-Disposition: form-data; filename="example.txt"
```

GET http://localhost:8080/api/v1/store
```JSON
[
{
"storeId": "9cb36ec1-e16d-487c-a1b8-fe59ba72f6d0",
"storeName": "BAR DO JOÃO",
"ownerName": "JOÃO MACEDO",
"storeBalance": -102.0
}
]
```

GET http://localhost:8080/api/v1/transaction?storeId=9cb36ec1-e16d-487c-a1b8-fe59ba72f6d0

```JSON
[
{
"transactionId": "9633630e-c320-4d1b-a916-382398eca093",
"storeId": "77ad1329-5d36-402d-b0c2-be8aa9dbbef7",
"type": "FINANCIAMENTO",
"date": "2019-03-01T12:34:53",
"transactionValue": 142.0,
"cpfNumber": "09620676017",
"creditCardNumber": "4753****3153",
"storeName": "BAR DO JOÃO",
"ownerName": "JOÃO MACEDO",
"storeBalance": -306.0
}
]
```
Loading