mirror of
https://github.com/gotson/komga.git
synced 2026-04-16 03:50:54 +02:00
fix(api): return created thumbnail
This commit is contained in:
parent
6449f2247d
commit
dd1ffbe54a
8 changed files with 24 additions and 22 deletions
|
|
@ -107,7 +107,7 @@ class BookLifecycle(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addThumbnailForBook(thumbnail: ThumbnailBook, markSelected: MarkSelectedPreference) {
|
fun addThumbnailForBook(thumbnail: ThumbnailBook, markSelected: MarkSelectedPreference): ThumbnailBook {
|
||||||
when (thumbnail.type) {
|
when (thumbnail.type) {
|
||||||
ThumbnailBook.Type.GENERATED -> {
|
ThumbnailBook.Type.GENERATED -> {
|
||||||
// only one generated thumbnail is allowed
|
// only one generated thumbnail is allowed
|
||||||
|
|
@ -140,7 +140,9 @@ class BookLifecycle(
|
||||||
if (selected) thumbnailBookRepository.markSelected(thumbnail)
|
if (selected) thumbnailBookRepository.markSelected(thumbnail)
|
||||||
else thumbnailsHouseKeeping(thumbnail.bookId)
|
else thumbnailsHouseKeeping(thumbnail.bookId)
|
||||||
|
|
||||||
eventPublisher.publishEvent(DomainEvent.ThumbnailBookAdded(thumbnail.copy(selected = selected)))
|
val newThumbnail = thumbnail.copy(selected = selected)
|
||||||
|
eventPublisher.publishEvent(DomainEvent.ThumbnailBookAdded(newThumbnail))
|
||||||
|
return newThumbnail
|
||||||
}
|
}
|
||||||
|
|
||||||
fun deleteThumbnailForBook(thumbnail: ThumbnailBook) {
|
fun deleteThumbnailForBook(thumbnail: ThumbnailBook) {
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ class ReadListLifecycle(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addThumbnail(thumbnail: ThumbnailReadList) {
|
fun addThumbnail(thumbnail: ThumbnailReadList): ThumbnailReadList {
|
||||||
when (thumbnail.type) {
|
when (thumbnail.type) {
|
||||||
ThumbnailReadList.Type.USER_UPLOADED -> {
|
ThumbnailReadList.Type.USER_UPLOADED -> {
|
||||||
thumbnailReadListRepository.insert(thumbnail)
|
thumbnailReadListRepository.insert(thumbnail)
|
||||||
|
|
@ -88,6 +88,7 @@ class ReadListLifecycle(
|
||||||
}
|
}
|
||||||
|
|
||||||
eventPublisher.publishEvent(DomainEvent.ThumbnailReadListAdded(thumbnail))
|
eventPublisher.publishEvent(DomainEvent.ThumbnailReadListAdded(thumbnail))
|
||||||
|
return thumbnail
|
||||||
}
|
}
|
||||||
|
|
||||||
fun markSelectedThumbnail(thumbnail: ThumbnailReadList) {
|
fun markSelectedThumbnail(thumbnail: ThumbnailReadList) {
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ class SeriesCollectionLifecycle(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addThumbnail(thumbnail: ThumbnailSeriesCollection) {
|
fun addThumbnail(thumbnail: ThumbnailSeriesCollection): ThumbnailSeriesCollection {
|
||||||
when (thumbnail.type) {
|
when (thumbnail.type) {
|
||||||
ThumbnailSeriesCollection.Type.USER_UPLOADED -> {
|
ThumbnailSeriesCollection.Type.USER_UPLOADED -> {
|
||||||
thumbnailSeriesCollectionRepository.insert(thumbnail)
|
thumbnailSeriesCollectionRepository.insert(thumbnail)
|
||||||
|
|
@ -84,6 +84,7 @@ class SeriesCollectionLifecycle(
|
||||||
}
|
}
|
||||||
|
|
||||||
eventPublisher.publishEvent(DomainEvent.ThumbnailSeriesCollectionAdded(thumbnail))
|
eventPublisher.publishEvent(DomainEvent.ThumbnailSeriesCollectionAdded(thumbnail))
|
||||||
|
return thumbnail
|
||||||
}
|
}
|
||||||
|
|
||||||
fun markSelectedThumbnail(thumbnail: ThumbnailSeriesCollection) {
|
fun markSelectedThumbnail(thumbnail: ThumbnailSeriesCollection) {
|
||||||
|
|
|
||||||
|
|
@ -263,7 +263,7 @@ class SeriesLifecycle(
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addThumbnailForSeries(thumbnail: ThumbnailSeries, markSelected: MarkSelectedPreference) {
|
fun addThumbnailForSeries(thumbnail: ThumbnailSeries, markSelected: MarkSelectedPreference): ThumbnailSeries {
|
||||||
// delete existing thumbnail with the same url
|
// delete existing thumbnail with the same url
|
||||||
if (thumbnail.url != null) {
|
if (thumbnail.url != null) {
|
||||||
thumbnailsSeriesRepository.findAllBySeriesId(thumbnail.seriesId)
|
thumbnailsSeriesRepository.findAllBySeriesId(thumbnail.seriesId)
|
||||||
|
|
@ -284,7 +284,9 @@ class SeriesLifecycle(
|
||||||
|
|
||||||
if (selected) thumbnailsSeriesRepository.markSelected(thumbnail)
|
if (selected) thumbnailsSeriesRepository.markSelected(thumbnail)
|
||||||
|
|
||||||
eventPublisher.publishEvent(DomainEvent.ThumbnailSeriesAdded(thumbnail.copy(selected = selected)))
|
val newThumbnail = thumbnail.copy(selected = selected)
|
||||||
|
eventPublisher.publishEvent(DomainEvent.ThumbnailSeriesAdded(newThumbnail))
|
||||||
|
return newThumbnail
|
||||||
}
|
}
|
||||||
|
|
||||||
fun deleteThumbnailForSeries(thumbnail: ThumbnailSeries) {
|
fun deleteThumbnailForSeries(thumbnail: ThumbnailSeries) {
|
||||||
|
|
|
||||||
|
|
@ -303,19 +303,18 @@ class BookController(
|
||||||
|
|
||||||
@PostMapping(value = ["api/v1/books/{bookId}/thumbnails"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
|
@PostMapping(value = ["api/v1/books/{bookId}/thumbnails"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
|
||||||
@PreAuthorize("hasRole('$ROLE_ADMIN')")
|
@PreAuthorize("hasRole('$ROLE_ADMIN')")
|
||||||
@ResponseStatus(HttpStatus.ACCEPTED)
|
|
||||||
fun addUserUploadedBookThumbnail(
|
fun addUserUploadedBookThumbnail(
|
||||||
@AuthenticationPrincipal principal: KomgaPrincipal,
|
@AuthenticationPrincipal principal: KomgaPrincipal,
|
||||||
@PathVariable(name = "bookId") bookId: String,
|
@PathVariable(name = "bookId") bookId: String,
|
||||||
@RequestParam("file") file: MultipartFile,
|
@RequestParam("file") file: MultipartFile,
|
||||||
@RequestParam("selected") selected: Boolean = true,
|
@RequestParam("selected") selected: Boolean = true,
|
||||||
) {
|
): ThumbnailBookDto {
|
||||||
val book = bookRepository.findByIdOrNull(bookId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
|
val book = bookRepository.findByIdOrNull(bookId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
|
||||||
|
|
||||||
if (!contentDetector.isImage(file.inputStream.buffered().use { contentDetector.detectMediaType(it) }))
|
if (!contentDetector.isImage(file.inputStream.buffered().use { contentDetector.detectMediaType(it) }))
|
||||||
throw ResponseStatusException(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
|
throw ResponseStatusException(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
|
||||||
|
|
||||||
bookLifecycle.addThumbnailForBook(
|
return bookLifecycle.addThumbnailForBook(
|
||||||
ThumbnailBook(
|
ThumbnailBook(
|
||||||
bookId = book.id,
|
bookId = book.id,
|
||||||
thumbnail = file.bytes,
|
thumbnail = file.bytes,
|
||||||
|
|
@ -323,7 +322,7 @@ class BookController(
|
||||||
selected = selected,
|
selected = selected,
|
||||||
),
|
),
|
||||||
if (selected) MarkSelectedPreference.YES else MarkSelectedPreference.NO,
|
if (selected) MarkSelectedPreference.YES else MarkSelectedPreference.NO,
|
||||||
)
|
).toDto()
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("api/v1/books/{bookId}/thumbnails/{thumbnailId}/selected")
|
@PutMapping("api/v1/books/{bookId}/thumbnails/{thumbnailId}/selected")
|
||||||
|
|
|
||||||
|
|
@ -165,26 +165,25 @@ class ReadListController(
|
||||||
|
|
||||||
@PostMapping(value = ["{id}/thumbnails"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
|
@PostMapping(value = ["{id}/thumbnails"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
|
||||||
@PreAuthorize("hasRole('$ROLE_ADMIN')")
|
@PreAuthorize("hasRole('$ROLE_ADMIN')")
|
||||||
@ResponseStatus(HttpStatus.ACCEPTED)
|
|
||||||
fun addUserUploadedReadListThumbnail(
|
fun addUserUploadedReadListThumbnail(
|
||||||
@AuthenticationPrincipal principal: KomgaPrincipal,
|
@AuthenticationPrincipal principal: KomgaPrincipal,
|
||||||
@PathVariable(name = "id") id: String,
|
@PathVariable(name = "id") id: String,
|
||||||
@RequestParam("file") file: MultipartFile,
|
@RequestParam("file") file: MultipartFile,
|
||||||
@RequestParam("selected") selected: Boolean = true,
|
@RequestParam("selected") selected: Boolean = true,
|
||||||
) {
|
): ThumbnailReadListDto {
|
||||||
readListRepository.findByIdOrNull(id, principal.user.getAuthorizedLibraryIds(null), principal.user.restrictions)?.let { readList ->
|
readListRepository.findByIdOrNull(id, principal.user.getAuthorizedLibraryIds(null), principal.user.restrictions)?.let { readList ->
|
||||||
|
|
||||||
if (!contentDetector.isImage(file.inputStream.buffered().use { contentDetector.detectMediaType(it) }))
|
if (!contentDetector.isImage(file.inputStream.buffered().use { contentDetector.detectMediaType(it) }))
|
||||||
throw ResponseStatusException(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
|
throw ResponseStatusException(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
|
||||||
|
|
||||||
readListLifecycle.addThumbnail(
|
return readListLifecycle.addThumbnail(
|
||||||
ThumbnailReadList(
|
ThumbnailReadList(
|
||||||
readListId = readList.id,
|
readListId = readList.id,
|
||||||
thumbnail = file.bytes,
|
thumbnail = file.bytes,
|
||||||
type = ThumbnailReadList.Type.USER_UPLOADED,
|
type = ThumbnailReadList.Type.USER_UPLOADED,
|
||||||
selected = selected,
|
selected = selected,
|
||||||
),
|
),
|
||||||
)
|
).toDto()
|
||||||
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
|
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -144,26 +144,25 @@ class SeriesCollectionController(
|
||||||
|
|
||||||
@PostMapping(value = ["{id}/thumbnails"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
|
@PostMapping(value = ["{id}/thumbnails"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
|
||||||
@PreAuthorize("hasRole('$ROLE_ADMIN')")
|
@PreAuthorize("hasRole('$ROLE_ADMIN')")
|
||||||
@ResponseStatus(HttpStatus.ACCEPTED)
|
|
||||||
fun addUserUploadedCollectionThumbnail(
|
fun addUserUploadedCollectionThumbnail(
|
||||||
@AuthenticationPrincipal principal: KomgaPrincipal,
|
@AuthenticationPrincipal principal: KomgaPrincipal,
|
||||||
@PathVariable(name = "id") id: String,
|
@PathVariable(name = "id") id: String,
|
||||||
@RequestParam("file") file: MultipartFile,
|
@RequestParam("file") file: MultipartFile,
|
||||||
@RequestParam("selected") selected: Boolean = true,
|
@RequestParam("selected") selected: Boolean = true,
|
||||||
) {
|
): ThumbnailSeriesCollectionDto {
|
||||||
collectionRepository.findByIdOrNull(id, principal.user.getAuthorizedLibraryIds(null))?.let { collection ->
|
collectionRepository.findByIdOrNull(id, principal.user.getAuthorizedLibraryIds(null))?.let { collection ->
|
||||||
|
|
||||||
if (!contentDetector.isImage(file.inputStream.buffered().use { contentDetector.detectMediaType(it) }))
|
if (!contentDetector.isImage(file.inputStream.buffered().use { contentDetector.detectMediaType(it) }))
|
||||||
throw ResponseStatusException(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
|
throw ResponseStatusException(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
|
||||||
|
|
||||||
collectionLifecycle.addThumbnail(
|
return collectionLifecycle.addThumbnail(
|
||||||
ThumbnailSeriesCollection(
|
ThumbnailSeriesCollection(
|
||||||
collectionId = collection.id,
|
collectionId = collection.id,
|
||||||
thumbnail = file.bytes,
|
thumbnail = file.bytes,
|
||||||
type = ThumbnailSeriesCollection.Type.USER_UPLOADED,
|
type = ThumbnailSeriesCollection.Type.USER_UPLOADED,
|
||||||
selected = selected,
|
selected = selected,
|
||||||
),
|
),
|
||||||
)
|
).toDto()
|
||||||
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
|
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -377,24 +377,23 @@ class SeriesController(
|
||||||
|
|
||||||
@PostMapping(value = ["v1/series/{seriesId}/thumbnails"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
|
@PostMapping(value = ["v1/series/{seriesId}/thumbnails"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
|
||||||
@PreAuthorize("hasRole('$ROLE_ADMIN')")
|
@PreAuthorize("hasRole('$ROLE_ADMIN')")
|
||||||
@ResponseStatus(HttpStatus.ACCEPTED)
|
|
||||||
fun postUserUploadedSeriesThumbnail(
|
fun postUserUploadedSeriesThumbnail(
|
||||||
@PathVariable(name = "seriesId") seriesId: String,
|
@PathVariable(name = "seriesId") seriesId: String,
|
||||||
@RequestParam("file") file: MultipartFile,
|
@RequestParam("file") file: MultipartFile,
|
||||||
@RequestParam("selected") selected: Boolean = true,
|
@RequestParam("selected") selected: Boolean = true,
|
||||||
) {
|
): SeriesThumbnailDto {
|
||||||
val series = seriesRepository.findByIdOrNull(seriesId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
|
val series = seriesRepository.findByIdOrNull(seriesId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
|
||||||
if (!contentDetector.isImage(file.inputStream.buffered().use { contentDetector.detectMediaType(it) }))
|
if (!contentDetector.isImage(file.inputStream.buffered().use { contentDetector.detectMediaType(it) }))
|
||||||
throw ResponseStatusException(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
|
throw ResponseStatusException(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
|
||||||
|
|
||||||
seriesLifecycle.addThumbnailForSeries(
|
return seriesLifecycle.addThumbnailForSeries(
|
||||||
ThumbnailSeries(
|
ThumbnailSeries(
|
||||||
seriesId = series.id,
|
seriesId = series.id,
|
||||||
thumbnail = file.bytes,
|
thumbnail = file.bytes,
|
||||||
type = ThumbnailSeries.Type.USER_UPLOADED,
|
type = ThumbnailSeries.Type.USER_UPLOADED,
|
||||||
),
|
),
|
||||||
if (selected) MarkSelectedPreference.YES else MarkSelectedPreference.NO,
|
if (selected) MarkSelectedPreference.YES else MarkSelectedPreference.NO,
|
||||||
)
|
).toDto()
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("v1/series/{seriesId}/thumbnails/{thumbnailId}/selected")
|
@PutMapping("v1/series/{seriesId}/thumbnails/{thumbnailId}/selected")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue