diff --git a/src/main/java/com/magamochi/catalog/client/AniListClient.java b/src/main/java/com/magamochi/catalog/client/AniListClient.java index 485b72f..329d5ca 100644 --- a/src/main/java/com/magamochi/catalog/client/AniListClient.java +++ b/src/main/java/com/magamochi/catalog/client/AniListClient.java @@ -57,7 +57,8 @@ public interface AniListClient { List genres, FuzzyDate startDate, FuzzyDate endDate, - StaffConnection staff) { + StaffConnection staff, + Boolean isAdult) { public record Title( String romaji, String english, @JsonProperty("native") String nativeTitle) {} diff --git a/src/main/java/com/magamochi/catalog/client/JikanClient.java b/src/main/java/com/magamochi/catalog/client/JikanClient.java index 2873770..1f202b9 100644 --- a/src/main/java/com/magamochi/catalog/client/JikanClient.java +++ b/src/main/java/com/magamochi/catalog/client/JikanClient.java @@ -47,7 +47,8 @@ public interface JikanClient { Integer chapters, PublishData published, List authors, - List genres) { + List genres, + List explicit_genres) { public record ImageData(ImageUrls jpg) { public record ImageUrls(String large_image_url) {} } @@ -57,6 +58,8 @@ public interface JikanClient { public record AuthorData(Long mal_id, String name) {} public record GenreData(Long mal_id, String name) {} + + public record ExplicitGenreData(Long mal_id, String name) {} } } } diff --git a/src/main/java/com/magamochi/catalog/model/dto/MangaDTO.java b/src/main/java/com/magamochi/catalog/model/dto/MangaDTO.java index 091186a..61424fc 100644 --- a/src/main/java/com/magamochi/catalog/model/dto/MangaDTO.java +++ b/src/main/java/com/magamochi/catalog/model/dto/MangaDTO.java @@ -28,7 +28,8 @@ public record MangaDTO( @NotNull List providers, @NotNull Integer chapterCount, @NotNull Boolean favorite, - @NotNull Boolean following) { + @NotNull Boolean following, + @NotNull Boolean adult) { public static MangaDTO from(Manga manga, Boolean favorite, Boolean following) { return new MangaDTO( manga.getId(), @@ -48,7 +49,8 @@ public record MangaDTO( manga.getMangaContentProviders().stream().map(MangaProviderDTO::from).toList(), manga.getChapterCount(), favorite, - following); + following, + manga.getAdult()); } public record MangaProviderDTO( diff --git a/src/main/java/com/magamochi/catalog/model/dto/MangaDataDTO.java b/src/main/java/com/magamochi/catalog/model/dto/MangaDataDTO.java index b8c7663..3685056 100644 --- a/src/main/java/com/magamochi/catalog/model/dto/MangaDataDTO.java +++ b/src/main/java/com/magamochi/catalog/model/dto/MangaDataDTO.java @@ -14,6 +14,7 @@ public record MangaDataDTO( OffsetDateTime publishedFrom, OffsetDateTime publishedTo, Integer chapterCount, + Boolean adult, List authors, List genres, List alternativeTitles, diff --git a/src/main/java/com/magamochi/catalog/model/dto/MangaListDTO.java b/src/main/java/com/magamochi/catalog/model/dto/MangaListDTO.java index 15943e1..be59d6a 100644 --- a/src/main/java/com/magamochi/catalog/model/dto/MangaListDTO.java +++ b/src/main/java/com/magamochi/catalog/model/dto/MangaListDTO.java @@ -20,7 +20,8 @@ public record MangaListDTO( @NotNull List genres, @NotNull List authors, @NotNull Double score, - @NotNull Boolean favorite) { + @NotNull Boolean favorite, + @NotNull Boolean adult) { public static MangaListDTO from(Manga manga, boolean favorite) { return new MangaListDTO( manga.getId(), @@ -35,6 +36,7 @@ public record MangaListDTO( .map(mangaAuthor -> mangaAuthor.getAuthor().getName()) .toList(), manga.getScore(), - favorite); + favorite, + manga.getAdult()); } } diff --git a/src/main/java/com/magamochi/catalog/model/dto/MangaListFilterDTO.java b/src/main/java/com/magamochi/catalog/model/dto/MangaListFilterDTO.java index c92bdb6..aea5d7f 100644 --- a/src/main/java/com/magamochi/catalog/model/dto/MangaListFilterDTO.java +++ b/src/main/java/com/magamochi/catalog/model/dto/MangaListFilterDTO.java @@ -7,4 +7,5 @@ public record MangaListFilterDTO( List genreIds, List statuses, Boolean userFavorites, - Double score) {} + Double score, + Boolean adult) {} diff --git a/src/main/java/com/magamochi/catalog/model/entity/Manga.java b/src/main/java/com/magamochi/catalog/model/entity/Manga.java index f9341d8..6325df3 100644 --- a/src/main/java/com/magamochi/catalog/model/entity/Manga.java +++ b/src/main/java/com/magamochi/catalog/model/entity/Manga.java @@ -53,6 +53,8 @@ public class Manga { @Builder.Default private Integer chapterCount = 0; + @Builder.Default private Boolean adult = false; + @Builder.Default private Boolean follow = false; @Enumerated(EnumType.STRING) @@ -71,8 +73,6 @@ public class Manga { @Builder.Default private List mangaGenres = new ArrayList<>(); - ; - @OneToMany(mappedBy = "manga", cascade = CascadeType.ALL, orphanRemoval = true) @Builder.Default private List alternativeTitles = new ArrayList<>(); diff --git a/src/main/java/com/magamochi/catalog/service/AniListService.java b/src/main/java/com/magamochi/catalog/service/AniListService.java index d885d37..d00cc4d 100644 --- a/src/main/java/com/magamochi/catalog/service/AniListService.java +++ b/src/main/java/com/magamochi/catalog/service/AniListService.java @@ -90,6 +90,7 @@ public class AniListService { ? media.coverImage().extraLarge() : media.coverImage().large()) .status(mapStatus(media.status())) + .adult(nonNull(media.isAdult()) ? media.isAdult() : false) .build(); } @@ -111,6 +112,7 @@ public class AniListService { chapters coverImage { large, extraLarge } genres + isAdult staff { edges { role diff --git a/src/main/java/com/magamochi/catalog/service/MangaUpdateService.java b/src/main/java/com/magamochi/catalog/service/MangaUpdateService.java index 263bfd5..a51203e 100644 --- a/src/main/java/com/magamochi/catalog/service/MangaUpdateService.java +++ b/src/main/java/com/magamochi/catalog/service/MangaUpdateService.java @@ -130,6 +130,7 @@ public class MangaUpdateService { manga.setPublishedFrom(mangaData.publishedFrom()); manga.setPublishedTo(mangaData.publishedTo()); manga.setChapterCount(mangaData.chapterCount()); + manga.setAdult(mangaData.adult()); manga.setState(MangaState.AVAILABLE); manga.updateAlternativeTitles(alternativeTitles); manga.updateGenres(genres); diff --git a/src/main/java/com/magamochi/catalog/service/MyAnimeListService.java b/src/main/java/com/magamochi/catalog/service/MyAnimeListService.java index 6396d0b..57fa33e 100644 --- a/src/main/java/com/magamochi/catalog/service/MyAnimeListService.java +++ b/src/main/java/com/magamochi/catalog/service/MyAnimeListService.java @@ -73,6 +73,7 @@ public class MyAnimeListService { .alternativeTitles(alternativeTitles) .coverImageUrl(responseData.images().jpg().large_image_url()) .status(mapStatus(responseData.status())) + .adult(nonNull(responseData.explicit_genres()) && !responseData.explicit_genres().isEmpty()) .build(); } diff --git a/src/main/java/com/magamochi/common/config/GitInfoLogger.java b/src/main/java/com/magamochi/common/config/GitInfoLogger.java index 8d8b41d..736b073 100644 --- a/src/main/java/com/magamochi/common/config/GitInfoLogger.java +++ b/src/main/java/com/magamochi/common/config/GitInfoLogger.java @@ -1,6 +1,5 @@ package com.magamochi.common.config; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.boot.info.GitProperties; @@ -9,16 +8,23 @@ import org.springframework.stereotype.Component; @Slf4j @Component -@RequiredArgsConstructor public class GitInfoLogger { private final GitProperties gitProperties; + public GitInfoLogger(GitProperties gitProperties) { + this.gitProperties = gitProperties; + } + @EventListener(ApplicationStartedEvent.class) public void logGitInfo() { - log.info( - "Git Info :: commit {} ({}) :: built at {}", - gitProperties.getShortCommitId(), - gitProperties.getBranch(), - gitProperties.getCommitTime()); + if (gitProperties != null) { + log.info( + "Git Info :: commit {} ({}) :: built at {}", + gitProperties.getShortCommitId(), + gitProperties.getBranch(), + gitProperties.getCommitTime()); + } else { + log.info("Git Info :: not available"); + } } } diff --git a/src/main/java/com/magamochi/model/specification/MangaSpecification.java b/src/main/java/com/magamochi/model/specification/MangaSpecification.java index 6ade1e1..8ad2c7c 100644 --- a/src/main/java/com/magamochi/model/specification/MangaSpecification.java +++ b/src/main/java/com/magamochi/model/specification/MangaSpecification.java @@ -1,5 +1,6 @@ package com.magamochi.model.specification; +import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import com.magamochi.catalog.model.dto.MangaListFilterDTO; @@ -63,6 +64,10 @@ public class MangaSpecification { predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("score"), filterDTO.score())); } + if (isNull(filterDTO.adult()) || !filterDTO.adult()) { + predicates.add(criteriaBuilder.equal(root.get("adult"), false)); + } + query.distinct(true); return criteriaBuilder.and(predicates.toArray(Predicate[]::new)); diff --git a/src/main/resources/db/migration/V0010__ADD_ADULT_COLUMN_TO_MANGAS.sql b/src/main/resources/db/migration/V0010__ADD_ADULT_COLUMN_TO_MANGAS.sql new file mode 100644 index 0000000..e7d505c --- /dev/null +++ b/src/main/resources/db/migration/V0010__ADD_ADULT_COLUMN_TO_MANGAS.sql @@ -0,0 +1,2 @@ +ALTER TABLE mangas + ADD COLUMN adult BOOLEAN NOT NULL DEFAULT FALSE;