Documentacao detalhada de todos os endpoints da API.
Documentacao interativa (Swagger UI): http://localhost:8080/swagger-ui.html Spec OpenAPI: http://localhost:8080/v3/api-docs
GET /astronauts
Response 200 OK:
[
{
"id": 1,
"name": "Daniel",
"rank": "Commander",
"experience": 1200
}
]GET /astronauts/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID do astronauta |
Response 200 OK:
{
"id": 1,
"name": "Daniel",
"rank": "Commander",
"experience": 1200
}Response 404 Not Found:
{
"timestamp": "2026-09-09T10:00:00",
"status": 404,
"message": "Astronaut not found with id: 1"
}POST /astronauts
Request Body:
{
"name": "Laura",
"rank": "Pilot",
"experience": 800
}Campos Obrigatorios:
| Campo | Tipo | Validacao | Descricao |
|---|---|---|---|
| name | String | @NotBlank | Nome do astronauta |
| rank | String | @NotBlank | Patente |
| experience | int | @Min(0) | Pontos de experiencia |
Response 201 Created:
{
"id": 2,
"name": "Laura",
"rank": "Pilot",
"experience": 800
}O campo
ide gerado automaticamente pelo servidor.
Response 400 Bad Request:
{
"timestamp": "2026-09-09T10:00:00",
"status": 400,
"message": "name: must not be blank, rank: must not be blank"
}PUT /astronauts/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID do astronauta |
Request Body:
{
"name": "Laura",
"rank": "Captain",
"experience": 900
}Response 200 OK:
{
"id": 2,
"name": "Laura",
"rank": "Captain",
"experience": 900
}DELETE /astronauts/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID do astronauta |
Response 204 No Content
GET /spacecraft
Response 200 OK:
[
{
"id": 1,
"name": "Falcon-X",
"fuel": 1000,
"capacity": 5,
"status": "READY"
}
]GET /spacecraft/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID da nave |
Response 200 OK:
{
"id": 1,
"name": "Falcon-X",
"fuel": 1000,
"capacity": 5,
"status": "READY"
}Response 404 Not Found:
{
"timestamp": "2026-09-09T10:00:00",
"status": 404,
"message": "Spacecraft not found with id: 1"
}POST /spacecraft
Request Body:
{
"name": "Apollo-7",
"fuel": 800,
"capacity": 3,
"status": "READY"
}Campos Obrigatorios:
| Campo | Tipo | Validacao | Descricao |
|---|---|---|---|
| name | String | @NotBlank | Nome da nave |
| fuel | int | @Min(0) | Combustivel atual |
| capacity | int | @Min(1) | Capacidade de tripulacao |
| status | String | @NotBlank | Status (READY, MAINTENANCE, etc) |
Response 201 Created:
{
"id": 2,
"name": "Apollo-7",
"fuel": 800,
"capacity": 3,
"status": "READY"
}PUT /spacecraft/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID da nave |
Request Body:
{
"name": "Apollo-7",
"fuel": 500,
"capacity": 3,
"status": "MAINTENANCE"
}Response 200 OK:
{
"id": 2,
"name": "Apollo-7",
"fuel": 500,
"capacity": 3,
"status": "MAINTENANCE"
}DELETE /spacecraft/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID da nave |
Response 204 No Content
GET /planet
Response 200 OK:
[
{
"id": 1,
"name": "Zorion",
"distance": 500,
"dangerLevel": 3,
"resources": ["Iron", "Water"]
}
]GET /planet/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID do planeta |
Response 200 OK:
{
"id": 1,
"name": "Zorion",
"distance": 500,
"dangerLevel": 3,
"resources": ["Iron", "Water"]
}Response 404 Not Found:
{
"timestamp": "2026-09-09T10:00:00",
"status": 404,
"message": "Planet not found with id: 1"
}POST /planet
Request Body:
{
"name": "Mars-X",
"distance": 500,
"dangerLevel": 4,
"resources": ["Iron", "Water"]
}Campos Obrigatorios:
| Campo | Tipo | Validacao | Descricao |
|---|---|---|---|
| name | String | @NotBlank | Nome do planeta |
| distance | int | @Min(0) | Distancia em unidades espaciais |
| dangerLevel | int | @Min(0) | Nivel de perigo (0-10) |
| resources | List<String> | - | Lista de recursos disponiveis |
Response 201 Created:
{
"id": 2,
"name": "Mars-X",
"distance": 500,
"dangerLevel": 4,
"resources": ["Iron", "Water"]
}PUT /planet/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID do planeta |
Request Body:
{
"name": "Mars-X",
"distance": 550,
"dangerLevel": 5,
"resources": ["Gold", "Water"]
}Response 200 OK:
{
"id": 2,
"name": "Mars-X",
"distance": 550,
"dangerLevel": 5,
"resources": ["Gold", "Water"]
}DELETE /planet/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID do planeta |
Response 204 No Content
GET /mission
Response 200 OK:
[
{
"id": 1,
"spacecraftId": 1,
"planetId": 1,
"astronauts": [1, 2],
"status": "PENDING"
}
]GET /mission/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID da missao |
Response 200 OK:
{
"id": 1,
"spacecraftId": 1,
"planetId": 1,
"astronauts": [1, 2],
"status": "PENDING"
}Response 404 Not Found:
{
"timestamp": "2026-09-09T10:00:00",
"status": 404,
"message": "Mission not found with id: 1"
}POST /mission
Request Body:
{
"spacecraftId": 1,
"planetId": 1,
"astronauts": [1, 2]
}Campos Obrigatorios:
| Campo | Tipo | Validacao | Descricao |
|---|---|---|---|
| spacecraftId | Long | @NotNull | ID da nave designada |
| planetId | Long | @NotNull | ID do planeta alvo |
| astronauts | List<Long> | @NotEmpty | IDs dos astronautas participantes |
Response 201 Created:
{
"id": 1,
"spacecraftId": 1,
"planetId": 1,
"astronauts": [1, 2],
"status": "PENDING"
}O status inicial e sempre
PENDING.
PUT /mission/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID da missao |
Request Body:
{
"spacecraftId": 1,
"planetId": 2,
"astronauts": [1, 3],
"status": "PENDING"
}Response 200 OK:
{
"id": 1,
"spacecraftId": 1,
"planetId": 2,
"astronauts": [1, 3],
"status": "PENDING"
}POST /mission/{id}/start
Executa a simulacao de exploracao espacial. A missao deve estar com status PENDING.
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID da missao |
Steps internos:
- Valida combustivel da nave (
fuel >= distance) - Calcula consumo (
fuelConsumed = distance * dangerLevel) - Resolve evento de perigo
- Gera recursos (se sucesso)
- Atualiza status (
SUCCESS/FAILED) e consumos
Regra de perigo (roll 1-100): sucesso se roll <= 60 - dangerLevel*5; janelas de 15% (falha mecanica), 15% (ataque alienigena) e 10% + remanescente (tempestade cosmica).
Response 200 OK:
{
"missionId": 1,
"status": "SUCCESS",
"fuelConsumed": 500,
"resourcesFound": [
{ "resource": "Iron", "quantity": 25 }
],
"events": [
"Mission completed successfully",
"Resources collected: Iron (25)"
]
}Response 200 OK (exemplo de falha):
{
"missionId": 1,
"status": "FAILED",
"fuelConsumed": 500,
"resourcesFound": [],
"events": [
"Mechanical failure detected",
"Spacecraft damaged"
]
}Efeitos por evento:
MECHANICAL_FAILUREdanifica a nave (DAMAGED);ALIEN_ATTACKreduz 100 XP dos astronautas;COSMIC_STORMfaz a missao falhar sem gerar recursos. Em qualquer resultado o combustivel e consumido.
DELETE /mission/{id}
Parametros:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| id | Long | Sim | ID da missao |
Response 204 No Content
GET /mission/history
Query Parameters:
| Parametro | Tipo | Obrigatorio | Descricao |
|---|---|---|---|
| status | String | Nao | Filtrar por status (SUCCESS, FAILED) |
| planetId | Long | Nao | Filtrar por planeta alvo |
Response 200 OK:
[
{
"id": 1,
"planetName": "Zorion",
"astronauts": ["Daniel", "Laura"],
"status": "SUCCESS",
"fuelConsumed": 500,
"resourcesFound": ["Iron", "Water"],
"completedAt": "2026-09-09T14:30:00"
}
]GET /stats
Response 200 OK:
{
"totalMissions": 2,
"successes": 2,
"failures": 0,
"successRate": 100.0,
"resourcesCollected": 75,
"topResource": "Iron"
}Recursos apenas de missoes
SUCCESS;successRatecom 2 casas decimais;topResourceenullquando nao ha recursos.
GET /ranking
Response 200 OK:
[
{
"name": "Daniel",
"rank": "Commander",
"experience": 5200,
"missionsCompleted": 15
},
{
"name": "Laura",
"rank": "Pilot",
"experience": 3800,
"missionsCompleted": 12
}
]Ordenado por
experiencedecrescente;missionsCompletedconta apenas missoesSUCCESSda qual o astronauta participou.
POST /exploration/discover
Simula a descoberta de um planeta, gerando recursos de acordo com o nivel de perigo.
Request Body:
{
"name": "Nebulon-7",
"distance": 1200,
"dangerLevel": 6
}Campos Obrigatorios:
| Campo | Tipo | Validacao | Descricao |
|---|---|---|---|
| name | String | @NotBlank | Nome do planeta |
| distance | int | @Min(0) | Distancia em unidades espaciais |
| dangerLevel | int | @Min(0), @Max(10) | Nivel de perigo |
Regras de geracao de recursos:
- Sempre: Iron, Water, Stone (pool basico)
- dangerLevel >= 3: + Gold, Titanium, Silicon
- dangerLevel >= 6: + Crystal, Platinum, Uranium
- Quantidade gerada: 1 a 3 recursos unicos por descoberta
Response 201 Created:
{
"id": 5,
"name": "Nebulon-7",
"distance": 1200,
"dangerLevel": 6,
"resources": ["Crystal", "Titanium"],
"discoveredAt": "2026-09-09T15:00:00"
}Response 400 Bad Request (dangerLevel > 10):
{
"timestamp": "2026-09-09T10:00:00",
"status": 400,
"message": "dangerLevel: must be less than or equal to 10"
}GET /actuator/health
Verifica a saude da aplicacao (usado pelo site/portfolio e por monitores de uptime). Exposto via Spring Boot Actuator.
Response 200 OK:
{
"status": "UP"
}Campos:
| Campo | Tipo | Descricao |
|---|---|---|
| status | String | UP quando a aplicacao esta saudavel |
Todos os erros seguem o padrao:
{
"timestamp": "2026-09-09T10:00:00",
"status": 400,
"message": "Descricao do erro"
}| Status | Descricao |
|---|---|
| 400 | Requisicao invalida (validacao) |
| 404 | Recurso nao encontrado |
| 500 | Erro interno do servidor |