9
9
import java .net .http .HttpRequest ;
10
10
import java .net .http .HttpResponse ;
11
11
import java .util .List ;
12
+ import java .util .Map ;
12
13
import mate .academy .rickandmorty .dto .CharacterModelDto ;
13
14
import mate .academy .rickandmorty .mapper .CharacterModelMapper ;
14
15
import mate .academy .rickandmorty .model .CharacterModel ;
22
23
public class RickAndMortyClient {
23
24
private static final String BASE_URL = "https://rickandmortyapi.com/api" ;
24
25
private static final String CHARACTER = "/character" ;
25
- private static final int MAX = 826 ;
26
26
private static final int MIN = 1 ;
27
- private static final int RANGE = MAX - MIN + 1 ;
28
27
private final SessionFactory sessionFactory ;
28
+ private final CharacterModelMapper characterModelMapper ;
29
+ private int count ;
29
30
30
- public RickAndMortyClient (SessionFactory sessionFactory ) {
31
+ public RickAndMortyClient (SessionFactory sessionFactory ,
32
+ CharacterModelMapper characterModelMapper ) {
31
33
this .sessionFactory = sessionFactory ;
34
+ this .characterModelMapper = characterModelMapper ;
32
35
}
33
36
34
- public CharacterModel getRandomCharacter () {
37
+ public CharacterModelDto getRandomCharacter () {
35
38
Transaction transaction = null ;
36
- int random = (int ) (Math .random () * RANGE ) + MIN ;
39
+ int random = (int ) (Math .random () * count ) + MIN ;
37
40
try (Session session = sessionFactory .openSession ()) {
38
41
transaction = session .beginTransaction ();
39
42
Query <CharacterModel > query = session .createQuery ("FROM User u "
40
43
+ "WHERE u.externalId = :random" , CharacterModel .class );
41
44
query .setParameter ("externalId" , random );
42
45
transaction .commit ();
43
- return query .getSingleResult ();
46
+ return characterModelMapper . toDto ( query .getSingleResult () );
44
47
} catch (Exception e ) {
45
48
if (transaction != null ) {
46
49
transaction .rollback ();
@@ -49,15 +52,18 @@ public CharacterModel getRandomCharacter() {
49
52
}
50
53
}
51
54
52
- public List <CharacterModel > getCharactersList (String name ) {
55
+ public List <CharacterModelDto > getCharactersListByNameSegment (String nameSegment ) {
53
56
Transaction transaction = null ;
54
57
try (Session session = sessionFactory .openSession ()) {
55
58
transaction = session .beginTransaction ();
56
59
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 );
59
62
transaction .commit ();
60
- return query .getResultList ();
63
+ return query .getResultList ()
64
+ .stream ()
65
+ .map (characterModelMapper ::toDto )
66
+ .toList ();
61
67
} catch (Exception e ) {
62
68
if (transaction != null ) {
63
69
transaction .rollback ();
@@ -68,30 +74,47 @@ public List<CharacterModel> getCharactersList(String name) {
68
74
69
75
@ PostConstruct
70
76
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
- }
78
77
Transaction transaction = null ;
79
78
HttpClient httpClient = HttpClient .newHttpClient ();
80
- String url = BASE_URL + CHARACTER + "/" + builder ;
79
+ String infoUrl = BASE_URL + CHARACTER ;
81
80
HttpRequest httpRequest = HttpRequest
82
81
.newBuilder ()
83
82
.GET ()
84
- .uri (URI .create (url ))
83
+ .uri (URI .create (infoUrl ))
85
84
.build ();
86
85
try (Session session = sessionFactory .openSession ()) {
87
86
transaction = session .beginTransaction ();
88
87
HttpResponse <String > httpResponse = httpClient
89
88
.send (httpRequest , HttpResponse .BodyHandlers .ofString ());
90
89
ObjectMapper objectMapper = new ObjectMapper ();
91
- List < CharacterModelDto > characters = objectMapper
90
+ Map < String , Object > website = objectMapper
92
91
.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 <>() {});
93
116
for (CharacterModelDto character : characters ) {
94
- session .persist (CharacterModelMapper . toCharacterModel (character ));
117
+ session .persist (characterModelMapper . toModel (character ));
95
118
}
96
119
transaction .commit ();
97
120
return characters ;
0 commit comments