|
15 | 15 | */ |
16 | 16 | package io.helidon.examples.data.mysql; |
17 | 17 |
|
| 18 | +import java.util.stream.Collector; |
| 19 | + |
18 | 20 | import io.helidon.http.BadRequestException; |
19 | 21 | import io.helidon.service.registry.Services; |
20 | 22 | import io.helidon.transaction.Tx; |
|
24 | 26 | import io.helidon.webserver.http.ServerRequest; |
25 | 27 | import io.helidon.webserver.http.ServerResponse; |
26 | 28 |
|
| 29 | +import jakarta.json.Json; |
| 30 | +import jakarta.json.JsonArrayBuilder; |
| 31 | +import jakarta.json.JsonObject; |
| 32 | + |
27 | 33 | class PokemonService implements HttpService { |
28 | 34 |
|
29 | | - // Helidon Data repository interface providing Pokemon entity operations. |
30 | 35 | private final PokemonRepository pokemonRepository = Services.get(PokemonRepository.class); |
31 | | - // Helidon Data repository interface providing Pokemon entity operations. |
32 | 36 | private final TypeRepository typeRepository = Services.get(TypeRepository.class); |
33 | 37 |
|
34 | | - // Pokemon endpoint routing rules |
35 | 38 | @Override |
36 | 39 | public void routing(HttpRules rules) { |
37 | 40 | rules.get("/all", this::all) |
38 | 41 | .get("/type/{name}", this::type) |
39 | 42 | .get("/get/{name}", this::pokemon) |
40 | | - .post("/", Handler.create(PokemonDto.class, this::insert)) |
| 43 | + .post("/", Handler.create(JsonObject.class, this::insert)) |
41 | 44 | .delete("/{id}", this::delete); |
42 | 45 | } |
43 | 46 |
|
44 | | - /** |
45 | | - * Handles the {@code GET /all} request and returns a list of all {@link Pokemon} entities. |
46 | | - * |
47 | | - * @param request the server request |
48 | | - * @param response the server response |
49 | | - */ |
50 | 47 | private void all(ServerRequest request, ServerResponse response) { |
51 | | - response.send(pokemonRepository.listOrderByName()); |
| 48 | + response.send(pokemonRepository.streamOrderByName() |
| 49 | + .map(pokemon -> Json.createObjectBuilder() |
| 50 | + .add("id", pokemon.getId()) |
| 51 | + .add("name", pokemon.getName()) |
| 52 | + .add("type", pokemon.getType().getName()) |
| 53 | + .build()) |
| 54 | + .collect(Collector.of(Json::createArrayBuilder, |
| 55 | + JsonArrayBuilder::add, |
| 56 | + JsonArrayBuilder::add, |
| 57 | + JsonArrayBuilder::build))); |
52 | 58 | } |
53 | 59 |
|
54 | | - /** |
55 | | - * Handles the {@code GET /type/{name}} request and returns a list of {@link Pokemon} entities |
56 | | - * associated with a specific breed name. |
57 | | - * |
58 | | - * @param request the server request |
59 | | - * @param response the server response |
60 | | - */ |
61 | 60 | private void type(ServerRequest request, ServerResponse response) { |
62 | 61 | String name = request.path().pathParameters().get("name"); |
63 | | - response.send(pokemonRepository.listByType_Name(name)); |
64 | | - } |
| 62 | + response.send(pokemonRepository.streamByType_Name(name) |
| 63 | + .map(pokemon -> Json.createObjectBuilder() |
| 64 | + .add("id", pokemon.getId()) |
| 65 | + .add("name", pokemon.getName()) |
| 66 | + .add("type", pokemon.getType().getName()) |
| 67 | + .build()) |
| 68 | + .collect(Collector.of(Json::createArrayBuilder, |
| 69 | + JsonArrayBuilder::add, |
| 70 | + JsonArrayBuilder::add, |
| 71 | + JsonArrayBuilder::build))); } |
65 | 72 |
|
66 | | - /** |
67 | | - * Handles the {@code GET /get/{name}} request and returns a {@link Pokemon} entity by its name. |
68 | | - * |
69 | | - * @param request the server request |
70 | | - * @param response the server response |
71 | | - */ |
72 | 73 | private void pokemon(ServerRequest request, ServerResponse response) { |
73 | 74 | String name = request.path().pathParameters().get("name"); |
74 | | - response.send(pokemonRepository.findByName(name)); |
| 75 | + pokemonRepository.findByName(name) |
| 76 | + .ifPresentOrElse( |
| 77 | + pokemon -> response.send(Json.createObjectBuilder() |
| 78 | + .add("id", pokemon.getId()) |
| 79 | + .add("name", pokemon.getName()) |
| 80 | + .add("type", pokemon.getType().getName()) |
| 81 | + .build()), |
| 82 | + () -> response.send(JsonObject.EMPTY_JSON_OBJECT)); |
75 | 83 | } |
76 | 84 |
|
77 | | - /** |
78 | | - * Handles the {@code POST /} request and inserts a new {@link Pokemon} entity. |
79 | | - * <p> |
80 | | - * Pokémon entity content is supplied as JSON object and translated to {@link PokemonDto} class by HTTP |
81 | | - * request processing layer. |
82 | | - * Pokémon type record must already exist. Pokémon entity must not exist in the database. |
83 | | - * |
84 | | - * @param pokemonDto the pokémon to insert into the database |
85 | | - * @param response the server response |
86 | | - */ |
87 | | - private void insert(PokemonDto pokemonDto, ServerResponse response) { |
88 | | - // Pokemon data modification task is executed as single database transaction |
89 | | - response.send(Tx.transaction(() -> { |
90 | | - // Retrieve Type entity for provided name |
91 | | - Type type = typeRepository.getByName(pokemonDto.type()); |
92 | | - // Prepare and insert new Pokemon entity into the database |
93 | | - Pokemon pokemonEntity = new Pokemon(pokemonDto.name(), type); |
| 85 | + private void insert(JsonObject pokemonJson, ServerResponse response) { |
| 86 | + Pokemon pokemon = Tx.transaction(() -> { |
| 87 | + Type type = typeRepository.getByName(pokemonJson.getString("type")); |
| 88 | + Pokemon pokemonEntity = new Pokemon(pokemonJson.getString("name"), type); |
94 | 89 | return pokemonRepository.insert(pokemonEntity); |
95 | | - })); |
| 90 | + }); |
| 91 | + response.send(Json.createObjectBuilder() |
| 92 | + .add("id", pokemon.getId()) |
| 93 | + .add("name", pokemon.getName()) |
| 94 | + .add("type", pokemon.getType().getName()) |
| 95 | + .build()); |
96 | 96 | } |
97 | 97 |
|
98 | | - /** |
99 | | - * Handles the {@code DELETE /{id}} request and deletes a {@link Pokemon} entity by its ID. |
100 | | - * |
101 | | - * @param request the server request |
102 | | - * @param response the server response |
103 | | - */ |
104 | 98 | private void delete(ServerRequest request, ServerResponse response) { |
105 | 99 | int id = request.path() |
106 | 100 | .pathParameters() |
107 | 101 | .first("id").map(Integer::parseInt) |
108 | 102 | .orElseThrow(() -> new BadRequestException("No pokémon id")); |
109 | | - // Rely on internal transaction handling for this simple data modification task |
110 | | - response.send(new DmlResult(pokemonRepository.deleteById(id), "DELETE")); |
| 103 | + response.send("Deleted: " + pokemonRepository.deleteById(id) + " values"); |
111 | 104 | } |
112 | 105 |
|
113 | 106 | } |
0 commit comments