Skip to content

Commit 4fcac33

Browse files
committed
Forth solution
1 parent 08d10c1 commit 4fcac33

File tree

4 files changed

+85
-34
lines changed

4 files changed

+85
-34
lines changed

src/main/java/mate/academy/rickandmorty/controller/RickAndMortyController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import io.swagger.oas.annotations.Operation;
44
import java.util.List;
5-
import mate.academy.rickandmorty.model.CharacterModel;
5+
import mate.academy.rickandmorty.dto.CharacterModelDto;
66
import mate.academy.rickandmorty.service.RickAndMortyClient;
77
import org.springframework.web.bind.annotation.GetMapping;
88
import org.springframework.web.bind.annotation.RequestParam;
@@ -18,13 +18,13 @@ public RickAndMortyController(RickAndMortyClient rickAndMortyClient) {
1818

1919
@Operation(summary = "Get random character")
2020
@GetMapping
21-
public CharacterModel getRandomCharacter() {
21+
public CharacterModelDto getRandomCharacter() {
2222
return rickAndMortyClient.getRandomCharacter();
2323
}
2424

2525
@Operation(summary = "Get list of characters matching parameter")
2626
@GetMapping("/character")
27-
public List<CharacterModel> getCharactersList(@RequestParam String name) {
28-
return rickAndMortyClient.getCharactersList(name);
27+
public List<CharacterModelDto> getCharactersList(@RequestParam String nameSegment) {
28+
return rickAndMortyClient.getCharactersListByNameSegment(nameSegment);
2929
}
3030
}

src/main/java/mate/academy/rickandmorty/mapper/CharacterModelMapper.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,8 @@
33
import mate.academy.rickandmorty.dto.CharacterModelDto;
44
import mate.academy.rickandmorty.model.CharacterModel;
55

6-
public class CharacterModelMapper {
7-
public static CharacterModel toCharacterModel(CharacterModelDto characterModelDto) {
8-
CharacterModel characterModel = new CharacterModel();
9-
characterModel.setExternalId(characterModelDto.id());
10-
characterModel.setName(characterModelDto.name());
11-
characterModel.setGender(characterModelDto.gender());
12-
characterModel.setStatus(characterModelDto.status());
13-
return characterModel;
14-
}
6+
public interface CharacterModelMapper {
7+
CharacterModelDto toDto(CharacterModel characterModel);
8+
9+
CharacterModel toModel(CharacterModelDto characterModelDto);
1510
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package mate.academy.rickandmorty.mapper;
2+
3+
import mate.academy.rickandmorty.dto.CharacterModelDto;
4+
import mate.academy.rickandmorty.model.CharacterModel;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
public class CharacterModelMapperImpl implements CharacterModelMapper {
9+
10+
@Override
11+
public CharacterModelDto toDto(CharacterModel characterModel) {
12+
if (characterModel == null) {
13+
return null;
14+
}
15+
return new CharacterModelDto(characterModel.getExternalId(),
16+
characterModel.getName(),
17+
characterModel.getGender(),
18+
characterModel.getStatus());
19+
}
20+
21+
@Override
22+
public CharacterModel toModel(CharacterModelDto characterModelDto) {
23+
if (characterModelDto == null) {
24+
return null;
25+
}
26+
CharacterModel characterModel = new CharacterModel();
27+
characterModel.setExternalId(characterModelDto.id());
28+
characterModel.setName(characterModelDto.name());
29+
characterModel.setGender(characterModelDto.gender());
30+
characterModel.setStatus(characterModelDto.status());
31+
return characterModel;
32+
}
33+
}

src/main/java/mate/academy/rickandmorty/service/RickAndMortyClient.java

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.net.http.HttpRequest;
1010
import java.net.http.HttpResponse;
1111
import java.util.List;
12+
import java.util.Map;
1213
import mate.academy.rickandmorty.dto.CharacterModelDto;
1314
import mate.academy.rickandmorty.mapper.CharacterModelMapper;
1415
import mate.academy.rickandmorty.model.CharacterModel;
@@ -22,25 +23,27 @@
2223
public class RickAndMortyClient {
2324
private static final String BASE_URL = "https://rickandmortyapi.com/api";
2425
private static final String CHARACTER = "/character";
25-
private static final int MAX = 826;
2626
private static final int MIN = 1;
27-
private static final int RANGE = MAX - MIN + 1;
2827
private final SessionFactory sessionFactory;
28+
private final CharacterModelMapper characterModelMapper;
29+
private int count;
2930

30-
public RickAndMortyClient(SessionFactory sessionFactory) {
31+
public RickAndMortyClient(SessionFactory sessionFactory,
32+
CharacterModelMapper characterModelMapper) {
3133
this.sessionFactory = sessionFactory;
34+
this.characterModelMapper = characterModelMapper;
3235
}
3336

34-
public CharacterModel getRandomCharacter() {
37+
public CharacterModelDto getRandomCharacter() {
3538
Transaction transaction = null;
36-
int random = (int) (Math.random() * RANGE) + MIN;
39+
int random = (int) (Math.random() * count) + MIN;
3740
try (Session session = sessionFactory.openSession()) {
3841
transaction = session.beginTransaction();
3942
Query<CharacterModel> query = session.createQuery("FROM User u "
4043
+ "WHERE u.externalId = :random", CharacterModel.class);
4144
query.setParameter("externalId", random);
4245
transaction.commit();
43-
return query.getSingleResult();
46+
return characterModelMapper.toDto(query.getSingleResult());
4447
} catch (Exception e) {
4548
if (transaction != null) {
4649
transaction.rollback();
@@ -49,15 +52,18 @@ public CharacterModel getRandomCharacter() {
4952
}
5053
}
5154

52-
public List<CharacterModel> getCharactersList(String name) {
55+
public List<CharacterModelDto> getCharactersListByNameSegment(String nameSegment) {
5356
Transaction transaction = null;
5457
try (Session session = sessionFactory.openSession()) {
5558
transaction = session.beginTransaction();
5659
Query<CharacterModel> query = session.createQuery("FROM User u "
57-
+ "WHERE u.name = :%name%", CharacterModel.class);
58-
query.setParameter("%name%", name);
60+
+ "WHERE u.name = :%nameSegment%", CharacterModel.class);
61+
query.setParameter("%name%", nameSegment);
5962
transaction.commit();
60-
return query.getResultList();
63+
return query.getResultList()
64+
.stream()
65+
.map(characterModelMapper::toDto)
66+
.toList();
6167
} catch (Exception e) {
6268
if (transaction != null) {
6369
transaction.rollback();
@@ -68,30 +74,47 @@ public List<CharacterModel> getCharactersList(String name) {
6874

6975
@PostConstruct
7076
public List<CharacterModelDto> fetchAllCharacters() {
71-
StringBuilder builder = new StringBuilder();
72-
for (int i = MIN; i <= MAX; i++) {
73-
builder.append(i);
74-
if (i < MAX) {
75-
builder.append(",");
76-
}
77-
}
7877
Transaction transaction = null;
7978
HttpClient httpClient = HttpClient.newHttpClient();
80-
String url = BASE_URL + CHARACTER + "/" + builder;
79+
String infoUrl = BASE_URL + CHARACTER;
8180
HttpRequest httpRequest = HttpRequest
8281
.newBuilder()
8382
.GET()
84-
.uri(URI.create(url))
83+
.uri(URI.create(infoUrl))
8584
.build();
8685
try (Session session = sessionFactory.openSession()) {
8786
transaction = session.beginTransaction();
8887
HttpResponse<String> httpResponse = httpClient
8988
.send(httpRequest, HttpResponse.BodyHandlers.ofString());
9089
ObjectMapper objectMapper = new ObjectMapper();
91-
List<CharacterModelDto> characters = objectMapper
90+
Map<String,Object> website = objectMapper
9291
.readValue(httpResponse.body(), new TypeReference<>() {});
92+
String[] info = website.get("info").toString().split(",");
93+
for (String inf : info) {
94+
if (inf.contains("count")) {
95+
count = Integer.parseInt(inf.substring(inf.indexOf("=") + 1));
96+
}
97+
}
98+
StringBuilder builder = new StringBuilder();
99+
for (int i = 1; i <= count; i++) {
100+
builder.append(i);
101+
if (i < count) {
102+
builder.append(",");
103+
}
104+
}
105+
String url = BASE_URL + CHARACTER + "/" + builder;
106+
HttpRequest httpRequest2 = HttpRequest
107+
.newBuilder()
108+
.GET()
109+
.uri(URI.create(url))
110+
.build();
111+
HttpResponse<String> httpResponse2 = httpClient
112+
.send(httpRequest2, HttpResponse.BodyHandlers.ofString());
113+
ObjectMapper objectMapper2 = new ObjectMapper();
114+
List<CharacterModelDto> characters = objectMapper2
115+
.readValue(httpResponse2.body(), new TypeReference<>() {});
93116
for (CharacterModelDto character : characters) {
94-
session.persist(CharacterModelMapper.toCharacterModel(character));
117+
session.persist(characterModelMapper.toModel(character));
95118
}
96119
transaction.commit();
97120
return characters;

0 commit comments

Comments
 (0)