An open API service indexing awesome lists of open source software.

https://github.com/andersonhsporto/taygeta-api

Api Rest Que Implementa Uma Variação do Desafio "Mars Rover"
https://github.com/andersonhsporto/taygeta-api

docker docker-compose hibernate-jpa java junit marsrover marsroverproblem marsrovertechchallenge maven postgresql spring-boot swagger unit-testing

Last synced: 7 months ago
JSON representation

Api Rest Que Implementa Uma Variação do Desafio "Mars Rover"

Awesome Lists containing this project

README

          

# Taygeta API


Taygeta Star

 Taygeta é uma [API REST](https://www.redhat.com/pt-br/topics/api/what-is-a-rest-api)
que implementa uma variação do desafio [Mars Rover](https://code.google.com/archive/p/marsrovertechchallenge/), utilizando o framework
[Spring](https://spring.io/projects/spring-boot).

Uma versão em modo [interface de linha de comando](https://en.wikipedia.org/wiki/Command-line_interface) está disponível na branch [0-cli](https://github.com/andersonhsporto/taygeta-api/tree/0-cli).

## Ferramentas Utilizadas

* [JAVA 18](https://www.java.com/pt-BR/) - Linguagem de programação (JDK 18).
* [Spring](https://spring.io/projects/spring-boot) - Framework MVC.
* [Apache Maven 3.8.6](https://maven.apache.org/) - Gerenciador de dependências.
* [IntelliJ](https://www.jetbrains.com/idea/) - IDE para desenvolvimento.
* [Docker](https://www.docker.com/) - Serviço de virtualização.
* [PostgreSQL](https://www.postgresql.org/) - Banco de dados.

## Métodos
Requisições para a API devem seguir os padrões:
| Método | Rota | Descrição |
|:---: |:---: |:---: |
| `GET` | `/api/v1/planets`| Retorna uma lista ( JSON ) com os dados de todos os planetas cadastrados |
| `POST` | `/api/v1/planets`| Adiciona um novo planeta utilizando uma string para representar a area deste |
| `PUT` | `/api/v1/planets`| Atualiza o tamanho do planeta utilizando o id deste no banco de dados e uma string para representar a área deste |
| `GET` | `/api/v1/planets/{planetId}` | Retorna os dados ( JSON ) de um planeta utilizando o id deste no banco de dados |
| `DELETE` | `/api/v1/planets/{planetId}` | Deleta um planeta e suas respectivas sondas utilizando o id deste no banco de dados |
| `GET` | `/api/v1/planets/{planetId}/probes` | Retorna uma lista ( JSON ) com os dados de todas as sondas de um respectivo planeta utilizando o id deste no banco de dados |
| `DELETE` | `/api/v1/planets/{planetId}/probes` | Deleta todas as sondas de um respectivo planeta utilizando o id deste no banco de dados |
| `GET` | `/api/v1/probes` | Retorna uma lista ( JSON ) com todas as sondas cadastradas no banco de dados |
| `POST` | `/api/v1/probes` | Adiciona uma nova sonda ao banco de dados utilizando, id do planeta, ponto cardinal, posição x e y |
| `PUT` | `/api/v1/probes` | Movimenta uma sonda utilizando o id desta no banco de dados e uma sequência de movimentos |
| `GET` | `/api/v1/probes/{probeId}` | Retorna os dados ( JSON ) de uma sonda utilizando o id desta no banco de dados |
| `DELETE` | `/api/v1/probes/{probeId}` | Deleta uma sonda utilizando id desta no banco de dados |

Os detalhes sobre como utilizar estes métodos ( Swagger UI ) estão disponíveis rota `/swagger-ui/`:
  Uma demonstração desta está disponível no link: [https://tay-prod-taygeta-ovkkud.mo1.mogenius.io/swagger-ui/](https://tay-prod-taygeta-ovkkud.mo1.mogenius.io/swagger-ui/)


### Variável de ambiente

Este projeto utiliza as seguintes variáveis de ambiente

| Variável | Descrição |
| :-----------------:| :----------------------------------: |
| POSTGRES_USER | Usuário do banco de dados |
| POSTGRES_PASSWORD | Senha do banco de dados |
| DATABASE_HOST | Host para conexão com o banco de dados |

## Inicialização

Para iniciar a api utilize o comando:

```sh
docker-compose up
```

Este comando irá iniciar um contêiner com a api na porta `8080` e um contêiner com o banco de dados utilizando a porta `5432`.

Para executar somente os testes utilize o comando:

```sh
mvn test
```

## Dependências
 As dependências são declaradas no arquivo [pom.xml](https://github.com/andersonhsporto/taygeta-api/blob/master/pom.xml).

| Dependência | Descrição | Versão |
| :----------------------------: | :---------------------------------------------------------------: | :-----: |
| Postgresql | JDBC Driver para o banco de dados Postgresql | 42.5.0 |
| H2database | Banco de dados relacional escrito em Java que funciona em memória | 2.1.214 |
| Spring-boot-starter-data-jpa | Responsável por conectar a aplicação Spring como o banco de dados | 2.7.4 |
| Spring-boot-starter-web | Responsável pela camada MVC do Spring | 2.7.4 |
| Junit-jupiter | Framework para testes unitários | 5.9.1 |
| Springfox-swagger-ui | Documentação JSON API para aplicações Spring | 3.0.0 |

## Exemplos

Consultar todos os planetas cadastrados [ GET ]

#### *Planetas [ /api/v1/planets ]*

 Ao utilizar este método na rota referente aos planetas, a api retorna uma lista ( json ) com os dados de todos os planetas cadastrados.

Exemplo: `/api/v1/planets/` irá retornar um json com os dados de todos os planetas cadastrados.

#### Adicionar Novo Planeta [ POST ]

 Para criar um novo planeta é necessário utilizar o parâmetro query `area` este parâmetro,
  utiliza uma string com o caractere x como delimitador entre altura e largura
do retângulo utilizado para representar o planeta.

| Parâmetro | Descrição |
|:---:|:---:|
| `area` | String utilizada para representar a area do planeta |

Exemplo: `/api/v1/planets?area=4x2` irá criar um planeta com quatro unidades de largura e duas unidades de altura.

Editar tamanho de um planeta [ PUT ]

#### *Planetas [ /api/v1/planets ]*

 Para editar o tamanho de um planeta previamente cadastrado no banco de dados é necessário utilizar o parâmetro query `planetId`, este parâmetro é um número inteiro utilizado para identificar o planeta no banco de dados, além disso, é necessário informar o novo tamanho do planeta utilizando uma string com o caractere x como delimitador entre altura e largura do retângulo utilizado para representar o planeta.
 Todas as sondas que estão fora das novas dimensões do planeta serão deletadas.

| Parâmetro | Descrição |
|:---:|:---:|
| `planetId` | Id do planeta no banco de dados |
| `area` | String utilizada para representar a área do planeta |

Exemplo: `/api/v1/planets?area=5x5&id=1` irá alterar o tamanho do planeta id 1, para cinco unidades de altura e largura.

Consultar planeta por id [ GET ]

#### *Planetas /api/v1/planets/{planetId}*

 Para consultar um planeta previamente cadastrado no banco de dados é necessário utilizar o parâmetro route `planetId`, este parâmetro é um número inteiro utilizado para identificar o planeta no banco de dados.

Exemplo: `/api/v1/planets/1` irá retornar um json com os dados referente ao planeta.

| Parâmetro | Descrição |
|:---:|:---:|
| `planetId` | Id do planeta no banco de dados |

Exemplo: `/api/v1/planets/4` irá retornar um json com os dados do planeta.

Deletar um planeta por id [ DELETE ]

#### *Planetas /api/v1/planets/{planetId}*

 Para deletar um planeta previamente cadastrado no banco de dados é necessário utilizar o parâmetro route `planetId`, este parâmetro é um número inteiro utilizado para identificar o planeta no banco de dados.
 Todas as sondas deste planeta são deletadas ao utilizar este método.

| Parâmetro | Descrição |
|:---:|:---:|
| `planetId` | Id do planeta no banco de dados |

Exemplo: `/api/v1/planets/4` deleta o planeta id 4 e todas as sondas associadas a este.

Consultar todas as sondas cadastradas [ GET ]

#### *Sondas [ /api/v1/probes ]*

 Ao utilizar este método na rota referente aos planetas, a api retorna uma lista ( json ) com os dados de todos os planetas cadastrados.

Exemplo: `/api/v1/probes/` irá retornar um json com os dados de todas as sondas cadastradas.

Adicionar nova sonda [ POST ]

#### *Sondas [ /api/v1/probes ]*

 Para criar uma nova sonda é necessário utilizar os parâmetros query `direction`, `planetId`, `X` e `Y`. Estes parâmetros representam a posição inicial da sonda no planeta.
 A posição inicial da sonda deve ser um dos quatro pontos cardinais ( Norte, Sul, Leste, Oeste ) em inglês ou português.

| Parâmetro | Descrição |
|:---:|:---:|
| `direction` | Ponto cardinal inicial da sonda |
| `planetId` | Id do planeta no banco de dados |
| `X` | Coordenada x da sonda |
| `Y` | Coordenada y da sonda |

Exemplo: `/api/v1/probes?direction=NORTE&planetId=1&x=4&y=2` irá criar uma nova sonda, no planeta id 1, nas coordenadas x4 y2, apontada para o norte.

Mover sonda [ PUT ]

#### *Sondas [ /api/v1/probes ]*

 Para mover uma sonda é necessário utilizar os parâmetros query `movements` e `probeId`.
 O parâmetro `movements` é uma string onde cada caractere desta representa um movimento da sonda: :
- `M` -> Mover a sonda uma unidade para frente.
- `L` -> Virar a sonda para a esquerda (90 graus)
- `R` -> Virar a sonda para a direita (90 graus)

| Parâmetro | Descrição |
|:---:|:---:|
| `movements` | Sequencia de movimentos da sonda |
| `probeId` | Id da sonda no banco de dados |

Exemplo: `/api/v1/probes?movements=LMLMLMLMM&probeId=1` irá mover a sonda de id 1 para uma nova direção.

Consultar sonda por id [ GET ]

#### *Sondas [ /api/v1/probes/{probeId} ]*

 Para consultar uma sonda previamente cadastrada no banco de dados é necessário utilizar o parâmetro route `probeId`, este parâmetro é um número inteiro utilizado para identificar a sonda no banco de dados.

| Parâmetro | Descrição |
|:---:|:---:|
| `probeId` | Id da sonda no banco de dados |

Exemplo: `/api/v1/probes/1` retorna um json com os dados da sonda id 1.

Deletar sonda por id [ DELETE ]

#### *Sondas [ /api/v1/probes/{probeId} ]*

 Para deletar uma sonda previamente cadastrada no banco de dados é necessário utilizar o parâmetro route `probeId`, este parâmetro é um número inteiro utilizado para identificar a sonda no banco de dados.

| Parâmetro | Descrição |
|:---:|:---:|
| `probeId` | Id da sonda no banco de dados |

Exemplo: `/api/v1/probes/1` deleta a sonda id 1 do banco de dados.

---

Minhas informações de contato 📬