Skip to content

Commit c6c4bf2

Browse files
committed
feat: init
0 parents  commit c6c4bf2

File tree

27 files changed

+1416
-0
lines changed

27 files changed

+1416
-0
lines changed

.github/dependabot.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: "maven"
4+
directory: "/"
5+
schedule:
6+
interval: "weekly"
7+
open-pull-requests-limit: 10
8+
labels:
9+
- "dependencies"
10+
commit-message:
11+
prefix: "deps: "
12+
13+
- package-ecosystem: "github-actions"
14+
directory: "/"
15+
schedule:
16+
interval: "weekly"
17+
open-pull-requests-limit: 5
18+
labels:
19+
- "dependencies"
20+
commit-message:
21+
prefix: "ci: "

.github/workflows/ci.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
name: Java CI
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
workflow_dispatch:
9+
10+
jobs:
11+
test:
12+
runs-on: ubuntu-latest
13+
14+
steps:
15+
- name: Checkout repository
16+
uses: actions/checkout@v4
17+
18+
- name: Setup Java 21
19+
uses: actions/setup-java@v4
20+
with:
21+
distribution: temurin
22+
java-version: '21'
23+
cache: maven
24+
25+
- name: Run tests
26+
working-directory: java
27+
run: ./mvnw -B verify

.gitignore

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Maven build output
2+
target/
3+
4+
# JVM crash logs
5+
hs_err_pid*
6+
replay_pid*
7+
8+
# Eclipse
9+
.classpath
10+
.project
11+
.settings/
12+
13+
# IntelliJ IDEA
14+
.idea/
15+
*.iml
16+
17+
# VS Code Java workspace metadata
18+
.factorypath
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
wrapperVersion=3.3.4
2+
distributionType=only-script
3+
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip

