From 82af4b3bbfb2a7dcb91b46032dc7a8e22e5d2e90 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Mon, 10 May 2021 17:53:55 +0800 Subject: [PATCH] feat(api): mark read progress for series with Tachiyomi format --- .../komga/interfaces/rest/SeriesController.kt | 24 +++++++++++++++++++ .../komga/interfaces/rest/dto/SeriesDto.kt | 5 ++++ 2 files changed, 29 insertions(+) diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesController.kt index 7aa4d1bb2..f1d951788 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesController.kt @@ -35,6 +35,7 @@ import org.gotson.komga.interfaces.rest.dto.BookDto import org.gotson.komga.interfaces.rest.dto.CollectionDto import org.gotson.komga.interfaces.rest.dto.SeriesDto import org.gotson.komga.interfaces.rest.dto.SeriesMetadataUpdateDto +import org.gotson.komga.interfaces.rest.dto.TachiyomiReadProgressUpdateDto import org.gotson.komga.interfaces.rest.dto.restrictUrl import org.gotson.komga.interfaces.rest.dto.toDto import org.gotson.komga.interfaces.rest.persistence.BookDtoRepository @@ -363,6 +364,29 @@ class SeriesController( } } + @PatchMapping("{seriesId}/read-progress/tachiyomi") + @ResponseStatus(HttpStatus.NO_CONTENT) + fun markReadProgress( + @PathVariable seriesId: String, + @Valid @RequestBody readProgress: TachiyomiReadProgressUpdateDto, + @AuthenticationPrincipal principal: KomgaPrincipal + ) { + seriesRepository.getLibraryId(seriesId)?.let { + if (!principal.user.canAccessLibrary(it)) throw ResponseStatusException(HttpStatus.FORBIDDEN) + } ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) + + bookDtoRepository.findAll( + BookSearchWithReadProgress(seriesIds = listOf(seriesId)), + principal.user.id, + UnpagedSorted(Sort.by(Sort.Order.asc("metadata.numberSort"))), + ).forEachIndexed { index, book -> + if (index < readProgress.lastBookRead) + bookLifecycle.markReadProgressCompleted(book.id, principal.user) + else + bookLifecycle.deleteReadProgress(book.id, principal.user) + } + } + @DeleteMapping("{seriesId}/read-progress") @ResponseStatus(HttpStatus.NO_CONTENT) fun markAsUnread( diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/dto/SeriesDto.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/dto/SeriesDto.kt index 3f148d63e..60082917e 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/dto/SeriesDto.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/dto/SeriesDto.kt @@ -3,6 +3,7 @@ package org.gotson.komga.interfaces.rest.dto import com.fasterxml.jackson.annotation.JsonFormat import java.time.LocalDate import java.time.LocalDateTime +import javax.validation.constraints.PositiveOrZero data class SeriesDto( val id: String, @@ -66,3 +67,7 @@ data class BookMetadataAggregationDto( @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val lastModified: LocalDateTime ) + +data class TachiyomiReadProgressUpdateDto( + @get:PositiveOrZero val lastBookRead: Int, +)