From f11df0b5cf1c7de12679ef79411e37aee6408208 Mon Sep 17 00:00:00 2001 From: Mykhailo Kazarian Date: Wed, 25 Sep 2024 19:30:15 +0300 Subject: [PATCH 1/8] gitignore update --- .gitignore | 174 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 142 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 549e00a2..b4b78787 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,143 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea +# Created by https://www.toptal.com/developers/gitignore/api/java,intellij +# Edit at https://www.toptal.com/developers/gitignore?templates=java,intellij + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format *.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# End of https://www.toptal.com/developers/gitignore/api/java,intellij \ No newline at end of file From afcfdf7d3eb29ba94206bf223fd806119820c819 Mon Sep 17 00:00:00 2001 From: Mykhailo Kazarian Date: Wed, 25 Sep 2024 19:33:03 +0300 Subject: [PATCH 2/8] Jv-rick-and-morty implementation --- .idea/.gitignore | 8 + .idea/compiler.xml | 30 +++ .idea/dataSources.xml | 17 ++ .idea/encodings.xml | 6 + .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 13 + .idea/vcs.xml | 6 + pom.xml | 76 +++++- .../academy/rickandmorty/Application.java | 14 +- .../controler/CharacterController.java | 36 +++ .../external/CharacterFullResponseDto.java | 10 + .../dto/external/CharacterMetadataDto.java | 4 + .../dto/external/CharacterResponseDto.java | 9 + .../dto/internal/CharacterDto.java | 14 + .../CharacterSearchParametersDto.java | 13 + .../api/service/DbSynchronizationService.java | 5 + .../api/service/ExternalCharacterService.java | 7 + .../external/api/service/GetClient.java | 5 + .../impl/DbSynchronizationServiceImpl.java | 35 +++ .../impl/ExternalCharacterServiceImpl.java | 45 ++++ .../service/impl/GetCharactersClientImpl.java | 45 ++++ .../rickandmorty/mapping/CharacterMapper.java | 17 ++ .../rickandmorty/models/Character.java | 25 ++ .../repository/CharacterRepository.java | 18 ++ .../service/CharacterService.java | 11 + .../service/impl/CharacterServiceImpl.java | 30 +++ src/main/resources/application.properties | 7 + .../changes/01-create-character-table.yaml | 36 +++ .../db/changelog/db.changelog-master.yaml | 3 + target/checkstyle-cachefile | 21 ++ target/checkstyle-checker.xml | 250 ++++++++++++++++++ target/checkstyle-result.xml | 82 ++++++ target/classes/application.properties | 8 + .../changes/01-create-character-table.yaml | 36 +++ .../db/changelog/db.changelog-master.yaml | 3 + .../mapping/CharacterMapperImpl.java | 61 +++++ .../compile/default-compile/createdFiles.lst | 19 ++ .../compile/default-compile/inputFiles.lst | 18 ++ 38 files changed, 1059 insertions(+), 4 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/dataSources.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 src/main/java/mate/academy/rickandmorty/controler/CharacterController.java create mode 100644 src/main/java/mate/academy/rickandmorty/dto/external/CharacterFullResponseDto.java create mode 100644 src/main/java/mate/academy/rickandmorty/dto/external/CharacterMetadataDto.java create mode 100644 src/main/java/mate/academy/rickandmorty/dto/external/CharacterResponseDto.java create mode 100644 src/main/java/mate/academy/rickandmorty/dto/internal/CharacterDto.java create mode 100644 src/main/java/mate/academy/rickandmorty/dto/internal/CharacterSearchParametersDto.java create mode 100644 src/main/java/mate/academy/rickandmorty/external/api/service/DbSynchronizationService.java create mode 100644 src/main/java/mate/academy/rickandmorty/external/api/service/ExternalCharacterService.java create mode 100644 src/main/java/mate/academy/rickandmorty/external/api/service/GetClient.java create mode 100644 src/main/java/mate/academy/rickandmorty/external/api/service/impl/DbSynchronizationServiceImpl.java create mode 100644 src/main/java/mate/academy/rickandmorty/external/api/service/impl/ExternalCharacterServiceImpl.java create mode 100644 src/main/java/mate/academy/rickandmorty/external/api/service/impl/GetCharactersClientImpl.java create mode 100644 src/main/java/mate/academy/rickandmorty/mapping/CharacterMapper.java create mode 100644 src/main/java/mate/academy/rickandmorty/models/Character.java create mode 100644 src/main/java/mate/academy/rickandmorty/repository/CharacterRepository.java create mode 100644 src/main/java/mate/academy/rickandmorty/service/CharacterService.java create mode 100644 src/main/java/mate/academy/rickandmorty/service/impl/CharacterServiceImpl.java create mode 100644 src/main/resources/db/changelog/changes/01-create-character-table.yaml create mode 100644 src/main/resources/db/changelog/db.changelog-master.yaml create mode 100644 target/checkstyle-cachefile create mode 100644 target/checkstyle-checker.xml create mode 100644 target/checkstyle-result.xml create mode 100644 target/classes/application.properties create mode 100644 target/classes/db/changelog/changes/01-create-character-table.yaml create mode 100644 target/classes/db/changelog/db.changelog-master.yaml create mode 100644 target/generated-sources/annotations/mate/academy/rickandmorty/mapping/CharacterMapperImpl.java create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 00000000..e7eed1a0 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 00000000..607407df --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,17 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/newTest + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..63e90019 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..712ab9d9 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..5686cebc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0c754f19..80ea2db2 100644 --- a/pom.xml +++ b/pom.xml @@ -19,27 +19,72 @@ https://raw.githubusercontent.com/mate-academy/style-guides/master/java/checkstyle.xml + 1.6.2 + 0.2.0 org.springframework.boot spring-boot-starter - org.springframework.boot spring-boot-starter-test test - + + org.springframework.boot + spring-boot-devtools + runtime + + + com.mysql + mysql-connector-j + 8.2.0 + runtime + org.springframework.boot spring-boot-starter-data-jpa - + + org.springframework.boot + spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-web + com.h2database h2 + runtime + + + org.mapstruct + mapstruct + ${org.mapstruct.version} + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + provided + + + org.projectlombok + lombok + ${lombok.version} + provided + + + org.liquibase + liquibase-core + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.6.0 @@ -68,6 +113,31 @@ false + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.projectlombok + lombok-mapstruct-binding + ${lombok-mapstruct-binding.version} + + + + diff --git a/src/main/java/mate/academy/rickandmorty/Application.java b/src/main/java/mate/academy/rickandmorty/Application.java index cdea84fc..cf12e265 100644 --- a/src/main/java/mate/academy/rickandmorty/Application.java +++ b/src/main/java/mate/academy/rickandmorty/Application.java @@ -1,10 +1,22 @@ package mate.academy.rickandmorty; +import lombok.RequiredArgsConstructor; +import mate.academy.rickandmorty.external.api.service.DbSynchronizationService; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class Application { +@RequiredArgsConstructor +public class Application implements CommandLineRunner { + private static final String RICK_AND_MORTY_API_CHARACTER_URL = "https://rickandmortyapi.com/api/character"; + + private final DbSynchronizationService dbSynchronizationService; + + @Override + public void run(String... args) throws Exception { + dbSynchronizationService.synchronize(RICK_AND_MORTY_API_CHARACTER_URL); + } public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/src/main/java/mate/academy/rickandmorty/controler/CharacterController.java b/src/main/java/mate/academy/rickandmorty/controler/CharacterController.java new file mode 100644 index 00000000..3a6860ec --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/controler/CharacterController.java @@ -0,0 +1,36 @@ +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.internal.CharacterDto; +import mate.academy.rickandmorty.service.CharacterService; +import org.springframework.data.domain.Pageable; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "Rick and Morty characters repository manager", + description = "This managers have basic tool " + + "for searching and watching character description") +@RestController +@RequestMapping("/characters") +@RequiredArgsConstructor +public class CharacterController { + private final CharacterService characterService; + + @GetMapping("/search") + @Operation(summary = "Search by name (with pagination and sorting)", + description = "return list of characters which name contains the search string") + public List searchByName(String name, Pageable pageable) { + return characterService.findByName(pageable, name); + } + + @GetMapping("/random") + @Operation(summary = "Get random character", + description = "returns a random hero that is available in the database") + public CharacterDto getRandom() { + return characterService.getRandomCharacter(); + } +} diff --git a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterFullResponseDto.java b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterFullResponseDto.java new file mode 100644 index 00000000..35503797 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterFullResponseDto.java @@ -0,0 +1,10 @@ +package mate.academy.rickandmorty.dto.external; + +import java.util.List; +import lombok.Data; + +@Data +public class CharacterFullResponseDto { + private CharacterMetadataDto info; + private List results; +} diff --git a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterMetadataDto.java b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterMetadataDto.java new file mode 100644 index 00000000..69dd27b1 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterMetadataDto.java @@ -0,0 +1,4 @@ +package mate.academy.rickandmorty.dto.external; + +public record CharacterMetadataDto(String next) { +} diff --git a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterResponseDto.java b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterResponseDto.java new file mode 100644 index 00000000..0d1676b1 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterResponseDto.java @@ -0,0 +1,9 @@ +package mate.academy.rickandmorty.dto.external; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public record CharacterResponseDto(@JsonProperty("id") String externalId, + String name, + String status, + String gender) { +} diff --git a/src/main/java/mate/academy/rickandmorty/dto/internal/CharacterDto.java b/src/main/java/mate/academy/rickandmorty/dto/internal/CharacterDto.java new file mode 100644 index 00000000..c2db3ccd --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/dto/internal/CharacterDto.java @@ -0,0 +1,14 @@ +package mate.academy.rickandmorty.dto.internal; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CharacterDto { + private Long id; + private String externalId; + private String name; + private String status; + private String gender; +} diff --git a/src/main/java/mate/academy/rickandmorty/dto/internal/CharacterSearchParametersDto.java b/src/main/java/mate/academy/rickandmorty/dto/internal/CharacterSearchParametersDto.java new file mode 100644 index 00000000..c0a434ea --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/dto/internal/CharacterSearchParametersDto.java @@ -0,0 +1,13 @@ +package mate.academy.rickandmorty.dto.internal; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CharacterSearchParametersDto { + private String externalId; + private String name; + private String status; + private String gender; +} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/DbSynchronizationService.java b/src/main/java/mate/academy/rickandmorty/external/api/service/DbSynchronizationService.java new file mode 100644 index 00000000..28a34148 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/DbSynchronizationService.java @@ -0,0 +1,5 @@ +package mate.academy.rickandmorty.external.api.service; + +public interface DbSynchronizationService { + void synchronize(String url); +} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/ExternalCharacterService.java b/src/main/java/mate/academy/rickandmorty/external/api/service/ExternalCharacterService.java new file mode 100644 index 00000000..b3ae4424 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/ExternalCharacterService.java @@ -0,0 +1,7 @@ +package mate.academy.rickandmorty.external.api.service; + +import mate.academy.rickandmorty.dto.external.CharacterResponseDto; + +public interface ExternalCharacterService { + void saveOrUpdate(CharacterResponseDto characterResponseDto); +} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/GetClient.java b/src/main/java/mate/academy/rickandmorty/external/api/service/GetClient.java new file mode 100644 index 00000000..cb9b7ec4 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/GetClient.java @@ -0,0 +1,5 @@ +package mate.academy.rickandmorty.external.api.service; + +public interface GetClient { + T getDtoFromApi(String url); +} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/DbSynchronizationServiceImpl.java b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/DbSynchronizationServiceImpl.java new file mode 100644 index 00000000..5426dd15 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/DbSynchronizationServiceImpl.java @@ -0,0 +1,35 @@ +package mate.academy.rickandmorty.external.api.service.impl; + +import lombok.RequiredArgsConstructor; +import mate.academy.rickandmorty.dto.external.CharacterFullResponseDto; +import mate.academy.rickandmorty.external.api.service.DbSynchronizationService; +import mate.academy.rickandmorty.external.api.service.ExternalCharacterService; +import mate.academy.rickandmorty.external.api.service.GetClient; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class DbSynchronizationServiceImpl implements DbSynchronizationService { + private final GetClient getClient; + private final ExternalCharacterService externalCharacterService; + + @Override + public void synchronize(String url) { + CharacterFullResponseDto fullResponseDto = getClient.getDtoFromApi(url); + + if (fullResponseDto.getResults().isEmpty()) { + return; + } + + while (true) { + fullResponseDto.getResults().forEach(externalCharacterService::saveOrUpdate); + + if (fullResponseDto.getInfo().next() == null) { + break; + } + + fullResponseDto = getClient.getDtoFromApi(fullResponseDto.getInfo().next()); + } + + } +} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/ExternalCharacterServiceImpl.java b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/ExternalCharacterServiceImpl.java new file mode 100644 index 00000000..14ed1c4d --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/ExternalCharacterServiceImpl.java @@ -0,0 +1,45 @@ +package mate.academy.rickandmorty.external.api.service.impl; + +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import mate.academy.rickandmorty.dto.external.CharacterResponseDto; +import mate.academy.rickandmorty.external.api.service.ExternalCharacterService; +import mate.academy.rickandmorty.mapping.CharacterMapper; +import mate.academy.rickandmorty.models.Character; +import mate.academy.rickandmorty.repository.CharacterRepository; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ExternalCharacterServiceImpl implements ExternalCharacterService { + private final CharacterRepository characterRepository; + private final CharacterMapper characterMapper; + + @Override + public void saveOrUpdate(CharacterResponseDto characterResponseDto) { + Optional characterOptional = characterRepository + .findByExternalId(characterResponseDto.externalId()) + .stream() + .findFirst(); + + if (characterOptional.isEmpty()) { + characterRepository.save( + characterMapper.convertFromResponseDto(characterResponseDto)); + } else { + Character character = characterOptional.get(); + + if (isEqual(characterResponseDto, character)) { + return; + } + + characterMapper.updateCharacterFromResponseDto(characterResponseDto, character); + characterRepository.save(character); + } + } + + private boolean isEqual(CharacterResponseDto characterResponseDto, Character character) { + return characterResponseDto.name().equals(character.getName()) + && characterResponseDto.gender().equals(character.getGender()) + && characterResponseDto.status().equals(character.getStatus()); + } +} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/GetCharactersClientImpl.java b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/GetCharactersClientImpl.java new file mode 100644 index 00000000..5c888cf8 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/GetCharactersClientImpl.java @@ -0,0 +1,45 @@ +package mate.academy.rickandmorty.external.api.service.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import lombok.RequiredArgsConstructor; +import mate.academy.rickandmorty.dto.external.CharacterFullResponseDto; +import mate.academy.rickandmorty.external.api.service.GetClient; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class GetCharactersClientImpl implements GetClient { + private final ObjectMapper objectMapper; + + public CharacterFullResponseDto getDtoFromApi(String url) { + HttpResponse response; + HttpClient httpClient = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .build(); + try { + response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + } catch (IOException | InterruptedException e) { + throw new RuntimeException("Can't get response from: " + url, e); + } + + return convertResponse(response); + } + + private CharacterFullResponseDto convertResponse(HttpResponse response) { + try { + return objectMapper.readValue(response.body(), + CharacterFullResponseDto.class); + } catch (JsonProcessingException e) { + throw new RuntimeException( + "Can't convert response to CharacterFullResponseDto.class", e); + } + } +} diff --git a/src/main/java/mate/academy/rickandmorty/mapping/CharacterMapper.java b/src/main/java/mate/academy/rickandmorty/mapping/CharacterMapper.java new file mode 100644 index 00000000..1245fdfe --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/mapping/CharacterMapper.java @@ -0,0 +1,17 @@ +package mate.academy.rickandmorty.mapping; + +import mate.academy.rickandmorty.dto.external.CharacterResponseDto; +import mate.academy.rickandmorty.dto.internal.CharacterDto; +import mate.academy.rickandmorty.models.Character; +import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; + +@Mapper(componentModel = "spring") +public interface CharacterMapper { + Character convertFromResponseDto(CharacterResponseDto characterResponseDto); + + CharacterDto convertToDto(Character character); + + void updateCharacterFromResponseDto(CharacterResponseDto responseDto, + @MappingTarget Character character); +} diff --git a/src/main/java/mate/academy/rickandmorty/models/Character.java b/src/main/java/mate/academy/rickandmorty/models/Character.java new file mode 100644 index 00000000..9dc94721 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/models/Character.java @@ -0,0 +1,25 @@ +package mate.academy.rickandmorty.models; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "characters") +public class Character { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Column(nullable = false, unique = true) + private String externalId; + private String name; + private String status; + private String gender; +} diff --git a/src/main/java/mate/academy/rickandmorty/repository/CharacterRepository.java b/src/main/java/mate/academy/rickandmorty/repository/CharacterRepository.java new file mode 100644 index 00000000..4be63c3e --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/repository/CharacterRepository.java @@ -0,0 +1,18 @@ +package mate.academy.rickandmorty.repository; + +import java.util.List; +import mate.academy.rickandmorty.models.Character; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; + +public interface CharacterRepository extends JpaRepository, + JpaSpecificationExecutor { + List findByExternalId(String externalId); + + List findByNameContaining(Pageable pageable, String name); + + @Query(value = "SELECT * FROM characters ORDER BY RAND() LIMIT 1", nativeQuery = true) + Character findRandomCharacter(); +} diff --git a/src/main/java/mate/academy/rickandmorty/service/CharacterService.java b/src/main/java/mate/academy/rickandmorty/service/CharacterService.java new file mode 100644 index 00000000..5e9a03f9 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/service/CharacterService.java @@ -0,0 +1,11 @@ +package mate.academy.rickandmorty.service; + +import java.util.List; +import mate.academy.rickandmorty.dto.internal.CharacterDto; +import org.springframework.data.domain.Pageable; + +public interface CharacterService { + List findByName(Pageable pageable, String name); + + CharacterDto getRandomCharacter(); +} diff --git a/src/main/java/mate/academy/rickandmorty/service/impl/CharacterServiceImpl.java b/src/main/java/mate/academy/rickandmorty/service/impl/CharacterServiceImpl.java new file mode 100644 index 00000000..d431d7b7 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/service/impl/CharacterServiceImpl.java @@ -0,0 +1,30 @@ +package mate.academy.rickandmorty.service.impl; + +import java.util.List; +import lombok.RequiredArgsConstructor; +import mate.academy.rickandmorty.dto.internal.CharacterDto; +import mate.academy.rickandmorty.mapping.CharacterMapper; +import mate.academy.rickandmorty.repository.CharacterRepository; +import mate.academy.rickandmorty.service.CharacterService; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CharacterServiceImpl implements CharacterService { + private final CharacterRepository characterRepository; + private final CharacterMapper characterMapper; + + @Override + public List findByName(Pageable pageable, String name) { + return characterRepository.findByNameContaining(pageable, name) + .stream() + .map(characterMapper::convertToDto) + .toList(); + } + + @Override + public CharacterDto getRandomCharacter() { + return characterMapper.convertToDto(characterRepository.findRandomCharacter()); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b137891..df18636a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,8 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/newTest +spring.datasource.username=root +spring.datasource.password=henghfdf +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.jpa.hibernate.ddl-auto=validate +spring.jpa.show-sql=true +spring.jpa.open-in-view=false \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/01-create-character-table.yaml b/src/main/resources/db/changelog/changes/01-create-character-table.yaml new file mode 100644 index 00000000..368fdc27 --- /dev/null +++ b/src/main/resources/db/changelog/changes/01-create-character-table.yaml @@ -0,0 +1,36 @@ +databaseChangeLog: + - changeSet: + id: 1 + author: mk + changes: + - createTable: + tableName: characters + columns: + - column: + name: id + type: BIGINT + autoIncrement: true + constraints: + primaryKey: true + nullable: false + - column: + name: external_id + type: VARCHAR(255) + constraints: + nullable: false + unique: true + - column: + name: name + type: VARCHAR(255) + constraints: + nullable: true + - column: + name: status + type: VARCHAR(255) + constraints: + nullable: true + - column: + name: gender + type: VARCHAR(255) + constraints: + nullable: true diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml new file mode 100644 index 00000000..84c313ff --- /dev/null +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -0,0 +1,3 @@ +databaseChangeLog: + - include: + file: db/changelog/changes/01-create-character-table.yaml diff --git a/target/checkstyle-cachefile b/target/checkstyle-cachefile new file mode 100644 index 00000000..43b83273 --- /dev/null +++ b/target/checkstyle-cachefile @@ -0,0 +1,21 @@ +#Wed Sep 25 19:31:32 EEST 2024 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\Application.java=1727281609183 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\controler\\CharacterController.java=1727281470507 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterFullResponseDto.java=1727281253458 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterMetadataDto.java=1727187981408 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterResponseDto.java=1727281253479 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\internal\\CharacterDto.java=1727120426841 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\internal\\CharacterSearchParametersDto.java=1727122337804 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\DbSynchronizationService.java=1727187686084 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\ExternalCharacterService.java=1727281253442 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\GetClient.java=1727281253449 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\DbSynchronizationServiceImpl.java=1727281609188 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\ExternalCharacterServiceImpl.java=1727281609192 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\GetCharactersClientImpl.java=1727281470523 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\mapping\\CharacterMapper.java=1727281253492 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\models\\Character.java=1727281253454 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\repository\\CharacterRepository.java=1727281470515 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\service\\CharacterService.java=1727281609179 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\service\\impl\\CharacterServiceImpl.java=1727281470491 +E\:\\Java_projects\\jv-rick-and-morty\\src\\test\\resources\\application.properties=1727011557652 +configuration*?=95E1807AF64B7CC827C4DFBC71A7E2C99846AA9E diff --git a/target/checkstyle-checker.xml b/target/checkstyle-checker.xml new file mode 100644 index 00000000..ea0a5295 --- /dev/null +++ b/target/checkstyle-checker.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/target/checkstyle-result.xml b/target/checkstyle-result.xml new file mode 100644 index 00000000..87c173cb --- /dev/null +++ b/target/checkstyle-result.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/application.properties b/target/classes/application.properties new file mode 100644 index 00000000..df18636a --- /dev/null +++ b/target/classes/application.properties @@ -0,0 +1,8 @@ +spring.datasource.url=jdbc:mysql://localhost:3306/newTest +spring.datasource.username=root +spring.datasource.password=henghfdf +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.jpa.hibernate.ddl-auto=validate +spring.jpa.show-sql=true +spring.jpa.open-in-view=false \ No newline at end of file diff --git a/target/classes/db/changelog/changes/01-create-character-table.yaml b/target/classes/db/changelog/changes/01-create-character-table.yaml new file mode 100644 index 00000000..368fdc27 --- /dev/null +++ b/target/classes/db/changelog/changes/01-create-character-table.yaml @@ -0,0 +1,36 @@ +databaseChangeLog: + - changeSet: + id: 1 + author: mk + changes: + - createTable: + tableName: characters + columns: + - column: + name: id + type: BIGINT + autoIncrement: true + constraints: + primaryKey: true + nullable: false + - column: + name: external_id + type: VARCHAR(255) + constraints: + nullable: false + unique: true + - column: + name: name + type: VARCHAR(255) + constraints: + nullable: true + - column: + name: status + type: VARCHAR(255) + constraints: + nullable: true + - column: + name: gender + type: VARCHAR(255) + constraints: + nullable: true diff --git a/target/classes/db/changelog/db.changelog-master.yaml b/target/classes/db/changelog/db.changelog-master.yaml new file mode 100644 index 00000000..84c313ff --- /dev/null +++ b/target/classes/db/changelog/db.changelog-master.yaml @@ -0,0 +1,3 @@ +databaseChangeLog: + - include: + file: db/changelog/changes/01-create-character-table.yaml diff --git a/target/generated-sources/annotations/mate/academy/rickandmorty/mapping/CharacterMapperImpl.java b/target/generated-sources/annotations/mate/academy/rickandmorty/mapping/CharacterMapperImpl.java new file mode 100644 index 00000000..84c5f43e --- /dev/null +++ b/target/generated-sources/annotations/mate/academy/rickandmorty/mapping/CharacterMapperImpl.java @@ -0,0 +1,61 @@ +package mate.academy.rickandmorty.mapping; + +import javax.annotation.processing.Generated; +import mate.academy.rickandmorty.dto.external.CharacterResponseDto; +import mate.academy.rickandmorty.dto.internal.CharacterDto; +import mate.academy.rickandmorty.models.Character; +import org.springframework.stereotype.Component; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2024-09-25T19:31:29+0300", + comments = "version: 1.6.2, compiler: javac, environment: Java 21.0.2 (Oracle Corporation)" +) +@Component +public class CharacterMapperImpl implements CharacterMapper { + + @Override + public Character convertFromResponseDto(CharacterResponseDto characterResponseDto) { + if ( characterResponseDto == null ) { + return null; + } + + Character character = new Character(); + + character.setExternalId( characterResponseDto.externalId() ); + character.setName( characterResponseDto.name() ); + character.setStatus( characterResponseDto.status() ); + character.setGender( characterResponseDto.gender() ); + + return character; + } + + @Override + public CharacterDto convertToDto(Character character) { + if ( character == null ) { + return null; + } + + CharacterDto characterDto = new CharacterDto(); + + characterDto.setId( character.getId() ); + characterDto.setExternalId( character.getExternalId() ); + characterDto.setName( character.getName() ); + characterDto.setStatus( character.getStatus() ); + characterDto.setGender( character.getGender() ); + + return characterDto; + } + + @Override + public void updateCharacterFromResponseDto(CharacterResponseDto responseDto, Character character) { + if ( responseDto == null ) { + return; + } + + character.setExternalId( responseDto.externalId() ); + character.setName( responseDto.name() ); + character.setStatus( responseDto.status() ); + character.setGender( responseDto.gender() ); + } +} diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..c52127a0 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,19 @@ +mate\academy\rickandmorty\mapping\CharacterMapper.class +mate\academy\rickandmorty\external\api\service\GetClient.class +mate\academy\rickandmorty\models\Character.class +mate\academy\rickandmorty\dto\internal\CharacterDto.class +mate\academy\rickandmorty\external\api\service\impl\ExternalCharacterServiceImpl.class +mate\academy\rickandmorty\repository\CharacterRepository.class +mate\academy\rickandmorty\dto\external\CharacterResponseDto.class +mate\academy\rickandmorty\external\api\service\ExternalCharacterService.class +mate\academy\rickandmorty\external\api\service\impl\DbSynchronizationServiceImpl.class +mate\academy\rickandmorty\dto\external\CharacterMetadataDto.class +mate\academy\rickandmorty\dto\internal\CharacterSearchParametersDto.class +mate\academy\rickandmorty\mapping\CharacterMapperImpl.class +mate\academy\rickandmorty\service\impl\CharacterServiceImpl.class +mate\academy\rickandmorty\external\api\service\DbSynchronizationService.class +mate\academy\rickandmorty\controler\CharacterController.class +mate\academy\rickandmorty\service\CharacterService.class +mate\academy\rickandmorty\external\api\service\impl\GetCharactersClientImpl.class +mate\academy\rickandmorty\Application.class +mate\academy\rickandmorty\dto\external\CharacterFullResponseDto.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..a16176b5 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,18 @@ +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\external\CharacterFullResponseDto.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\external\CharacterResponseDto.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\external\CharacterMetadataDto.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\internal\CharacterSearchParametersDto.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\controler\CharacterController.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\mapping\CharacterMapper.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\models\Character.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\DbSynchronizationService.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\impl\ExternalCharacterServiceImpl.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\repository\CharacterRepository.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\internal\CharacterDto.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\GetClient.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\impl\GetCharactersClientImpl.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\service\impl\CharacterServiceImpl.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\ExternalCharacterService.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\service\CharacterService.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\Application.java +E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\impl\DbSynchronizationServiceImpl.java From 0ab9daf23b5f91c2c913f54b1ab64b92613ca6a1 Mon Sep 17 00:00:00 2001 From: Mykhailo Kazarian Date: Wed, 25 Sep 2024 19:54:57 +0300 Subject: [PATCH 3/8] Jv-rick-and-morty implementation (fix) --- target/checkstyle-cachefile | 38 ++++++------ .../mapping/CharacterMapperImpl.java | 61 ------------------- 2 files changed, 19 insertions(+), 80 deletions(-) delete mode 100644 target/generated-sources/annotations/mate/academy/rickandmorty/mapping/CharacterMapperImpl.java diff --git a/target/checkstyle-cachefile b/target/checkstyle-cachefile index 43b83273..2c98b9d6 100644 --- a/target/checkstyle-cachefile +++ b/target/checkstyle-cachefile @@ -1,21 +1,21 @@ -#Wed Sep 25 19:31:32 EEST 2024 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\Application.java=1727281609183 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\controler\\CharacterController.java=1727281470507 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterFullResponseDto.java=1727281253458 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterMetadataDto.java=1727187981408 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterResponseDto.java=1727281253479 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\internal\\CharacterDto.java=1727120426841 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\internal\\CharacterSearchParametersDto.java=1727122337804 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\DbSynchronizationService.java=1727187686084 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\ExternalCharacterService.java=1727281253442 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\GetClient.java=1727281253449 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\DbSynchronizationServiceImpl.java=1727281609188 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\ExternalCharacterServiceImpl.java=1727281609192 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\GetCharactersClientImpl.java=1727281470523 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\mapping\\CharacterMapper.java=1727281253492 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\models\\Character.java=1727281253454 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\repository\\CharacterRepository.java=1727281470515 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\service\\CharacterService.java=1727281609179 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\service\\impl\\CharacterServiceImpl.java=1727281470491 +#Wed Sep 25 19:54:02 EEST 2024 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\Application.java=1727282829684 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\controler\\CharacterController.java=1727282829684 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterFullResponseDto.java=1727282829684 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterMetadataDto.java=1727282829684 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterResponseDto.java=1727282829684 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\internal\\CharacterDto.java=1727282829686 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\internal\\CharacterSearchParametersDto.java=1727282829686 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\DbSynchronizationService.java=1727282829686 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\ExternalCharacterService.java=1727282829686 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\GetClient.java=1727282829687 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\DbSynchronizationServiceImpl.java=1727282829687 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\ExternalCharacterServiceImpl.java=1727282829687 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\GetCharactersClientImpl.java=1727282829688 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\mapping\\CharacterMapper.java=1727282829688 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\models\\Character.java=1727282829688 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\repository\\CharacterRepository.java=1727282829688 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\service\\CharacterService.java=1727282829688 +E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\service\\impl\\CharacterServiceImpl.java=1727282829689 E\:\\Java_projects\\jv-rick-and-morty\\src\\test\\resources\\application.properties=1727011557652 configuration*?=95E1807AF64B7CC827C4DFBC71A7E2C99846AA9E diff --git a/target/generated-sources/annotations/mate/academy/rickandmorty/mapping/CharacterMapperImpl.java b/target/generated-sources/annotations/mate/academy/rickandmorty/mapping/CharacterMapperImpl.java deleted file mode 100644 index 84c5f43e..00000000 --- a/target/generated-sources/annotations/mate/academy/rickandmorty/mapping/CharacterMapperImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package mate.academy.rickandmorty.mapping; - -import javax.annotation.processing.Generated; -import mate.academy.rickandmorty.dto.external.CharacterResponseDto; -import mate.academy.rickandmorty.dto.internal.CharacterDto; -import mate.academy.rickandmorty.models.Character; -import org.springframework.stereotype.Component; - -@Generated( - value = "org.mapstruct.ap.MappingProcessor", - date = "2024-09-25T19:31:29+0300", - comments = "version: 1.6.2, compiler: javac, environment: Java 21.0.2 (Oracle Corporation)" -) -@Component -public class CharacterMapperImpl implements CharacterMapper { - - @Override - public Character convertFromResponseDto(CharacterResponseDto characterResponseDto) { - if ( characterResponseDto == null ) { - return null; - } - - Character character = new Character(); - - character.setExternalId( characterResponseDto.externalId() ); - character.setName( characterResponseDto.name() ); - character.setStatus( characterResponseDto.status() ); - character.setGender( characterResponseDto.gender() ); - - return character; - } - - @Override - public CharacterDto convertToDto(Character character) { - if ( character == null ) { - return null; - } - - CharacterDto characterDto = new CharacterDto(); - - characterDto.setId( character.getId() ); - characterDto.setExternalId( character.getExternalId() ); - characterDto.setName( character.getName() ); - characterDto.setStatus( character.getStatus() ); - characterDto.setGender( character.getGender() ); - - return characterDto; - } - - @Override - public void updateCharacterFromResponseDto(CharacterResponseDto responseDto, Character character) { - if ( responseDto == null ) { - return; - } - - character.setExternalId( responseDto.externalId() ); - character.setName( responseDto.name() ); - character.setStatus( responseDto.status() ); - character.setGender( responseDto.gender() ); - } -} From f7396bf2b1a586e23b48ba07bcf3729e034ee0f0 Mon Sep 17 00:00:00 2001 From: Mykhailo Kazarian Date: Wed, 25 Sep 2024 19:57:59 +0300 Subject: [PATCH 4/8] Jv-rick-and-morty implementation (fix2) --- .gitignore | 174 ++++++++++------------------------------------------- 1 file changed, 32 insertions(+), 142 deletions(-) diff --git a/.gitignore b/.gitignore index b4b78787..549e00a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,143 +1,33 @@ -# Created by https://www.toptal.com/developers/gitignore/api/java,intellij -# Edit at https://www.toptal.com/developers/gitignore?templates=java,intellij - -### Intellij ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 - -# User-specific stuff -.idea/**/workspace.xml -.idea/**/tasks.xml -.idea/**/usage.statistics.xml -.idea/**/dictionaries -.idea/**/shelf - -# AWS User-specific -.idea/**/aws.xml - -# Generated files -.idea/**/contentModel.xml - -# Sensitive or high-churn files -.idea/**/dataSources/ -.idea/**/dataSources.ids -.idea/**/dataSources.local.xml -.idea/**/sqlDataSources.xml -.idea/**/dynamic.xml -.idea/**/uiDesigner.xml -.idea/**/dbnavigator.xml - -# Gradle -.idea/**/gradle.xml -.idea/**/libraries - -# Gradle and Maven with auto-import -# When using Gradle or Maven with auto-import, you should exclude module files, -# since they will be recreated, and may cause churn. Uncomment if using -# auto-import. -# .idea/artifacts -# .idea/compiler.xml -# .idea/jarRepositories.xml -# .idea/modules.xml -# .idea/*.iml -# .idea/modules -# *.iml -# *.ipr - -# CMake -cmake-build-*/ - -# Mongo Explorer plugin -.idea/**/mongoSettings.xml - -# File-based project format +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea *.iws - -# IntelliJ -out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Cursive Clojure plugin -.idea/replstate.xml - -# SonarLint plugin -.idea/sonarlint/ - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - -# Editor-based Rest Client -.idea/httpRequests - -# Android studio 3.1+ serialized cache file -.idea/caches/build_file_checksums.ser - -### Intellij Patch ### -# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 - -# *.iml -# modules.xml -# .idea/misc.xml -# *.ipr - -# Sonarlint plugin -# https://plugins.jetbrains.com/plugin/7973-sonarlint -.idea/**/sonarlint/ - -# SonarQube Plugin -# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin -.idea/**/sonarIssues.xml - -# Markdown Navigator plugin -# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced -.idea/**/markdown-navigator.xml -.idea/**/markdown-navigator-enh.xml -.idea/**/markdown-navigator/ - -# Cache file creation bug -# See https://youtrack.jetbrains.com/issue/JBR-2257 -.idea/$CACHE_FILE$ - -# CodeStream plugin -# https://plugins.jetbrains.com/plugin/12206-codestream -.idea/codestream.xml - -# Azure Toolkit for IntelliJ plugin -# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij -.idea/**/azureSettings.xml - -### Java ### -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -replay_pid* - -# End of https://www.toptal.com/developers/gitignore/api/java,intellij \ No newline at end of file +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ From 34bb91cadc72477980fe1d7165e72762b3311ff0 Mon Sep 17 00:00:00 2001 From: Mykhailo Kazarian Date: Wed, 25 Sep 2024 23:17:40 +0300 Subject: [PATCH 5/8] Jv-rick-and-morty implementation (fix3 gitignore) --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 549e00a2..6ff23986 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ HELP.md -target/ +/target/ +/src/main/resources/application.properties !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ From 2565f0c24eff7bfacd6f7aa0e054254abe81922c Mon Sep 17 00:00:00 2001 From: Mykhailo Kazarian Date: Wed, 25 Sep 2024 23:24:32 +0300 Subject: [PATCH 6/8] Jv-rick-and-morty implementation (fix3) --- .gitignore | 1 - src/main/resources/application.properties | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 6ff23986..95be6e43 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ HELP.md /target/ -/src/main/resources/application.properties !.mvn/wrapper/maven-wrapper.jar !**/src/main/**/target/ !**/src/test/**/target/ diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index df18636a..73de097e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,8 @@ spring.datasource.url=jdbc:mysql://localhost:3306/newTest -spring.datasource.username=root -spring.datasource.password=henghfdf +spring.datasource.username= +spring.datasource.password= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=true -spring.jpa.open-in-view=false \ No newline at end of file +spring.jpa.open-in-view=false From ff3ac77c0e5a568d26a123ac063266cc184c036c Mon Sep 17 00:00:00 2001 From: Mykhailo Kazarian Date: Wed, 25 Sep 2024 23:25:04 +0300 Subject: [PATCH 7/8] Jv-rick-and-morty implementation (fix4) --- target/checkstyle-cachefile | 21 -- target/checkstyle-checker.xml | 250 ------------------ target/checkstyle-result.xml | 82 ------ target/classes/application.properties | 8 - .../changes/01-create-character-table.yaml | 36 --- .../db/changelog/db.changelog-master.yaml | 3 - .../compile/default-compile/createdFiles.lst | 19 -- .../compile/default-compile/inputFiles.lst | 18 -- 8 files changed, 437 deletions(-) delete mode 100644 target/checkstyle-cachefile delete mode 100644 target/checkstyle-checker.xml delete mode 100644 target/checkstyle-result.xml delete mode 100644 target/classes/application.properties delete mode 100644 target/classes/db/changelog/changes/01-create-character-table.yaml delete mode 100644 target/classes/db/changelog/db.changelog-master.yaml delete mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/target/checkstyle-cachefile b/target/checkstyle-cachefile deleted file mode 100644 index 2c98b9d6..00000000 --- a/target/checkstyle-cachefile +++ /dev/null @@ -1,21 +0,0 @@ -#Wed Sep 25 19:54:02 EEST 2024 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\Application.java=1727282829684 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\controler\\CharacterController.java=1727282829684 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterFullResponseDto.java=1727282829684 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterMetadataDto.java=1727282829684 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\external\\CharacterResponseDto.java=1727282829684 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\internal\\CharacterDto.java=1727282829686 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\dto\\internal\\CharacterSearchParametersDto.java=1727282829686 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\DbSynchronizationService.java=1727282829686 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\ExternalCharacterService.java=1727282829686 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\GetClient.java=1727282829687 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\DbSynchronizationServiceImpl.java=1727282829687 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\ExternalCharacterServiceImpl.java=1727282829687 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\external\\api\\service\\impl\\GetCharactersClientImpl.java=1727282829688 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\mapping\\CharacterMapper.java=1727282829688 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\models\\Character.java=1727282829688 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\repository\\CharacterRepository.java=1727282829688 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\service\\CharacterService.java=1727282829688 -E\:\\Java_projects\\jv-rick-and-morty\\src\\main\\java\\mate\\academy\\rickandmorty\\service\\impl\\CharacterServiceImpl.java=1727282829689 -E\:\\Java_projects\\jv-rick-and-morty\\src\\test\\resources\\application.properties=1727011557652 -configuration*?=95E1807AF64B7CC827C4DFBC71A7E2C99846AA9E diff --git a/target/checkstyle-checker.xml b/target/checkstyle-checker.xml deleted file mode 100644 index ea0a5295..00000000 --- a/target/checkstyle-checker.xml +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/target/checkstyle-result.xml b/target/checkstyle-result.xml deleted file mode 100644 index 87c173cb..00000000 --- a/target/checkstyle-result.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/target/classes/application.properties b/target/classes/application.properties deleted file mode 100644 index df18636a..00000000 --- a/target/classes/application.properties +++ /dev/null @@ -1,8 +0,0 @@ -spring.datasource.url=jdbc:mysql://localhost:3306/newTest -spring.datasource.username=root -spring.datasource.password=henghfdf -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -spring.jpa.hibernate.ddl-auto=validate -spring.jpa.show-sql=true -spring.jpa.open-in-view=false \ No newline at end of file diff --git a/target/classes/db/changelog/changes/01-create-character-table.yaml b/target/classes/db/changelog/changes/01-create-character-table.yaml deleted file mode 100644 index 368fdc27..00000000 --- a/target/classes/db/changelog/changes/01-create-character-table.yaml +++ /dev/null @@ -1,36 +0,0 @@ -databaseChangeLog: - - changeSet: - id: 1 - author: mk - changes: - - createTable: - tableName: characters - columns: - - column: - name: id - type: BIGINT - autoIncrement: true - constraints: - primaryKey: true - nullable: false - - column: - name: external_id - type: VARCHAR(255) - constraints: - nullable: false - unique: true - - column: - name: name - type: VARCHAR(255) - constraints: - nullable: true - - column: - name: status - type: VARCHAR(255) - constraints: - nullable: true - - column: - name: gender - type: VARCHAR(255) - constraints: - nullable: true diff --git a/target/classes/db/changelog/db.changelog-master.yaml b/target/classes/db/changelog/db.changelog-master.yaml deleted file mode 100644 index 84c313ff..00000000 --- a/target/classes/db/changelog/db.changelog-master.yaml +++ /dev/null @@ -1,3 +0,0 @@ -databaseChangeLog: - - include: - file: db/changelog/changes/01-create-character-table.yaml diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index c52127a0..00000000 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,19 +0,0 @@ -mate\academy\rickandmorty\mapping\CharacterMapper.class -mate\academy\rickandmorty\external\api\service\GetClient.class -mate\academy\rickandmorty\models\Character.class -mate\academy\rickandmorty\dto\internal\CharacterDto.class -mate\academy\rickandmorty\external\api\service\impl\ExternalCharacterServiceImpl.class -mate\academy\rickandmorty\repository\CharacterRepository.class -mate\academy\rickandmorty\dto\external\CharacterResponseDto.class -mate\academy\rickandmorty\external\api\service\ExternalCharacterService.class -mate\academy\rickandmorty\external\api\service\impl\DbSynchronizationServiceImpl.class -mate\academy\rickandmorty\dto\external\CharacterMetadataDto.class -mate\academy\rickandmorty\dto\internal\CharacterSearchParametersDto.class -mate\academy\rickandmorty\mapping\CharacterMapperImpl.class -mate\academy\rickandmorty\service\impl\CharacterServiceImpl.class -mate\academy\rickandmorty\external\api\service\DbSynchronizationService.class -mate\academy\rickandmorty\controler\CharacterController.class -mate\academy\rickandmorty\service\CharacterService.class -mate\academy\rickandmorty\external\api\service\impl\GetCharactersClientImpl.class -mate\academy\rickandmorty\Application.class -mate\academy\rickandmorty\dto\external\CharacterFullResponseDto.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index a16176b5..00000000 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,18 +0,0 @@ -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\external\CharacterFullResponseDto.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\external\CharacterResponseDto.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\external\CharacterMetadataDto.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\internal\CharacterSearchParametersDto.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\controler\CharacterController.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\mapping\CharacterMapper.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\models\Character.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\DbSynchronizationService.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\impl\ExternalCharacterServiceImpl.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\repository\CharacterRepository.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\dto\internal\CharacterDto.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\GetClient.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\impl\GetCharactersClientImpl.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\service\impl\CharacterServiceImpl.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\ExternalCharacterService.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\service\CharacterService.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\Application.java -E:\Java_projects\jv-rick-and-morty\src\main\java\mate\academy\rickandmorty\external\api\service\impl\DbSynchronizationServiceImpl.java From 933f1964dc4c623157763a8e501a4046edb586c8 Mon Sep 17 00:00:00 2001 From: Mykhailo Kazarian Date: Fri, 27 Sep 2024 12:57:07 +0300 Subject: [PATCH 8/8] Jv-rick-and-morty implementation (fix 5 full fix) --- pom.xml | 5 ++- .../academy/rickandmorty/Application.java | 6 +-- .../external/CharacterFullResponseDto.java | 5 ++- .../dto/external/CharacterMetadataDto.java | 9 +++- .../dto/external/CharacterResponseDto.java | 15 +++++-- .../exeption/ConnectionException.java | 11 +++++ .../exeption/ConvertException.java | 11 +++++ .../external/api/service/CharacterClient.java | 7 ++++ .../api/service/DbSynchronizationService.java | 2 +- .../api/service/ExternalCharacterService.java | 4 +- .../external/api/service/GetClient.java | 5 --- ...entImpl.java => CharactersClientImpl.java} | 12 ++++-- .../impl/DbSynchronizationServiceImpl.java | 18 ++++---- .../impl/ExternalCharacterServiceImpl.java | 41 +++++++++++-------- .../repository/CharacterRepository.java | 6 ++- .../service/impl/CharacterServiceImpl.java | 6 ++- src/main/resources/application.properties | 2 + src/test/resources/application.properties | 2 + 18 files changed, 118 insertions(+), 49 deletions(-) create mode 100644 src/main/java/mate/academy/rickandmorty/exeption/ConnectionException.java create mode 100644 src/main/java/mate/academy/rickandmorty/exeption/ConvertException.java create mode 100644 src/main/java/mate/academy/rickandmorty/external/api/service/CharacterClient.java delete mode 100644 src/main/java/mate/academy/rickandmorty/external/api/service/GetClient.java rename src/main/java/mate/academy/rickandmorty/external/api/service/impl/{GetCharactersClientImpl.java => CharactersClientImpl.java} (76%) diff --git a/pom.xml b/pom.xml index 80ea2db2..64de8b10 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,7 @@ org.springframework.boot spring-boot-starter-test + 3.2.10 test @@ -97,7 +98,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.3.0 + ${maven.checkstyle.plugin.version} compile @@ -111,6 +112,8 @@ true true false + target/generated-sources/annotations/**/*.java + src/main/java/**/*.java diff --git a/src/main/java/mate/academy/rickandmorty/Application.java b/src/main/java/mate/academy/rickandmorty/Application.java index cf12e265..2ee82c01 100644 --- a/src/main/java/mate/academy/rickandmorty/Application.java +++ b/src/main/java/mate/academy/rickandmorty/Application.java @@ -1,7 +1,9 @@ package mate.academy.rickandmorty; import lombok.RequiredArgsConstructor; + import mate.academy.rickandmorty.external.api.service.DbSynchronizationService; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -9,13 +11,11 @@ @SpringBootApplication @RequiredArgsConstructor public class Application implements CommandLineRunner { - private static final String RICK_AND_MORTY_API_CHARACTER_URL = "https://rickandmortyapi.com/api/character"; - private final DbSynchronizationService dbSynchronizationService; @Override public void run(String... args) throws Exception { - dbSynchronizationService.synchronize(RICK_AND_MORTY_API_CHARACTER_URL); + dbSynchronizationService.synchronize(); } public static void main(String[] args) { diff --git a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterFullResponseDto.java b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterFullResponseDto.java index 35503797..24538ee8 100644 --- a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterFullResponseDto.java +++ b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterFullResponseDto.java @@ -2,8 +2,11 @@ import java.util.List; import lombok.Data; +import lombok.Getter; +import lombok.Setter; -@Data +@Getter +@Setter public class CharacterFullResponseDto { private CharacterMetadataDto info; private List results; diff --git a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterMetadataDto.java b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterMetadataDto.java index 69dd27b1..cc64268b 100644 --- a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterMetadataDto.java +++ b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterMetadataDto.java @@ -1,4 +1,11 @@ package mate.academy.rickandmorty.dto.external; -public record CharacterMetadataDto(String next) { +import lombok.Getter; +import lombok.Setter; + +import java.util.Objects; +@Getter +@Setter +public class CharacterMetadataDto { + private String next; } diff --git a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterResponseDto.java b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterResponseDto.java index 0d1676b1..d9656a0b 100644 --- a/src/main/java/mate/academy/rickandmorty/dto/external/CharacterResponseDto.java +++ b/src/main/java/mate/academy/rickandmorty/dto/external/CharacterResponseDto.java @@ -1,9 +1,16 @@ package mate.academy.rickandmorty.dto.external; import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; -public record CharacterResponseDto(@JsonProperty("id") String externalId, - String name, - String status, - String gender) { +import java.util.Objects; +@Getter +@Setter +public final class CharacterResponseDto { + @JsonProperty("id") + private String externalId; + private String name; + private String status; + private String gender; } diff --git a/src/main/java/mate/academy/rickandmorty/exeption/ConnectionException.java b/src/main/java/mate/academy/rickandmorty/exeption/ConnectionException.java new file mode 100644 index 00000000..d05561da --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/exeption/ConnectionException.java @@ -0,0 +1,11 @@ +package mate.academy.rickandmorty.exeption; + +public class ConnectionException extends RuntimeException{ + public ConnectionException(String message) { + super(message); + } + + public ConnectionException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/mate/academy/rickandmorty/exeption/ConvertException.java b/src/main/java/mate/academy/rickandmorty/exeption/ConvertException.java new file mode 100644 index 00000000..881871fe --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/exeption/ConvertException.java @@ -0,0 +1,11 @@ +package mate.academy.rickandmorty.exeption; + +public class ConvertException extends RuntimeException{ + public ConvertException(String message) { + super(message); + } + + public ConvertException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/CharacterClient.java b/src/main/java/mate/academy/rickandmorty/external/api/service/CharacterClient.java new file mode 100644 index 00000000..aba4c8c9 --- /dev/null +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/CharacterClient.java @@ -0,0 +1,7 @@ +package mate.academy.rickandmorty.external.api.service; + +import mate.academy.rickandmorty.dto.external.CharacterFullResponseDto; + +public interface CharacterClient { + CharacterFullResponseDto getDtoFromApi(String url); +} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/DbSynchronizationService.java b/src/main/java/mate/academy/rickandmorty/external/api/service/DbSynchronizationService.java index 28a34148..e85c0609 100644 --- a/src/main/java/mate/academy/rickandmorty/external/api/service/DbSynchronizationService.java +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/DbSynchronizationService.java @@ -1,5 +1,5 @@ package mate.academy.rickandmorty.external.api.service; public interface DbSynchronizationService { - void synchronize(String url); + void synchronize(); } diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/ExternalCharacterService.java b/src/main/java/mate/academy/rickandmorty/external/api/service/ExternalCharacterService.java index b3ae4424..03315a84 100644 --- a/src/main/java/mate/academy/rickandmorty/external/api/service/ExternalCharacterService.java +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/ExternalCharacterService.java @@ -2,6 +2,8 @@ import mate.academy.rickandmorty.dto.external.CharacterResponseDto; +import java.util.List; + public interface ExternalCharacterService { - void saveOrUpdate(CharacterResponseDto characterResponseDto); + void saveOrUpdate(List responseDtoList); } diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/GetClient.java b/src/main/java/mate/academy/rickandmorty/external/api/service/GetClient.java deleted file mode 100644 index cb9b7ec4..00000000 --- a/src/main/java/mate/academy/rickandmorty/external/api/service/GetClient.java +++ /dev/null @@ -1,5 +0,0 @@ -package mate.academy.rickandmorty.external.api.service; - -public interface GetClient { - T getDtoFromApi(String url); -} diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/GetCharactersClientImpl.java b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/CharactersClientImpl.java similarity index 76% rename from src/main/java/mate/academy/rickandmorty/external/api/service/impl/GetCharactersClientImpl.java rename to src/main/java/mate/academy/rickandmorty/external/api/service/impl/CharactersClientImpl.java index 5c888cf8..b7a18b0c 100644 --- a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/GetCharactersClientImpl.java +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/CharactersClientImpl.java @@ -7,14 +7,18 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; + import lombok.RequiredArgsConstructor; import mate.academy.rickandmorty.dto.external.CharacterFullResponseDto; -import mate.academy.rickandmorty.external.api.service.GetClient; +import mate.academy.rickandmorty.exeption.ConnectionException; +import mate.academy.rickandmorty.exeption.ConvertException; +import mate.academy.rickandmorty.external.api.service.CharacterClient; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor -public class GetCharactersClientImpl implements GetClient { +public class CharactersClientImpl implements CharacterClient { private final ObjectMapper objectMapper; public CharacterFullResponseDto getDtoFromApi(String url) { @@ -27,7 +31,7 @@ public CharacterFullResponseDto getDtoFromApi(String url) { try { response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); } catch (IOException | InterruptedException e) { - throw new RuntimeException("Can't get response from: " + url, e); + throw new ConnectionException("Can't get response from: " + url, e); } return convertResponse(response); @@ -38,7 +42,7 @@ private CharacterFullResponseDto convertResponse(HttpResponse response) return objectMapper.readValue(response.body(), CharacterFullResponseDto.class); } catch (JsonProcessingException e) { - throw new RuntimeException( + throw new ConvertException( "Can't convert response to CharacterFullResponseDto.class", e); } } diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/DbSynchronizationServiceImpl.java b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/DbSynchronizationServiceImpl.java index 5426dd15..289cf8a5 100644 --- a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/DbSynchronizationServiceImpl.java +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/DbSynchronizationServiceImpl.java @@ -4,31 +4,35 @@ import mate.academy.rickandmorty.dto.external.CharacterFullResponseDto; import mate.academy.rickandmorty.external.api.service.DbSynchronizationService; import mate.academy.rickandmorty.external.api.service.ExternalCharacterService; -import mate.academy.rickandmorty.external.api.service.GetClient; +import mate.academy.rickandmorty.external.api.service.CharacterClient; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class DbSynchronizationServiceImpl implements DbSynchronizationService { - private final GetClient getClient; + private final CharacterClient characterClient; private final ExternalCharacterService externalCharacterService; + @Value("${mate.academy.rickandmorty.api}") + private String RICK_AND_MORTY_API_CHARACTER_URL; + @Override - public void synchronize(String url) { - CharacterFullResponseDto fullResponseDto = getClient.getDtoFromApi(url); + public void synchronize() { + CharacterFullResponseDto fullResponseDto = characterClient.getDtoFromApi(RICK_AND_MORTY_API_CHARACTER_URL); if (fullResponseDto.getResults().isEmpty()) { return; } while (true) { - fullResponseDto.getResults().forEach(externalCharacterService::saveOrUpdate); + externalCharacterService.saveOrUpdate(fullResponseDto.getResults()); - if (fullResponseDto.getInfo().next() == null) { + if (fullResponseDto.getInfo().getNext() == null) { break; } - fullResponseDto = getClient.getDtoFromApi(fullResponseDto.getInfo().next()); + fullResponseDto = characterClient.getDtoFromApi(fullResponseDto.getInfo().getNext()); } } diff --git a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/ExternalCharacterServiceImpl.java b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/ExternalCharacterServiceImpl.java index 14ed1c4d..d5e5f09c 100644 --- a/src/main/java/mate/academy/rickandmorty/external/api/service/impl/ExternalCharacterServiceImpl.java +++ b/src/main/java/mate/academy/rickandmorty/external/api/service/impl/ExternalCharacterServiceImpl.java @@ -1,5 +1,7 @@ package mate.academy.rickandmorty.external.api.service.impl; +import java.util.LinkedList; +import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; import mate.academy.rickandmorty.dto.external.CharacterResponseDto; @@ -16,30 +18,33 @@ public class ExternalCharacterServiceImpl implements ExternalCharacterService { private final CharacterMapper characterMapper; @Override - public void saveOrUpdate(CharacterResponseDto characterResponseDto) { - Optional characterOptional = characterRepository - .findByExternalId(characterResponseDto.externalId()) - .stream() - .findFirst(); + public void saveOrUpdate(List responseDtoList) { + List listToSave = new LinkedList<>(); - if (characterOptional.isEmpty()) { - characterRepository.save( - characterMapper.convertFromResponseDto(characterResponseDto)); - } else { - Character character = characterOptional.get(); + for (CharacterResponseDto responseDto : responseDtoList) { + Optional characterOptional = characterRepository + .findFirstByExternalId(responseDto.getExternalId()); - if (isEqual(characterResponseDto, character)) { - return; - } + if (characterOptional.isEmpty()) { + listToSave.add( + characterMapper.convertFromResponseDto(responseDto)); + } else { + Character character = characterOptional.get(); + if (isEqual(responseDto, character)) { + return; + } - characterMapper.updateCharacterFromResponseDto(characterResponseDto, character); - characterRepository.save(character); + Character updateCharacter = characterMapper.convertFromResponseDto(responseDto); + updateCharacter.setId(character.getId()); + listToSave.add(updateCharacter); + } } + characterRepository.saveAll(listToSave); } private boolean isEqual(CharacterResponseDto characterResponseDto, Character character) { - return characterResponseDto.name().equals(character.getName()) - && characterResponseDto.gender().equals(character.getGender()) - && characterResponseDto.status().equals(character.getStatus()); + return characterResponseDto.getName().equals(character.getName()) + && characterResponseDto.getGender().equals(character.getGender()) + && characterResponseDto.getStatus().equals(character.getStatus()); } } diff --git a/src/main/java/mate/academy/rickandmorty/repository/CharacterRepository.java b/src/main/java/mate/academy/rickandmorty/repository/CharacterRepository.java index 4be63c3e..963a299b 100644 --- a/src/main/java/mate/academy/rickandmorty/repository/CharacterRepository.java +++ b/src/main/java/mate/academy/rickandmorty/repository/CharacterRepository.java @@ -1,6 +1,8 @@ package mate.academy.rickandmorty.repository; import java.util.List; +import java.util.Optional; + import mate.academy.rickandmorty.models.Character; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,10 +11,10 @@ public interface CharacterRepository extends JpaRepository, JpaSpecificationExecutor { - List findByExternalId(String externalId); + Optional findFirstByExternalId(String externalId); List findByNameContaining(Pageable pageable, String name); @Query(value = "SELECT * FROM characters ORDER BY RAND() LIMIT 1", nativeQuery = true) - Character findRandomCharacter(); + Optional findRandomCharacter(); } diff --git a/src/main/java/mate/academy/rickandmorty/service/impl/CharacterServiceImpl.java b/src/main/java/mate/academy/rickandmorty/service/impl/CharacterServiceImpl.java index d431d7b7..fc07a573 100644 --- a/src/main/java/mate/academy/rickandmorty/service/impl/CharacterServiceImpl.java +++ b/src/main/java/mate/academy/rickandmorty/service/impl/CharacterServiceImpl.java @@ -1,6 +1,8 @@ package mate.academy.rickandmorty.service.impl; import java.util.List; +import java.util.NoSuchElementException; + import lombok.RequiredArgsConstructor; import mate.academy.rickandmorty.dto.internal.CharacterDto; import mate.academy.rickandmorty.mapping.CharacterMapper; @@ -25,6 +27,8 @@ public List findByName(Pageable pageable, String name) { @Override public CharacterDto getRandomCharacter() { - return characterMapper.convertToDto(characterRepository.findRandomCharacter()); + return characterMapper.convertToDto( + characterRepository.findRandomCharacter() + .orElseThrow(() -> new NoSuchElementException("Random character not found"))); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 73de097e..d5c41a81 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -6,3 +6,5 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.hibernate.ddl-auto=validate spring.jpa.show-sql=true spring.jpa.open-in-view=false + +mate.academy.rickandmorty.api=https://rickandmortyapi.com/api/character diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index bc2fdde8..2b17e3b9 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -3,3 +3,5 @@ spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=password spring.jpa.database-platform=org.hibernate.dialect.H2Dialect + +mate.academy.rickandmorty.api=https://rickandmortyapi.com/api/character