diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/Book.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/Book.kt index 763d2e1fd..f2ebb6003 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/Book.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/Book.kt @@ -11,10 +11,12 @@ import javax.persistence.FetchType import javax.persistence.GeneratedValue import javax.persistence.Id import javax.persistence.JoinColumn +import javax.persistence.ManyToOne import javax.persistence.OneToOne import javax.persistence.PrimaryKeyJoinColumn import javax.persistence.Table import javax.validation.constraints.NotBlank +import javax.validation.constraints.NotNull @Entity @Table(name = "book") @@ -35,6 +37,11 @@ class Book( @PrimaryKeyJoinColumn var id: Long = 0 + @NotNull + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "serie_id", nullable = false) + lateinit var serie: Serie + @OneToOne(optional = false, orphanRemoval = true, cascade = [CascadeType.ALL], fetch = FetchType.LAZY) @JoinColumn(name = "book_metadata_id", nullable = false) var metadata: BookMetadata = BookMetadata().also { it.book = this } diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/BookMetadata.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/BookMetadata.kt index ae4a16262..6679dbb83 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/BookMetadata.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/BookMetadata.kt @@ -28,9 +28,7 @@ class BookMetadata( @Lob var thumbnail: ByteArray? = null, - @ElementCollection(fetch = FetchType.EAGER) - @CollectionTable(name = "book_metadata_page", joinColumns = [JoinColumn(name = "book_metadata_id")]) - var pages: MutableList = mutableListOf() + pages: Iterable = emptyList() ) { @Id @GeneratedValue @@ -40,11 +38,23 @@ class BookMetadata( @OneToOne(optional = false, fetch = FetchType.LAZY, mappedBy = "metadata") lateinit var book: Book + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable(name = "book_metadata_page", joinColumns = [JoinColumn(name = "book_metadata_id")]) + var pages: MutableList = mutableListOf() + set(value) { + pages.clear() + pages.addAll(value) + } + fun reset() { status = Status.UNKNOWN mediaType = null thumbnail = null - pages = mutableListOf() + pages.clear() + } + + init { + this.pages = pages.toMutableList() } } diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/Serie.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/Serie.kt index 967a23d0c..dd5b439eb 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/Serie.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/Serie.kt @@ -8,8 +8,6 @@ import javax.persistence.Entity import javax.persistence.FetchType import javax.persistence.GeneratedValue import javax.persistence.Id -import javax.persistence.JoinColumn -import javax.persistence.JoinTable import javax.persistence.OneToMany import javax.persistence.Table import javax.validation.constraints.NotBlank @@ -27,7 +25,7 @@ class Serie( @Column(name = "file_last_modified", nullable = false) var fileLastModified: LocalDateTime, - books: MutableList + books: Iterable ) : AuditableEntity() { @Id @@ -35,15 +33,18 @@ class Serie( @Column(name = "id", nullable = false, unique = true) var id: Long = 0 - @OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.LAZY, orphanRemoval = true) - @JoinTable(name = "serie_books_mapping", joinColumns = [JoinColumn(name = "serie_id")], inverseJoinColumns = [JoinColumn(name = "book_id")]) - var books: MutableList = mutableListOf() + @OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "serie") + private var _books: MutableList = mutableListOf() + + var books: List + get() = _books.toList() set(value) { - books.clear() - books.addAll(value) + _books.clear() + value.forEach { it.serie = this } + _books.addAll(value) } init { - this.books = books + this.books = books.toMutableList() } } \ No newline at end of file diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/BookRepository.kt b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/BookRepository.kt index 05e793b6d..a04755a8d 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/BookRepository.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/BookRepository.kt @@ -2,16 +2,16 @@ package org.gotson.komga.domain.persistence import org.gotson.komga.domain.model.Book import org.gotson.komga.domain.model.Status +import org.springframework.data.domain.Page +import org.springframework.data.domain.Pageable import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.net.URL @Repository interface BookRepository : JpaRepository { - // fun findAllBySerieId(serieId: Long, pageable: Pageable): Page -// fun findAllBySerieIdAndUrlNotIn(serieId: Long, urls: Iterable): List + fun findAllBySerieId(serieId: Long, pageable: Pageable): Page fun findByUrl(url: URL): Book? fun findAllByMetadataStatus(status: Status): List -// fun findAllByMetadataStatusAndSerieId(status: Status, serieId: Long, pageable: Pageable): Page -// fun deleteAllBySerieId(serieId: Long) + fun findAllByMetadataStatusAndSerieId(status: Status, serieId: Long, pageable: Pageable): Page } \ No newline at end of file diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/SerieRepository.kt b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/SerieRepository.kt index cad1bdfcc..dcdfd7310 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/SerieRepository.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/SerieRepository.kt @@ -8,7 +8,6 @@ import java.net.URL @Repository interface SerieRepository : JpaRepository, JpaSpecificationExecutor { - // fun deleteAllByUrlNotIn(urls: Iterable) fun findByUrlNotIn(urls: Iterable): List fun findByUrl(url: URL): Serie? } \ No newline at end of file diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/web/SerieController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/web/SerieController.kt index cc6a19bf0..b8f47ed09 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/web/SerieController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/web/SerieController.kt @@ -53,16 +53,14 @@ class SerieController( @GetMapping("{id}/books") fun getAllBooksBySerie( @PathVariable id: Long, - @RequestParam(value = "readyonly", defaultValue = "true") readyFilter: Boolean -// page: Pageable - ): List { - val serie = serieRepository.findByIdOrNull(id) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) + @RequestParam(value = "readyonly", defaultValue = "true") readyFilter: Boolean, + page: Pageable + ): Page { + if (!serieRepository.existsById(id)) throw ResponseStatusException(HttpStatus.NOT_FOUND) return if (readyFilter) { -// bookRepository.findAllByMetadataStatusAndSerieId(Status.READY, id, page) - serie.books.filter { it.metadata.status == Status.READY } + bookRepository.findAllByMetadataStatusAndSerieId(Status.READY, id, page) } else { -// bookRepository.findAllBySerieId(id, page) - serie.books + bookRepository.findAllBySerieId(id, page) }.map { it.toDto() } } diff --git a/komga/src/main/resources/db/migration/V20190819161603__First_Version.sql b/komga/src/main/resources/db/migration/V20190819161603__First_Version.sql index c3cd03205..16f94ba6f 100644 --- a/komga/src/main/resources/db/migration/V20190819161603__First_Version.sql +++ b/komga/src/main/resources/db/migration/V20190819161603__First_Version.sql @@ -9,6 +9,7 @@ create table book name varchar not null, url varchar not null, book_metadata_id bigint not null, + serie_id bigint not null, primary key (id) ); @@ -39,26 +40,14 @@ create table serie primary key (id) ); -create table serie_books_mapping -( - serie_id bigint not null, - book_id bigint not null -); - alter table book add constraint uk_book_book_metadata_id unique (book_metadata_id); -alter table serie_books_mapping - add constraint UK_ya6l4fjcs4rlhwx1fwqwsmm unique (book_id); - alter table book add constraint fk_book_book_metadata_book_metadata_id foreign key (book_metadata_id) references book_metadata (id); +alter table book + add constraint fk_book_serie_serie_id foreign key (serie_id) references serie (id); + alter table book_metadata_page add constraint fk_book_metadata_page_book_metadata_book_metadata_id foreign key (book_metadata_id) references book_metadata (id); - -alter table serie_books_mapping - add constraint fk_serie_books_mapping_book_book_id foreign key (book_id) references book (id); - -alter table serie_books_mapping - add constraint fk_serie_books_mapping_serie_serie_id foreign key (serie_id) references serie (id);