diff --git a/src/main/java/com/magamochi/controller/GenreController.java b/src/main/java/com/magamochi/catalog/controller/GenreController.java similarity index 82% rename from src/main/java/com/magamochi/controller/GenreController.java rename to src/main/java/com/magamochi/catalog/controller/GenreController.java index 31e34b7..fbf262a 100644 --- a/src/main/java/com/magamochi/controller/GenreController.java +++ b/src/main/java/com/magamochi/catalog/controller/GenreController.java @@ -1,8 +1,8 @@ -package com.magamochi.controller; +package com.magamochi.catalog.controller; +import com.magamochi.catalog.model.dto.GenreDTO; +import com.magamochi.catalog.service.GenreService; import com.magamochi.model.dto.DefaultResponseDTO; -import com.magamochi.model.dto.GenreDTO; -import com.magamochi.service.GenreService; import io.swagger.v3.oas.annotations.Operation; import java.util.List; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/magamochi/model/dto/GenreDTO.java b/src/main/java/com/magamochi/catalog/model/dto/GenreDTO.java similarity index 75% rename from src/main/java/com/magamochi/model/dto/GenreDTO.java rename to src/main/java/com/magamochi/catalog/model/dto/GenreDTO.java index 1283415..94151c6 100644 --- a/src/main/java/com/magamochi/model/dto/GenreDTO.java +++ b/src/main/java/com/magamochi/catalog/model/dto/GenreDTO.java @@ -1,6 +1,6 @@ -package com.magamochi.model.dto; +package com.magamochi.catalog.model.dto; -import com.magamochi.model.entity.Genre; +import com.magamochi.catalog.model.entity.Genre; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/com/magamochi/model/entity/Author.java b/src/main/java/com/magamochi/catalog/model/entity/Author.java similarity index 79% rename from src/main/java/com/magamochi/model/entity/Author.java rename to src/main/java/com/magamochi/catalog/model/entity/Author.java index 22a2430..2558f1e 100644 --- a/src/main/java/com/magamochi/model/entity/Author.java +++ b/src/main/java/com/magamochi/catalog/model/entity/Author.java @@ -1,8 +1,7 @@ -package com.magamochi.model.entity; +package com.magamochi.catalog.model.entity; import jakarta.persistence.*; import java.time.Instant; -import java.util.List; import lombok.*; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; @@ -26,7 +25,4 @@ public class Author { @CreationTimestamp private Instant createdAt; @UpdateTimestamp private Instant updatedAt; - - @OneToMany(mappedBy = "author") - private List mangaAuthors; } diff --git a/src/main/java/com/magamochi/model/entity/Genre.java b/src/main/java/com/magamochi/catalog/model/entity/Genre.java similarity index 68% rename from src/main/java/com/magamochi/model/entity/Genre.java rename to src/main/java/com/magamochi/catalog/model/entity/Genre.java index a78e748..5fbb7cf 100644 --- a/src/main/java/com/magamochi/model/entity/Genre.java +++ b/src/main/java/com/magamochi/catalog/model/entity/Genre.java @@ -1,7 +1,6 @@ -package com.magamochi.model.entity; +package com.magamochi.catalog.model.entity; import jakarta.persistence.*; -import java.util.List; import lombok.*; @Entity @@ -19,7 +18,4 @@ public class Genre { private Long malId; private String name; - - @OneToMany(mappedBy = "genre") - private List mangaGenres; } diff --git a/src/main/java/com/magamochi/model/entity/MangaAuthor.java b/src/main/java/com/magamochi/catalog/model/entity/MangaAuthor.java similarity index 59% rename from src/main/java/com/magamochi/model/entity/MangaAuthor.java rename to src/main/java/com/magamochi/catalog/model/entity/MangaAuthor.java index 0e3468e..8f35326 100644 --- a/src/main/java/com/magamochi/model/entity/MangaAuthor.java +++ b/src/main/java/com/magamochi/catalog/model/entity/MangaAuthor.java @@ -1,4 +1,4 @@ -package com.magamochi.model.entity; +package com.magamochi.catalog.model.entity; import jakarta.persistence.*; import lombok.*; @@ -15,11 +15,7 @@ public class MangaAuthor { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne - @JoinColumn(name = "manga_id") - private Manga manga; + private Long mangaId; - @ManyToOne - @JoinColumn(name = "author_id") - private Author author; + private Long authorId; } diff --git a/src/main/java/com/magamochi/model/entity/MangaGenre.java b/src/main/java/com/magamochi/catalog/model/entity/MangaGenre.java similarity index 59% rename from src/main/java/com/magamochi/model/entity/MangaGenre.java rename to src/main/java/com/magamochi/catalog/model/entity/MangaGenre.java index 7c0df2e..3c082c2 100644 --- a/src/main/java/com/magamochi/model/entity/MangaGenre.java +++ b/src/main/java/com/magamochi/catalog/model/entity/MangaGenre.java @@ -1,4 +1,4 @@ -package com.magamochi.model.entity; +package com.magamochi.catalog.model.entity; import jakarta.persistence.*; import lombok.*; @@ -15,11 +15,7 @@ public class MangaGenre { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne - @JoinColumn(name = "manga_id") - private Manga manga; + private Long mangaId; - @ManyToOne - @JoinColumn(name = "genre_id") - private Genre genre; + private Long genreId; } diff --git a/src/main/java/com/magamochi/model/repository/AuthorRepository.java b/src/main/java/com/magamochi/catalog/model/repository/AuthorRepository.java similarity index 59% rename from src/main/java/com/magamochi/model/repository/AuthorRepository.java rename to src/main/java/com/magamochi/catalog/model/repository/AuthorRepository.java index 52e4465..7cb206c 100644 --- a/src/main/java/com/magamochi/model/repository/AuthorRepository.java +++ b/src/main/java/com/magamochi/catalog/model/repository/AuthorRepository.java @@ -1,11 +1,11 @@ -package com.magamochi.model.repository; +package com.magamochi.catalog.model.repository; -import com.magamochi.model.entity.Author; +import com.magamochi.catalog.model.entity.Author; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface AuthorRepository extends JpaRepository { - Optional findByMalId(Long aLong); + Optional findByMalId(Long malId); Optional findByName(String name); } diff --git a/src/main/java/com/magamochi/model/repository/GenreRepository.java b/src/main/java/com/magamochi/catalog/model/repository/GenreRepository.java similarity index 72% rename from src/main/java/com/magamochi/model/repository/GenreRepository.java rename to src/main/java/com/magamochi/catalog/model/repository/GenreRepository.java index 3acbe30..165c9fb 100644 --- a/src/main/java/com/magamochi/model/repository/GenreRepository.java +++ b/src/main/java/com/magamochi/catalog/model/repository/GenreRepository.java @@ -1,6 +1,6 @@ -package com.magamochi.model.repository; +package com.magamochi.catalog.model.repository; -import com.magamochi.model.entity.Genre; +import com.magamochi.catalog.model.entity.Genre; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/magamochi/catalog/model/repository/MangaAuthorRepository.java b/src/main/java/com/magamochi/catalog/model/repository/MangaAuthorRepository.java new file mode 100644 index 0000000..dbea084 --- /dev/null +++ b/src/main/java/com/magamochi/catalog/model/repository/MangaAuthorRepository.java @@ -0,0 +1,11 @@ +package com.magamochi.catalog.model.repository; + +import com.magamochi.catalog.model.entity.MangaAuthor; +import java.util.Set; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MangaAuthorRepository extends JpaRepository { + void deleteAllByMangaId(Long mangaId); + + Set findAllByMangaId(Long mangaId); +} diff --git a/src/main/java/com/magamochi/catalog/model/repository/MangaGenreRepository.java b/src/main/java/com/magamochi/catalog/model/repository/MangaGenreRepository.java new file mode 100644 index 0000000..05c1bbf --- /dev/null +++ b/src/main/java/com/magamochi/catalog/model/repository/MangaGenreRepository.java @@ -0,0 +1,11 @@ +package com.magamochi.catalog.model.repository; + +import com.magamochi.catalog.model.entity.MangaGenre; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MangaGenreRepository extends JpaRepository { + void deleteAllByMangaId(Long mangaId); + + List findAllByMangaId(Long mangaId); +} diff --git a/src/main/java/com/magamochi/catalog/service/AuthorService.java b/src/main/java/com/magamochi/catalog/service/AuthorService.java new file mode 100644 index 0000000..158c46f --- /dev/null +++ b/src/main/java/com/magamochi/catalog/service/AuthorService.java @@ -0,0 +1,29 @@ +package com.magamochi.catalog.service; + +import com.magamochi.catalog.model.entity.Author; +import com.magamochi.catalog.model.repository.AuthorRepository; +import java.util.List; +import java.util.Set; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AuthorService { + private final AuthorRepository authorRepository; + + public Long findOrCreateAuthor(Long malAuthorId, String authorName) { + return authorRepository + .findByName(authorName) + .orElseGet( + () -> + authorRepository.save(Author.builder().malId(malAuthorId).name(authorName).build())) + .getId(); + } + + public List getAuthorNamesByIds(Set genreIds) { + var genres = authorRepository.findAllById(genreIds); + + return genres.stream().map(Author::getName).toList(); + } +} diff --git a/src/main/java/com/magamochi/catalog/service/GenreService.java b/src/main/java/com/magamochi/catalog/service/GenreService.java new file mode 100644 index 0000000..3923623 --- /dev/null +++ b/src/main/java/com/magamochi/catalog/service/GenreService.java @@ -0,0 +1,35 @@ +package com.magamochi.catalog.service; + +import com.magamochi.catalog.model.dto.GenreDTO; +import com.magamochi.catalog.model.entity.Genre; +import com.magamochi.catalog.model.repository.GenreRepository; +import java.util.List; +import java.util.Set; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class GenreService { + private final GenreRepository genreRepository; + + public Long findOrCreateGenre(Long malGenreId, String genreName) { + return genreRepository + .findByName(genreName) + .orElseGet( + () -> genreRepository.save(Genre.builder().malId(malGenreId).name(genreName).build())) + .getId(); + } + + public List getGenreNamesByIds(Set genreIds) { + var genres = genreRepository.findAllById(genreIds); + + return genres.stream().map(Genre::getName).toList(); + } + + public List getGenres() { + var genres = genreRepository.findAll(); + + return genres.stream().map(GenreDTO::from).toList(); + } +} diff --git a/src/main/java/com/magamochi/catalog/service/MangaAuthorService.java b/src/main/java/com/magamochi/catalog/service/MangaAuthorService.java new file mode 100644 index 0000000..c0f2040 --- /dev/null +++ b/src/main/java/com/magamochi/catalog/service/MangaAuthorService.java @@ -0,0 +1,34 @@ +package com.magamochi.catalog.service; + +import com.magamochi.catalog.model.entity.MangaAuthor; +import com.magamochi.catalog.model.repository.MangaAuthorRepository; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MangaAuthorService { + private final AuthorService authorService; + private final MangaAuthorRepository mangaAuthorRepository; + + public void saveOrUpdateMangaAuthors(Long mangaId, Set authorIds) { + mangaAuthorRepository.deleteAllByMangaId(mangaId); + + authorIds.forEach( + authorId -> + mangaAuthorRepository.save( + MangaAuthor.builder().mangaId(mangaId).authorId(authorId).build())); + } + + public List getMangaAuthors(Long mangaId) { + var mangaAuthorIds = + mangaAuthorRepository.findAllByMangaId(mangaId).stream() + .map(MangaAuthor::getAuthorId) + .collect(Collectors.toSet()); + + return authorService.getAuthorNamesByIds(mangaAuthorIds); + } +} diff --git a/src/main/java/com/magamochi/catalog/service/MangaGenreService.java b/src/main/java/com/magamochi/catalog/service/MangaGenreService.java new file mode 100644 index 0000000..b2043f6 --- /dev/null +++ b/src/main/java/com/magamochi/catalog/service/MangaGenreService.java @@ -0,0 +1,34 @@ +package com.magamochi.catalog.service; + +import com.magamochi.catalog.model.entity.MangaGenre; +import com.magamochi.catalog.model.repository.MangaGenreRepository; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MangaGenreService { + private final GenreService genreService; + private final MangaGenreRepository mangaGenreRepository; + + public void saveOrUpdateMangaGenres(Long mangaId, Set genreIds) { + mangaGenreRepository.deleteAllByMangaId(mangaId); + + genreIds.forEach( + genreId -> + mangaGenreRepository.save( + MangaGenre.builder().mangaId(mangaId).genreId(genreId).build())); + } + + public List getMangaGenres(Long mangaId) { + var mangaGenreIds = + mangaGenreRepository.findAllByMangaId(mangaId).stream() + .map(MangaGenre::getGenreId) + .collect(Collectors.toSet()); + + return genreService.getGenreNamesByIds(mangaGenreIds); + } +} diff --git a/src/main/java/com/magamochi/model/dto/MangaDTO.java b/src/main/java/com/magamochi/model/dto/MangaDTO.java index dd5301b..f53d704 100644 --- a/src/main/java/com/magamochi/model/dto/MangaDTO.java +++ b/src/main/java/com/magamochi/model/dto/MangaDTO.java @@ -29,7 +29,8 @@ public record MangaDTO( @NotNull Integer chapterCount, @NotNull Boolean favorite, @NotNull Boolean following) { - public static MangaDTO from(Manga manga, Boolean favorite, Boolean following) { + public static MangaDTO from( + Manga manga, Boolean favorite, Boolean following, List genres, List authors) { return new MangaDTO( manga.getId(), manga.getTitle(), @@ -40,10 +41,8 @@ public record MangaDTO( manga.getSynopsis(), manga.getMangaProviders().size(), manga.getAlternativeTitles().stream().map(MangaAlternativeTitle::getTitle).toList(), - manga.getMangaGenres().stream().map(mangaGenre -> mangaGenre.getGenre().getName()).toList(), - manga.getMangaAuthors().stream() - .map(mangaAuthor -> mangaAuthor.getAuthor().getName()) - .toList(), + genres, + authors, manga.getScore(), manga.getMangaProviders().stream().map(MangaProviderDTO::from).toList(), manga.getChapterCount(), diff --git a/src/main/java/com/magamochi/model/dto/MangaListDTO.java b/src/main/java/com/magamochi/model/dto/MangaListDTO.java index bd08320..67767db 100644 --- a/src/main/java/com/magamochi/model/dto/MangaListDTO.java +++ b/src/main/java/com/magamochi/model/dto/MangaListDTO.java @@ -20,7 +20,8 @@ public record MangaListDTO( @NotNull List authors, @NotNull Double score, @NotNull Boolean favorite) { - public static MangaListDTO from(Manga manga, boolean favorite) { + public static MangaListDTO from( + Manga manga, boolean favorite, List genres, List authors) { return new MangaListDTO( manga.getId(), manga.getTitle(), @@ -29,10 +30,8 @@ public record MangaListDTO( manga.getPublishedFrom(), manga.getPublishedTo(), manga.getMangaProviders().size(), - manga.getMangaGenres().stream().map(mangaGenre -> mangaGenre.getGenre().getName()).toList(), - manga.getMangaAuthors().stream() - .map(mangaAuthor -> mangaAuthor.getAuthor().getName()) - .toList(), + genres, + authors, manga.getScore(), favorite); } diff --git a/src/main/java/com/magamochi/model/entity/Manga.java b/src/main/java/com/magamochi/model/entity/Manga.java index 37967e5..5b21568 100644 --- a/src/main/java/com/magamochi/model/entity/Manga.java +++ b/src/main/java/com/magamochi/model/entity/Manga.java @@ -47,12 +47,6 @@ public class Manga { private OffsetDateTime publishedTo; - @OneToMany(mappedBy = "manga") - private List mangaAuthors; - - @OneToMany(mappedBy = "manga") - private List mangaGenres; - @OneToMany(mappedBy = "manga") private List alternativeTitles; diff --git a/src/main/java/com/magamochi/model/repository/MangaAuthorRepository.java b/src/main/java/com/magamochi/model/repository/MangaAuthorRepository.java deleted file mode 100644 index 78a4833..0000000 --- a/src/main/java/com/magamochi/model/repository/MangaAuthorRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.magamochi.model.repository; - -import com.magamochi.model.entity.Author; -import com.magamochi.model.entity.Manga; -import com.magamochi.model.entity.MangaAuthor; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MangaAuthorRepository extends JpaRepository { - Optional findByMangaAndAuthor(Manga manga, Author author); -} diff --git a/src/main/java/com/magamochi/model/repository/MangaGenreRepository.java b/src/main/java/com/magamochi/model/repository/MangaGenreRepository.java deleted file mode 100644 index c0843b9..0000000 --- a/src/main/java/com/magamochi/model/repository/MangaGenreRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.magamochi.model.repository; - -import com.magamochi.model.entity.Genre; -import com.magamochi.model.entity.Manga; -import com.magamochi.model.entity.MangaGenre; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MangaGenreRepository extends JpaRepository { - Optional findByMangaAndGenre(Manga manga, Genre genre); -} diff --git a/src/main/java/com/magamochi/model/specification/MangaSpecification.java b/src/main/java/com/magamochi/model/specification/MangaSpecification.java index 82e9fea..8bc4d0d 100644 --- a/src/main/java/com/magamochi/model/specification/MangaSpecification.java +++ b/src/main/java/com/magamochi/model/specification/MangaSpecification.java @@ -2,8 +2,8 @@ package com.magamochi.model.specification; import static java.util.Objects.nonNull; +import com.magamochi.catalog.model.entity.Author; import com.magamochi.model.dto.MangaListFilterDTO; -import com.magamochi.model.entity.Author; import com.magamochi.model.entity.Manga; import com.magamochi.user.model.entity.User; import jakarta.persistence.criteria.*; diff --git a/src/main/java/com/magamochi/service/GenreService.java b/src/main/java/com/magamochi/service/GenreService.java deleted file mode 100644 index e18f4ef..0000000 --- a/src/main/java/com/magamochi/service/GenreService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.magamochi.service; - -import com.magamochi.model.dto.GenreDTO; -import com.magamochi.model.repository.GenreRepository; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class GenreService { - private final GenreRepository genreRepository; - - public List getGenres() { - var genres = genreRepository.findAll(); - - return genres.stream().map(GenreDTO::from).toList(); - } -} diff --git a/src/main/java/com/magamochi/service/MangaImportService.java b/src/main/java/com/magamochi/service/MangaImportService.java index 4c97653..2319e46 100644 --- a/src/main/java/com/magamochi/service/MangaImportService.java +++ b/src/main/java/com/magamochi/service/MangaImportService.java @@ -4,6 +4,10 @@ import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import com.google.common.util.concurrent.RateLimiter; +import com.magamochi.catalog.service.AuthorService; +import com.magamochi.catalog.service.GenreService; +import com.magamochi.catalog.service.MangaAuthorService; +import com.magamochi.catalog.service.MangaGenreService; import com.magamochi.client.AniListClient; import com.magamochi.client.JikanClient; import com.magamochi.exception.NotFoundException; @@ -20,6 +24,7 @@ import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -38,11 +43,13 @@ public class MangaImportService { private final ImageService imageService; private final LanguageService languageService; - private final GenreRepository genreRepository; - private final MangaGenreRepository mangaGenreRepository; + private final GenreService genreService; + private final MangaGenreService mangaGenreService; + + private final AuthorService authorService; + private final MangaAuthorService mangaAuthorService; + private final MangaProviderRepository mangaProviderRepository; - private final AuthorRepository authorRepository; - private final MangaAuthorRepository mangaAuthorRepository; private final MangaChapterRepository mangaChapterRepository; private final MangaRepository mangaRepository; @@ -177,39 +184,21 @@ public class MangaImportService { manga.setPublishedTo(mangaData.data().published().to()); manga.setChapterCount(mangaData.data().chapters()); - var authors = + var authorIds = mangaData.data().authors().stream() .map( authorData -> - authorRepository - .findByMalId(authorData.mal_id()) - .orElseGet( - () -> - authorRepository.save( - Author.builder() - .malId(authorData.mal_id()) - .name(authorData.name()) - .build()))) - .toList(); + authorService.findOrCreateAuthor(authorData.mal_id(), authorData.name())) + .collect(Collectors.toSet()); - updateMangaAuthors(manga, authors); + mangaAuthorService.saveOrUpdateMangaAuthors(manga.getId(), authorIds); - var genres = + var genreIds = mangaData.data().genres().stream() - .map( - genreData -> - genreRepository - .findByMalId(genreData.mal_id()) - .orElseGet( - () -> - genreRepository.save( - Genre.builder() - .malId(genreData.mal_id()) - .name(genreData.name()) - .build()))) - .toList(); + .map(genreData -> genreService.findOrCreateGenre(genreData.mal_id(), genreData.name())) + .collect(Collectors.toSet()); - updateMangaGenres(manga, genres); + mangaGenreService.saveOrUpdateMangaGenres(manga.getId(), genreIds); if (isNull(manga.getCoverImage())) { downloadCoverImage(manga, mangaData.data().images().jpg().large_image_url()); @@ -261,31 +250,22 @@ public class MangaImportService { manga.setPublishedTo(convertFuzzyDate(media.endDate())); manga.setChapterCount(media.chapters()); - var authors = + var authorIds = media.staff().edges().stream() .filter(edge -> isAuthorRole(edge.role())) .map(edge -> edge.node().name().full()) .distinct() - .map( - name -> - authorRepository - .findByName(name) - .orElseGet( - () -> authorRepository.save(Author.builder().name(name).build()))) - .toList(); + .map(name -> authorService.findOrCreateAuthor(null, name)) + .collect(Collectors.toSet()); - updateMangaAuthors(manga, authors); + mangaAuthorService.saveOrUpdateMangaAuthors(manga.getId(), authorIds); - var genres = + var genreIds = media.genres().stream() - .map( - name -> - genreRepository - .findByName(name) - .orElseGet(() -> genreRepository.save(Genre.builder().name(name).build()))) - .toList(); + .map(name -> genreService.findOrCreateGenre(null, name)) + .collect(Collectors.toSet()); - updateMangaGenres(manga, genres); + mangaGenreService.saveOrUpdateMangaGenres(manga.getId(), genreIds); if (isNull(manga.getCoverImage())) { downloadCoverImage(manga, media.coverImage().large()); @@ -324,36 +304,6 @@ public class MangaImportService { ZoneOffset.UTC); } - private void updateMangaAuthors(Manga manga, List authors) { - var mangaAuthors = - authors.stream() - .map( - author -> - mangaAuthorRepository - .findByMangaAndAuthor(manga, author) - .orElseGet( - () -> - mangaAuthorRepository.save( - MangaAuthor.builder().manga(manga).author(author).build()))) - .toList(); - manga.setMangaAuthors(mangaAuthors); - } - - private void updateMangaGenres(Manga manga, List genres) { - var mangaGenres = - genres.stream() - .map( - genre -> - mangaGenreRepository - .findByMangaAndGenre(manga, genre) - .orElseGet( - () -> - mangaGenreRepository.save( - MangaGenre.builder().manga(manga).genre(genre).build()))) - .toList(); - manga.setMangaGenres(mangaGenres); - } - private void downloadCoverImage(Manga manga, String imageUrl) throws IOException, URISyntaxException { var inputStream = diff --git a/src/main/java/com/magamochi/service/MangaService.java b/src/main/java/com/magamochi/service/MangaService.java index 18f38f6..37e1ff3 100644 --- a/src/main/java/com/magamochi/service/MangaService.java +++ b/src/main/java/com/magamochi/service/MangaService.java @@ -2,6 +2,8 @@ package com.magamochi.service; import static java.util.Objects.nonNull; +import com.magamochi.catalog.service.MangaAuthorService; +import com.magamochi.catalog.service.MangaGenreService; import com.magamochi.client.NtfyClient; import com.magamochi.exception.NotFoundException; import com.magamochi.model.dto.*; @@ -35,6 +37,9 @@ public class MangaService { private final MangaRepository mangaRepository; private final MangaProviderRepository mangaProviderRepository; + private final MangaGenreService mangaGenreService; + private final MangaAuthorService mangaAuthorService; + private final ContentProviderFactory contentProviderFactory; private final MangaChapterDownloadProducer mangaChapterDownloadProducer; @@ -73,8 +78,10 @@ public class MangaService { .findAll(specification, pageable) .map( manga -> { + var genres = mangaGenreService.getMangaGenres(manga.getId()); + var authors = mangaAuthorService.getMangaAuthors(manga.getId()); var favorite = favoriteMangasIds.contains(manga.getId()); - return MangaListDTO.from(manga, favorite); + return MangaListDTO.from(manga, favorite, genres, authors); }); } @@ -97,10 +104,15 @@ public class MangaService { var followingMangaIds = nonNull(user) ? userFollowMangaService.getFollowedMangaIdsForLoggedUser() : Set.of(); + var genres = mangaGenreService.getMangaGenres(manga.getId()); + var authors = mangaAuthorService.getMangaAuthors(manga.getId()); + return MangaDTO.from( manga, favoriteMangasIds.contains(manga.getId()), - followingMangaIds.contains(manga.getId())); + followingMangaIds.contains(manga.getId()), + genres, + authors); } public void fetchFollowedMangaChapters(Long mangaProviderId) {