- Objetivo
- Instalação dos softwares necessários
- Passo-a-Passo para o desenvolvimento
- Resultados Alcançados
- Licença
O objetivo deste projeto é desenvolver uma API GraphQL simples usando o framework Spring para gerenciar informações sobre um jogo específico. A API permite realizar operações como adicionar, atualizar, excluir e consultar jogos, bem como recuperar detalhes sobre os desenvolvedores associados a cada jogo. A motivação não é criar uma API abrangente, porém o foco está em fornecer uma interface flexível e eficiente para manipular dados relacionados a jogos por meio de consultas GraphQL.
-
Clone o repositório
git clone https://github.com/Tomaz5556/GraphQLMiniProjetoWEB.git
-
Abra a pasta do projeto
GraphQLMiniProjetoWEB
- Execute o arquivo
ProjectGraphqlApplication.java
para iniciar a Aplicação Spring.
-
Depois disso, acesse http://localhost:8080/graphiql no seu navegador.
-
Execute alguma consulta, por exemplo, buscar o nome do desenvolver do jogo
GTA
.query { gameByName(name: "GTA") { developer { name } } }
-
Você deverá ver uma resposta dessa maneira.
-
Inicializando o projeto:
- Navegando até https://start.spring.io/
- Escolhendo
Maven
. - Clicando em
Dependencies
e selecionandoSpring for GraphQL
eSpring Web
. Assim:
- Clicando em
Generate
. - Baixando o arquivo ZIP resultante, que é um arquivo de um aplicativo GraphQL configurado para o projeto.
-
Adicionando um novo arquivo
schema.graphqls
à pastasrc/main/resources/graphql
com o seguinte conteúdo:type Mutation { addGame(id: ID!, name: String!, developerId: ID!): Game! updateGame(id: ID!, name: String!, developerId: ID!): Game! deleteGame(id: ID!): Game! } type Query { gameById(id: ID!): Game gameByName(name: String!): Game allGames: [Game!]! } type Game { id: ID! name: String! developer: Developer! } type Developer { id: ID! name: String! }
-
Este esquema define as operações que podem ser realizadas em um jogo e seu desenvolvedor. Aqui estão os detalhes:
-
Mutation: Este tipo define três operações que podem ser realizadas em um jogo:
addGame
: Permite adicionar um novo jogo.updateGame
: Permite atualizar um jogo existente.deleteGame
: Permite excluir um jogo existente.
-
Query: Este tipo define três consultas que podem ser realizadas:
gameById
: Retorna os detalhes de um jogo específico com base no id fornecido.gameByName
: Retorna os detalhes de um jogo específico com base no nome fornecido.allGames
: Retorna uma lista de todos os jogos.
-
Game: Este tipo define a estrutura de um jogo com os campos
id
,name
edeveloper
. -
Developer: Este tipo define a estrutura de um desenvolvedor com os campos
id
ename
.
-
-
Criando as classes no pacote principal da aplicação, ao lado de ProjectGraphqlApplication.
-
Game.java
package com.web.graphql; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Game { private String id; private String name; private String developerId; private static List<Game> games = new ArrayList<>(Arrays.asList( new Game("game-1", "GTA", "developer-1"), new Game("game-2", "Far Cry", "developer-2"), new Game("game-3", "The Witcher", "developer-3"))); public Game(String id, String name, String developerId) { this.id = id; this.name = name; this.developerId = developerId; } public String getId() { return id; } public String getName() { return name; } public String getDeveloperId() { return developerId; } public static Game getById(String id) { return games.stream() .filter(game -> game.getId().equals(id)) .findFirst() .orElse(null); } public static Game getByName(String name) { return games.stream() .filter(game -> game.getName().equals(name)) .findFirst() .orElse(null); } public static List<Game> getAllGames() { return games; } public static Game addGame(String id, String name, String developerId) { Game newGame = new Game(id, name, developerId); games.add(newGame); return newGame; } public static Game updateGame(String id, String name, String developerId) { Game game = getById(id); if (game != null) { game.name = name; game.developerId = developerId; } return game; } public static Game deleteGame(String id) { Game game = getById(id); if (game != null) { games.remove(game); } return game; } }
-
Developer.java
package com.web.graphql; import java.util.Arrays; import java.util.List; public record Developer (String id, String name) { private static List<Developer> developers = Arrays.asList( new Developer("developer-1", "Rockstar"), new Developer("developer-2", "Ubisoft"), new Developer("developer-3", "CD Projekt") ); public static Developer getById(String id) { return developers.stream() .filter(developer -> developer.id().equals(id)) .findFirst() .orElse(null); } }
-
Spring for GraphQL fornece um modelo de programação baseado em anotações. Com métodos anotados pelo controlador, podemos declarar como buscar os dados para campos específicos do GraphQL.
-
Adicionando
GameController
no pacote principal do aplicativo, ao lado deGame
eDeveloper
-
GameController.java
package com.web.graphql; import java.util.List; import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.MutationMapping; import org.springframework.graphql.data.method.annotation.QueryMapping; import org.springframework.graphql.data.method.annotation.SchemaMapping; import org.springframework.stereotype.Controller; @Controller public class GameController { @QueryMapping public Game gameById(@Argument String id) { Game game = Game.getById(id); return game; } @QueryMapping public Game gameByName(@Argument String name) { return Game.getByName(name); } @QueryMapping public List<Game> allGames() { return Game.getAllGames(); } @MutationMapping public Game addGame(@Argument String id, @Argument String name, @Argument String developerId) { return Game.addGame(id, name, developerId); } @MutationMapping public Game updateGame(@Argument String id, @Argument String name, @Argument String developerId) { return Game.updateGame(id, name, developerId); } @MutationMapping public Game deleteGame(@Argument String id) { return Game.deleteGame(id); } @SchemaMapping public Developer developer(Game game) { return Developer.getById(game.getDeveloperId()); } }
-
A classe
GameController
é um controlador que define como buscar e manipular dados deGame
eDeveloper
conforme definido no esquema GraphQL. -
@QueryMapping
é uma anotação composta que atua como um atalho para o tipoQuery
, que representa as operações de leitura da API. Por exemplo, o métodogameById
mapeia o argumentoid
para o parâmetroid
do método e retorna um objetoGame
com esseid
. O métodogameByName
faz o mesmo, mas com o argumentoname
. O métodoallGames
retorna uma lista de todos os objetosGame
. -
@MutationMapping
é uma anotação composta que atua como um atalho para o tipoMutation
, que representa as operações de escrita da API. Por exemplo, o métodoaddGame
recebe três argumentos:id
,name
edeveloperId
, e retorna um novo objetoGame
criado com esses valores. O métodoupdateGame
faz o mesmo, mas atualiza um objetoGame
existente. O métododeleteGame
recebe um argumentoid
e retorna o objetoGame
excluído com esseid
. -
@SchemaMapping
mapeia um método manipulador para um campo no esquema GraphQL e o declara como oDataFetcher
para esse campo. Por exemplo, o métodoDeveloper
mapeia o campodeveloper
do tipoGame
para o método de manipulador, que recebe um objetoGame
como fonte e retorna um objetoDeveloper
associado a ele. O tipoDeveloper
é outro tipo definido no esquema GraphQL, que representa o desenvolvedor de um jogo. -
@Argument
vincula um argumento GraphQL nomeado a um parâmetro de método. Por exemplo, o métodogameById
usa a anotação@Argument
para vincular o argumentoid
do campogameById
do tipoQuery
ao parâmetroid
do método. A anotação@Argument
pode ser omitida se o nome do argumento e o nome do parâmetro forem iguais.
-
GraphiQL é uma interface visual útil para escrever e executar consultas e muito mais.
-
Adicionando esta configuração ao arquivo
application.properties
para ativar o GraphiQL.spring.graphql.graphiql.enabled=true
- Executando o arquivo
ProjectGraphqlApplication.java
para iniciar a Aplicação Spring.
- Depois disso, acessando http://localhost:8080/graphiql no navegador.
Esse projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.