Skip to content

Commit eb314a7

Browse files
committed
external and intrnl dto strategy for ext and int APIs, swagger documentation
1 parent c3bbe60 commit eb314a7

18 files changed

+331
-7
lines changed

pom.xml

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,28 +19,55 @@
1919
<maven.checkstyle.plugin.configLocation>
2020
https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml
2121
</maven.checkstyle.plugin.configLocation>
22+
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
2223
</properties>
2324
<dependencies>
2425
<dependency>
2526
<groupId>org.springframework.boot</groupId>
2627
<artifactId>spring-boot-starter</artifactId>
2728
</dependency>
28-
29+
<dependency>
30+
<groupId>org.springframework.boot</groupId>
31+
<artifactId>spring-boot-starter-web</artifactId>
32+
</dependency>
2933
<dependency>
3034
<groupId>org.springframework.boot</groupId>
3135
<artifactId>spring-boot-starter-test</artifactId>
3236
<scope>test</scope>
3337
</dependency>
34-
38+
<dependency>
39+
<groupId>org.projectlombok</groupId>
40+
<artifactId>lombok</artifactId>
41+
</dependency>
3542
<dependency>
3643
<groupId>org.springframework.boot</groupId>
3744
<artifactId>spring-boot-starter-data-jpa</artifactId>
3845
</dependency>
39-
46+
<dependency>
47+
<groupId>org.springdoc</groupId>
48+
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
49+
<version>2.2.0</version>
50+
</dependency>
4051
<dependency>
4152
<groupId>com.h2database</groupId>
4253
<artifactId>h2</artifactId>
4354
</dependency>
55+
<dependency>
56+
<groupId>mysql</groupId>
57+
<artifactId>mysql-connector-java</artifactId>
58+
<version>8.0.33</version>
59+
</dependency>
60+
<dependency>
61+
<groupId>org.mapstruct</groupId>
62+
<artifactId>mapstruct</artifactId>
63+
<version>${org.mapstruct.version}</version>
64+
</dependency>
65+
<dependency>
66+
<groupId>org.mapstruct</groupId>
67+
<artifactId>mapstruct-processor</artifactId>
68+
<version>${org.mapstruct.version}</version>
69+
<scope>provided</scope>
70+
</dependency>
4471
</dependencies>
4572

4673
<build>
@@ -66,6 +93,7 @@
6693
<consoleOutput>true</consoleOutput>
6794
<failsOnError>true</failsOnError>
6895
<linkXRef>false</linkXRef>
96+
<sourceDirectories>src</sourceDirectories>
6997
</configuration>
7098
</plugin>
7199
</plugins>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
package mate.academy.rickandmorty;
22

3+
import lombok.RequiredArgsConstructor;
4+
import mate.academy.rickandmorty.service.CharacterService;
5+
import org.springframework.boot.CommandLineRunner;
36
import org.springframework.boot.SpringApplication;
47
import org.springframework.boot.autoconfigure.SpringBootApplication;
8+
import org.springframework.context.annotation.Bean;
59

610
@SpringBootApplication
11+
@RequiredArgsConstructor
712
public class Application {
13+
private final CharacterService service;
814

915
public static void main(String[] args) {
1016
SpringApplication.run(Application.class, args);
1117
}
18+
19+
@Bean
20+
public CommandLineRunner runDatabaseInitialization() {
21+
return args -> {
22+
service.initializeDatabase();
23+
};
24+
}
1225
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package mate.academy.rickandmorty.config;
2+
3+
import org.mapstruct.InjectionStrategy;
4+
import org.mapstruct.NullValueCheckStrategy;
5+
6+
@org.mapstruct.MapperConfig(
7+
componentModel = "spring",
8+
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
9+
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
10+
implementationPackage = "<PACKAGE_NAME>.impl"
11+
)
12+
public class MapperConfig {
13+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package mate.academy.rickandmorty.controller;
2+
3+
import io.swagger.v3.oas.annotations.Operation;
4+
import io.swagger.v3.oas.annotations.tags.Tag;
5+
import lombok.RequiredArgsConstructor;
6+
import mate.academy.rickandmorty.dto.CharacterDto;
7+
import mate.academy.rickandmorty.service.CharacterService;
8+
import org.springframework.data.domain.Page;
9+
import org.springframework.data.domain.Pageable;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.RequestMapping;
12+
import org.springframework.web.bind.annotation.RequestParam;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
@Tag(name = "Rick&Morty universe management",
16+
description = "Endpoints for the universe management")
17+
@RestController
18+
@RequestMapping("/rmuniverse")
19+
@RequiredArgsConstructor
20+
public class RAndMUniverseController {
21+
private final CharacterService service;
22+
23+
@Operation(summary = "Get a random character",
24+
description = "Retrieves a random character from the universe")
25+
@GetMapping("char/random")
26+
public CharacterDto getRandomChar() {
27+
return service.getRandom();
28+
}
29+
30+
@Operation(summary = "Get character by name",
31+
description = "Retrieves a character by name from the universe"
32+
+ " with sorting and pagination")
33+
@GetMapping("char/by-name")
34+
public Page<CharacterDto> findCharByName(@RequestParam String name, Pageable pageable) {
35+
return service.findByName(name, pageable);
36+
}
37+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package mate.academy.rickandmorty.dto;
2+
3+
public record CharacterDto(
4+
Long id,
5+
Long externalId,
6+
String name,
7+
String status,
8+
String gender) {
9+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package mate.academy.rickandmorty.dtoexternal;
2+
3+
public record CharacterMetadataDto(int count, int pages, String next, String prev) {
4+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package mate.academy.rickandmorty.dtoexternal;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import java.time.OffsetDateTime;
5+
6+
public record CharacterRecordDto(
7+
@JsonProperty("id")
8+
Long externalId,
9+
String name,
10+
String status,
11+
String species,
12+
String type,
13+
String gender,
14+
LocationDto origin,
15+
LocationDto location,
16+
String image,
17+
String[] episode,
18+
String url,
19+
OffsetDateTime created) {
20+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package mate.academy.rickandmorty.dtoexternal;
2+
3+
import java.util.List;
4+
5+
public record CharacterResponseDataDto(
6+
CharacterMetadataDto info,
7+
List<CharacterRecordDto> results) {
8+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package mate.academy.rickandmorty.dtoexternal;
2+
3+
public record LocationDto(String name, String url) {
4+
5+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package mate.academy.rickandmorty.mapper;
2+
3+
import mate.academy.rickandmorty.config.MapperConfig;
4+
import mate.academy.rickandmorty.dto.CharacterDto;
5+
import mate.academy.rickandmorty.dtoexternal.CharacterRecordDto;
6+
import mate.academy.rickandmorty.model.Character;
7+
import org.mapstruct.Mapper;
8+
9+
@Mapper(config = MapperConfig.class)
10+
public interface CharacterMapper {
11+
Character toModel(CharacterRecordDto recordDto);
12+
13+
CharacterDto toDto(Character character);
14+
}

0 commit comments

Comments
 (0)