README.md

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
# Usuarios API Java
2+
3+
Exemplo do mesmo CRUD de usuarios das pastas `python`, `dotnet` e `node`, agora implementado em Java com Maven e Spring Boot, mantendo Swagger, persistencia em memoria, testes automatizados e arquitetura Ports and Adapters.
4+
5+
## Tecnologias
6+
7+
- Java 21+
8+
- Maven Wrapper
9+
- Spring Boot 4.0.3
10+
- Spring Web MVC
11+
- Spring Validation
12+
- Springdoc OpenAPI
13+
- JUnit 5
14+
15+
## Pre-requisitos
16+
17+
- Windows com PowerShell
18+
- Java 21 ou superior instalado e configurado no `PATH`
19+
- Maven Wrapper incluido no projeto (`mvnw` e `mvnw.cmd`)
20+
21+
Para validar a instalacao:
22+
23+
```powershell
24+
java -version
25+
.\mvnw.cmd -version
26+
```
27+
28+
Se um desses comandos nao funcionar, primeiro ajuste o `JAVA_HOME` e o `PATH` da maquina.
29+
30+
Se o `mvn -version` mostrar Java 17, o build vai falhar com `release version 21 not supported`. O projeto compila normalmente com Java 21 ou superior.
31+
32+
Exemplo de ajuste so para a sessao atual do PowerShell:
33+
34+
```powershell
35+
$env:JAVA_HOME = 'C:\Users\felipe.augusto\.jdks\ms-25.0.1'
36+
$env:PATH = "$env:JAVA_HOME\bin;$env:PATH"
37+
.\mvnw.cmd -version
38+
```
39+
40+
Se o seu `~/.m2/settings.xml` corporativo redirecionar tudo com `mirrorOf=*`, projetos pessoais podem falhar com `401 Unauthorized` antes mesmo de baixar o Spring Boot. Nesse caso, use um arquivo de settings separado para este projeto.
41+
42+
## Settings Maven corporativo x pessoal
43+
44+
Voce pode manter o seu `~/.m2/settings.xml` do trabalho como esta para os projetos corporativos. O ponto importante e este:
45+
46+
- `profile` nao resolve esse caso sozinho quando o problema esta em `mirrors`
47+
- `mirrors` no `settings.xml` sao globais
48+
- com `mirrorOf=*`, o Maven redireciona qualquer repositorio para o Nexus corporativo
49+
- por isso, mesmo adicionando um profile para Maven Central, o mirror corporativo continua interceptando a resolucao
50+
51+
Para este projeto, a abordagem mais segura e usar um settings separado no comando Maven.
52+
53+
Existe um exemplo em `settings-public.xml.example`. Para usar localmente:
54+
55+
```powershell
56+
Copy-Item .\settings-public.xml.example .\settings-public.xml
57+
.\mvnw.cmd -s .\settings-public.xml spring-boot:run
58+
```
59+
60+
O mesmo vale para testes e build:
61+
62+
```powershell
63+
.\mvnw.cmd -s .\settings-public.xml test
64+
.\mvnw.cmd -s .\settings-public.xml clean package
65+
```
66+
67+
Se quiser, voce pode ate manter dois modos de uso no mesmo computador:
68+
69+
- corporativo em outros projetos: `mvn ...`
70+
- pessoal neste projeto: `.\mvnw.cmd -s .\settings-public.xml ...`
71+
72+
## Arquitetura
73+
74+
Estrutura do projeto:
75+
76+
```text
77+
src/main/java/com/modelos/usuarios
78+
|-- adapters
79+
| |-- inbound/http
80+
| `-- outbound/repositories
81+
|-- application
82+
| `-- services
83+
|-- domain
84+
| `-- ports
85+
`-- UsuariosApiApplication.java
86+
87+
src/test/java/com/modelos/usuarios
88+
|-- api
89+
`-- application
90+
```
91+
92+
Responsabilidades:
93+
94+
- `domain`: entidade, erros e porta do repositorio
95+
- `application`: comando de entrada e servico de negocio
96+
- `adapters/outbound`: persistencia em memoria
97+
- `adapters/inbound/http`: controllers e contratos HTTP
98+
- `UsuariosApiApplication`: bootstrap da aplicacao Spring Boot
99+
100+
## Modelo de dominio
101+
102+
- `id: int`
103+
- `nome: string`
104+
- `dtNascimento: date`
105+
- `status: bool`
106+
- `telefones: string[]`
107+
108+
## Como rodar
109+
110+
Na pasta `java`:
111+
112+
### 1. Rodar os testes
113+
114+
```powershell
115+
.\mvnw.cmd -s .\settings-public.xml test
116+
```
117+
118+
### 2. Subir a API
119+
120+
```powershell
121+
.\mvnw.cmd -s .\settings-public.xml spring-boot:run
122+
```
123+
124+
### 3. Acessar a aplicacao
125+
126+
- API: `http://localhost:8080`
127+
- Swagger UI: `http://localhost:8080/docs`
128+
- OpenAPI JSON: `http://localhost:8080/openapi`
129+
130+
### 4. Build empacotado
131+
132+
```powershell
133+
.\mvnw.cmd -s .\settings-public.xml clean package
134+
java -jar .\target\usuarios-api-java-0.1.0.jar
135+
```
136+
137+
## Como testar
138+
139+
```powershell
140+
.\mvnw.cmd -s .\settings-public.xml test
141+
```
142+
143+
O CI tambem executa `./mvnw -B verify`.
144+
145+
## Endpoints
146+
147+
- `GET /health/live`
148+
- `GET /health/ready`
149+
- `POST /usuarios`
150+
- `GET /usuarios`
151+
- `GET /usuarios/{usuarioId}`
152+
- `PUT /usuarios/{usuarioId}`
153+
- `DELETE /usuarios/{usuarioId}`
154+
155+
## Exemplo de payload
156+
157+
```json
158+
{
159+
"id": 1,
160+
"nome": "Carlos",
161+
"dtNascimento": "1992-03-14",
162+
"status": true,
163+
"telefones": [
164+
"11911112222",
165+
"1122223333"
166+
]
167+
}
168+
```
169+
170+
## CI
171+
172+
O workflow fica em `.github/workflows/ci.yml` e executa:
173+
174+
- setup do Java 21
175+
- cache Maven
176+
- `./mvnw -B verify`
177+
178+
## Observacoes
179+
180+
- A persistencia e totalmente em memoria.
181+
- Ao reiniciar a aplicacao, os dados sao perdidos.
182+
- O endpoint `/health/ready` retorna `503` se o servico principal nao estiver disponivel.
183+
184+
## Comandos uteis
185+
186+
```powershell
187+
.\mvnw.cmd -s .\settings-public.xml test
188+
.\mvnw.cmd -s .\settings-public.xml spring-boot:run
189+
.\mvnw.cmd -s .\settings-public.xml clean package
190+
```

0 commit comments

Comments
 (0)