feat: add previous and next chapter IDs to MangaChapterImagesDTO and update retrieval logic #10

Merged
rov merged 1 commits from feature/chapter-navigation into main 2025-11-04 15:30:42 -03:00
3 changed files with 28 additions and 5 deletions

View File

@ -10,11 +10,15 @@ import java.util.List;
public record MangaChapterImagesDTO(
@NotNull Long id,
@NotBlank String mangaTitle,
Long previousChapterId,
Long nextChapterId,
@NotNull List<@NotBlank String> chapterImageKeys) {
public static MangaChapterImagesDTO from(MangaChapter mangaChapter) {
public static MangaChapterImagesDTO from(MangaChapter mangaChapter, Long prevId, Long nextId) {
return new MangaChapterImagesDTO(
mangaChapter.getId(),
mangaChapter.getTitle(),
prevId,
nextId,
mangaChapter.getMangaChapterImages().stream()
.sorted(Comparator.comparing(MangaChapterImage::getPosition))
.map(mangaChapterImage -> mangaChapterImage.getImage().getFileKey())

View File

@ -99,7 +99,26 @@ public class MangaChapterService {
public MangaChapterImagesDTO getMangaChapterImages(Long chapterId) {
var chapter = getMangaChapterThrowIfNotFound(chapterId);
return MangaChapterImagesDTO.from(chapter);
var chapters = chapter.getMangaProvider().getMangaChapters();
Long prevId = null;
Long nextId = null;
// TODO: this doesn't perform well for large datasets
for (var i = 0; i < chapters.size(); i++) {
if (chapters.get(i).getId().equals(chapterId)) {
if (i > 0) {
prevId = chapters.get(i - 1).getId();
}
if (i < chapters.size() - 1) {
nextId = chapters.get(i + 1).getId();
}
break;
}
}
return MangaChapterImagesDTO.from(chapter, prevId, nextId);
}
public void markAsRead(Long chapterId) {

View File

@ -31,9 +31,9 @@ public class JwtUtil {
return extractClaim(token, Claims::getSubject, getAccessSigningKey());
}
public String extractUsernameFromRefreshToken(String token) {
return extractClaim(token, Claims::getSubject, getRefreshSigningKey());
}
public String extractUsernameFromRefreshToken(String token) {
return extractClaim(token, Claims::getSubject, getRefreshSigningKey());
}
public String generateAccessToken(UserDetails userDetails) {
Map<String, Object> claims = new HashMap<>();