Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 63 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
Expand All @@ -15,6 +15,9 @@
<description>jv-rick-and-morty</description>
<properties>
<java.version>17</java.version>
<lombok.version>1.18.32</lombok.version>
<lombok.mapstruct.binding.version>0.2.0</lombok.mapstruct.binding.version>
<mapstruct.version>1.6.3</mapstruct.version>
<maven.checkstyle.plugin.version>3.1.1</maven.checkstyle.plugin.version>
<maven.checkstyle.plugin.configLocation>
https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml
Expand All @@ -25,22 +28,56 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<build>
Expand All @@ -55,7 +92,7 @@
<version>3.3.0</version>
<executions>
<execution>
<phase>compile</phase>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
Expand All @@ -68,7 +105,28 @@
<linkXRef>false</linkXRef>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>

</project>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package mate.academy.rickandmorty.client;

import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RickAndMortyClient {
private static final String BASE_URL = "https://rickandmortyapi.com/api/character";
private final RestTemplate restTemplate;

public RickAndMortyClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}

public List<CharacterResponse> fetchAllCharacters() {
List<CharacterResponse> results = new ArrayList<>();
String url = BASE_URL;
while (url != null) {
PageResponse page = restTemplate.getForObject(url, PageResponse.class);
if (page == null || page.getResults() == null) {
break;
}
results.addAll(page.getResults());
url = page.getInfo() != null ? page.getInfo().getNext() : null;
}
return results;
}

@Data
public static class PageResponse {
private Info info;
private List<CharacterResponse> results;
}

@Data
public static class Info {
private Integer count;
private Integer pages;
private String next;
private String prev;
}

@Data
public static class CharacterResponse {
private String id;
private String name;
private String status;
private String gender;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package mate.academy.rickandmorty.client;

import java.util.List;
import lombok.Data;

public class RickAndMortyPage {
@Data
public static class Info {
private int count;
private int pages;
private String next;
private String prev;
}

@Data
public static class Origin {
private String name;
}

@Data
public static class Location {
private String name;
}

@Data
public static class Character {
private String id;
private String name;
private String status;
private String species;
private String type;
private String gender;
private Origin origin;
private Location location;
private String image;
}

@Data
public static class Page {
private Info info;
private List<Character> results;
}
}

13 changes: 13 additions & 0 deletions src/main/java/mate/academy/rickandmorty/config/AppConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package mate.academy.rickandmorty.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
13 changes: 13 additions & 0 deletions src/main/java/mate/academy/rickandmorty/config/MapperConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package mate.academy.rickandmorty.config;

import org.mapstruct.InjectionStrategy;
import org.mapstruct.NullValueCheckStrategy;

@org.mapstruct.MapperConfig(
componentModel = "spring",
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS

)
public class MapperConfig {
}
15 changes: 15 additions & 0 deletions src/main/java/mate/academy/rickandmorty/config/OpenApiConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package mate.academy.rickandmorty.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI openApi() {
return new OpenAPI().info(new Info().title("Rick & Morty API").version("1.0"));
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package mate.academy.rickandmorty.controler;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import lombok.RequiredArgsConstructor;
import mate.academy.rickandmorty.dto.CharacterDto;
import mate.academy.rickandmorty.service.CharacterService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@Tag(name = "Rick & Morty")
public class CharacterController {
private final CharacterService service;

@Operation(summary = "Random character (from DB)")
@GetMapping("/api/characters/random")
public CharacterDto random() {
return service.getRandomCharacter();
}

@Operation(summary = "Search characters by name")
@GetMapping("/api/characters/search")
public List<CharacterDto> search(@RequestParam("q") String q) {
return service.findCharactersByName(q);
}
}
10 changes: 10 additions & 0 deletions src/main/java/mate/academy/rickandmorty/dto/CharacterDataDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package mate.academy.rickandmorty.dto;

import java.util.List;
import lombok.Data;

@Data
public class CharacterDataDto {
private List<CharacterDto> results;
private CharacterInfoDto info;
}
20 changes: 20 additions & 0 deletions src/main/java/mate/academy/rickandmorty/dto/CharacterDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package mate.academy.rickandmorty.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
@Schema(description = "Character DTO")
public class CharacterDto {
@Schema(description = "Internal DB id")
private Long id;

@Schema(description = "Original external id (from Rick & Morty API) as string")
private String externalId;

private String name;
private String status;
private String gender;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package mate.academy.rickandmorty.dto;

import lombok.Data;

@Data
public class CharacterInfoDto {
private String next;
}
18 changes: 18 additions & 0 deletions src/main/java/mate/academy/rickandmorty/init/DataInitializer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package mate.academy.rickandmorty.init;

import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import mate.academy.rickandmorty.service.CharacterService;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class DataInitializer {
private final CharacterService characterService;

@PostConstruct
public void init() {
characterService.loadAllCharactersOnce();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package mate.academy.rickandmorty.mapper;

import mate.academy.rickandmorty.client.RickAndMortyClient.CharacterResponse;
import mate.academy.rickandmorty.dto.CharacterDto;
import mate.academy.rickandmorty.model.RickAndMortyCharacter;
import org.springframework.stereotype.Component;

@Component
public class CharacterMapper {
public RickAndMortyCharacter toModel(CharacterResponse r) {
RickAndMortyCharacter e = new RickAndMortyCharacter();
e.setExternalId(r.getId());
e.setName(r.getName());
e.setStatus(r.getStatus());
e.setGender(r.getGender());
return e;
}

public CharacterDto toDto(RickAndMortyCharacter e) {
return new CharacterDto(
e.getId(),
e.getExternalId(),
e.getName(),
e.getStatus(),
e.getGender()
);
}
}
Loading