diff --git a/komga-webui/src/components/dialogs/EditSeriesDialog.vue b/komga-webui/src/components/dialogs/EditSeriesDialog.vue index bf6d57aa1..f0a682e3b 100644 --- a/komga-webui/src/components/dialogs/EditSeriesDialog.vue +++ b/komga-webui/src/components/dialogs/EditSeriesDialog.vue @@ -31,6 +31,10 @@ mdi-tag-multiple {{ $t('dialog.edit_series.tab_tags') }} + + mdi-link + {{ $t('dialog.edit_books.tab_links') }} + mdi-image {{ $t('dialog.edit_series.tab_poster') }} @@ -320,6 +324,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + mdi-plus + + + + + + + @@ -424,6 +499,7 @@ export default Vue.extend({ return { modal: false, tab: 0, + linksValid: false, form: { status: '', statusLock: false, @@ -449,6 +525,8 @@ export default Vue.extend({ totalBookCountLock: false, sharingLabels: [], sharingLabelsLock: false, + links: [], + linksLock: false, }, mixed: { status: false, @@ -522,6 +600,7 @@ export default Vue.extend({ readingDirection: {}, publisher: {}, totalBookCount: {minValue: minValue(1)}, + links: {}, }, }, computed: { @@ -566,6 +645,20 @@ export default Vue.extend({ }, }, methods: { + linksLabelRules(label: string): boolean | string { + if (!!this.$_.trim(label)) return true + return this.$t('common.required').toString() + }, + linksUrlRules(value: string): boolean | string { + let url + try { + url = new URL(value) + } catch (_) { + return this.$t('dialog.edit_books.field_link_url_error_url').toString() + } + if (url.protocol === 'http:' || url.protocol === 'https:') return true + return this.$t('dialog.edit_books.field_link_url_error_protocol').toString() + }, async loadAvailableTags() { this.tagsAvailable = await this.$komgaReferential.getTags() }, @@ -584,7 +677,8 @@ export default Vue.extend({ }, dialogReset(series: SeriesDto | SeriesDto[]) { this.tab = 0 - this.$v.$reset() + this.$v.$reset(); + (this.$refs.linksForm as any)?.resetValidation() if (Array.isArray(series) && series.length === 0) return if (Array.isArray(series) && series.length > 0) { const status = this.$_.uniq(series.map(x => x.metadata.status)) @@ -636,10 +730,13 @@ export default Vue.extend({ const sharingLabelsLock = this.$_.uniq(series.map(x => x.metadata.sharingLabelsLock)) this.form.sharingLabelsLock = sharingLabelsLock.length > 1 ? false : sharingLabelsLock[0] + + this.form.links = [] } else { this.form.genres = [] this.form.tags = [] this.form.sharingLabels = [] + this.form.links = [] this.$_.merge(this.form, (series as SeriesDto).metadata) this.poster.selectedThumbnail = '' this.poster.deleteQueue = [] @@ -657,7 +754,7 @@ export default Vue.extend({ } }, validateForm(): any { - if (!this.$v.$invalid) { + if (!this.$v.$invalid && (!this.single || !this.$refs.linksForm || (this.$refs.linksForm as any).validate())) { const metadata = { statusLock: this.form.statusLock, readingDirectionLock: this.form.readingDirectionLock, @@ -668,6 +765,7 @@ export default Vue.extend({ tagsLock: this.form.tagsLock, totalBookCountLock: this.form.totalBookCountLock, sharingLabelsLock: this.form.sharingLabelsLock, + linksLock: this.form.linksLock, } if (this.$v.form?.status?.$dirty) { @@ -725,6 +823,10 @@ export default Vue.extend({ if (this.$v.form?.totalBookCount?.$dirty) { this.$_.merge(metadata, {totalBookCount: this.form.totalBookCount}) } + + if (this.$v.form?.links?.$dirty || this.form.links.length != (this.series as SeriesDto).metadata.links?.length) { + this.$_.merge(metadata, {links: this.form.links}) + } } return metadata diff --git a/komga-webui/src/types/komga-series.ts b/komga-webui/src/types/komga-series.ts index efe42bd83..83523e495 100644 --- a/komga-webui/src/types/komga-series.ts +++ b/komga-webui/src/types/komga-series.ts @@ -1,4 +1,4 @@ -import {AuthorDto} from '@/types/komga-books' +import {AuthorDto, WebLinkDto} from '@/types/komga-books' import {Context} from '@/types/context' export interface SeriesDto { @@ -47,6 +47,8 @@ export interface SeriesMetadataDto { totalBookCountLock: boolean, sharingLabels: string[], sharingLabelsLock: boolean, + links?: WebLinkDto[], + linksLock?: boolean } export interface SeriesBooksMetadataDto { @@ -84,6 +86,8 @@ export interface SeriesMetadataUpdateDto { totalBookCountLock: boolean, sharingLabels?: string[], sharingLabelsLock: boolean, + links?: WebLinkDto[], + linksLock?: boolean, } export interface GroupCountDto { diff --git a/komga-webui/src/views/BrowseSeries.vue b/komga-webui/src/views/BrowseSeries.vue index 6b06155c7..61e1e7f5d 100644 --- a/komga-webui/src/views/BrowseSeries.vue +++ b/komga-webui/src/views/BrowseSeries.vue @@ -331,6 +331,32 @@ + + {{ $t('browse_book.links') }} + + + {{ link.label }} + + mdi-open-in-new + + + + + = emptySet(), val totalBookCount: Int? = null, sharingLabels: Set = emptySet(), + val links: List = emptyList(), val statusLock: Boolean = false, val titleLock: Boolean = false, @@ -29,6 +30,7 @@ class SeriesMetadata( val tagsLock: Boolean = false, val totalBookCountLock: Boolean = false, val sharingLabelsLock: Boolean = false, + val linksLock: Boolean = false, val seriesId: String = "", @@ -57,6 +59,7 @@ class SeriesMetadata( tags: Set = this.tags, totalBookCount: Int? = this.totalBookCount, sharingLabels: Set = this.sharingLabels, + links: List = this.links, statusLock: Boolean = this.statusLock, titleLock: Boolean = this.titleLock, titleSortLock: Boolean = this.titleSortLock, @@ -69,6 +72,7 @@ class SeriesMetadata( tagsLock: Boolean = this.tagsLock, totalBookCountLock: Boolean = this.totalBookCountLock, sharingLabelsLock: Boolean = this.sharingLabelsLock, + linksLock: Boolean = this.linksLock, seriesId: String = this.seriesId, createdDate: LocalDateTime = this.createdDate, lastModifiedDate: LocalDateTime = this.lastModifiedDate, @@ -86,6 +90,7 @@ class SeriesMetadata( tags = tags, totalBookCount = totalBookCount, sharingLabels = sharingLabels, + links = links, statusLock = statusLock, titleLock = titleLock, titleSortLock = titleSortLock, @@ -98,6 +103,7 @@ class SeriesMetadata( tagsLock = tagsLock, totalBookCountLock = totalBookCountLock, sharingLabelsLock = sharingLabelsLock, + linksLock = linksLock, seriesId = seriesId, createdDate = createdDate, lastModifiedDate = lastModifiedDate, @@ -115,5 +121,5 @@ class SeriesMetadata( } override fun toString(): String = - "SeriesMetadata(status=$status, readingDirection=$readingDirection, ageRating=$ageRating, totalBookCount=$totalBookCount, statusLock=$statusLock, titleLock=$titleLock, titleSortLock=$titleSortLock, summaryLock=$summaryLock, readingDirectionLock=$readingDirectionLock, publisherLock=$publisherLock, ageRatingLock=$ageRatingLock, languageLock=$languageLock, genresLock=$genresLock, tagsLock=$tagsLock, totalBookCountLock=$totalBookCountLock, sharingLabelsLock=$sharingLabelsLock, seriesId='$seriesId', createdDate=$createdDate, lastModifiedDate=$lastModifiedDate, title='$title', titleSort='$titleSort', summary='$summary', publisher='$publisher', language='$language', tags=$tags, genres=$genres, sharingLabels=$sharingLabels)" + "SeriesMetadata(status=$status, readingDirection=$readingDirection, ageRating=$ageRating, totalBookCount=$totalBookCount, links=$links, statusLock=$statusLock, titleLock=$titleLock, titleSortLock=$titleSortLock, summaryLock=$summaryLock, readingDirectionLock=$readingDirectionLock, publisherLock=$publisherLock, ageRatingLock=$ageRatingLock, languageLock=$languageLock, genresLock=$genresLock, tagsLock=$tagsLock, totalBookCountLock=$totalBookCountLock, sharingLabelsLock=$sharingLabelsLock, linksLock=$linksLock, seriesId='$seriesId', createdDate=$createdDate, lastModifiedDate=$lastModifiedDate, title='$title', titleSort='$titleSort', summary='$summary', publisher='$publisher', language='$language', tags=$tags, genres=$genres, sharingLabels=$sharingLabels)" } diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesDtoDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesDtoDao.kt index d848019a6..d7a8c7555 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesDtoDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesDtoDao.kt @@ -15,6 +15,7 @@ import org.gotson.komga.interfaces.api.rest.dto.BookMetadataAggregationDto import org.gotson.komga.interfaces.api.rest.dto.GroupCountDto import org.gotson.komga.interfaces.api.rest.dto.SeriesDto import org.gotson.komga.interfaces.api.rest.dto.SeriesMetadataDto +import org.gotson.komga.interfaces.api.rest.dto.WebLinkDto import org.gotson.komga.jooq.Tables import org.gotson.komga.jooq.tables.records.BookMetadataAggregationRecord import org.gotson.komga.jooq.tables.records.SeriesMetadataRecord @@ -60,6 +61,7 @@ class SeriesDtoDao( private val g = Tables.SERIES_METADATA_GENRE private val st = Tables.SERIES_METADATA_TAG private val sl = Tables.SERIES_METADATA_SHARING + private val slk = Tables.SERIES_METADATA_LINK private val bma = Tables.BOOK_METADATA_AGGREGATION private val bmaa = Tables.BOOK_METADATA_AGGREGATION_AUTHOR private val bmat = Tables.BOOK_METADATA_AGGREGATION_TAG @@ -227,6 +229,7 @@ class SeriesDtoDao( lateinit var genres: Map> lateinit var tags: Map> lateinit var sharingLabels: Map> + lateinit var links: Map> lateinit var aggregatedAuthors: Map> lateinit var aggregatedTags: Map> transactionTemplate.executeWithoutResult { @@ -243,6 +246,10 @@ class SeriesDtoDao( .where(sl.SERIES_ID.`in`(dsl.selectTempStrings())) .groupBy({ it.seriesId }, { it.label }) + links = dsl.selectFrom(slk) + .where(slk.SERIES_ID.`in`(dsl.selectTempStrings())) + .groupBy({ it.seriesId }, { WebLinkDto(it.label, it.url) }) + aggregatedAuthors = dsl.selectFrom(bmaa) .where(bmaa.SERIES_ID.`in`(dsl.selectTempStrings())) .filter { it.name != null } @@ -268,7 +275,7 @@ class SeriesDtoDao( booksReadCount, booksUnreadCount, booksInProgressCount, - dr.toDto(genres[sr.id].orEmpty().toSet(), tags[sr.id].orEmpty().toSet(), sharingLabels[sr.id].orEmpty().toSet()), + dr.toDto(genres[sr.id].orEmpty().toSet(), tags[sr.id].orEmpty().toSet(), sharingLabels[sr.id].orEmpty().toSet(), links[sr.id].orEmpty()), bmar.toDto(aggregatedAuthors[sr.id].orEmpty(), aggregatedTags[sr.id].orEmpty().toSet()), ) } @@ -365,7 +372,7 @@ class SeriesDtoDao( deleted = deletedDate != null, ) - private fun SeriesMetadataRecord.toDto(genres: Set, tags: Set, sharingLabels: Set) = + private fun SeriesMetadataRecord.toDto(genres: Set, tags: Set, sharingLabels: Set, links: List) = SeriesMetadataDto( status = status, statusLock = statusLock, @@ -393,6 +400,8 @@ class SeriesDtoDao( totalBookCountLock = totalBookCountLock, sharingLabels = sharingLabels, sharingLabelsLock = sharingLabelsLock, + links = links, + linksLock = linksLock, ) private fun BookMetadataAggregationRecord.toDto(authors: List, tags: Set) = diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesMetadataDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesMetadataDao.kt index 431503b2a..90297f08a 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesMetadataDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesMetadataDao.kt @@ -1,6 +1,7 @@ package org.gotson.komga.infrastructure.jooq import org.gotson.komga.domain.model.SeriesMetadata +import org.gotson.komga.domain.model.WebLink import org.gotson.komga.domain.persistence.SeriesMetadataRepository import org.gotson.komga.jooq.Tables import org.gotson.komga.jooq.tables.records.SeriesMetadataRecord @@ -8,6 +9,7 @@ import org.jooq.DSLContext import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Component import org.springframework.transaction.annotation.Transactional +import java.net.URI import java.time.LocalDateTime import java.time.ZoneId @@ -21,12 +23,13 @@ class SeriesMetadataDao( private val g = Tables.SERIES_METADATA_GENRE private val st = Tables.SERIES_METADATA_TAG private val sl = Tables.SERIES_METADATA_SHARING + private val slk = Tables.SERIES_METADATA_LINK override fun findById(seriesId: String): SeriesMetadata = - findOne(seriesId)!!.toDomain(findGenres(seriesId), findTags(seriesId), findSharingLabels(seriesId)) + findOne(seriesId)!!.toDomain(findGenres(seriesId), findTags(seriesId), findSharingLabels(seriesId), findLinks(seriesId)) override fun findByIdOrNull(seriesId: String): SeriesMetadata? = - findOne(seriesId)?.toDomain(findGenres(seriesId), findTags(seriesId), findSharingLabels(seriesId)) + findOne(seriesId)?.toDomain(findGenres(seriesId), findTags(seriesId), findSharingLabels(seriesId), findLinks(seriesId)) private fun findOne(seriesId: String) = dsl.selectFrom(d) @@ -50,6 +53,12 @@ class SeriesMetadataDao( .from(sl) .where(sl.SERIES_ID.eq(seriesId)) .fetchSet(sl.LABEL) + private fun findLinks(seriesId: String) = + dsl.select(slk.LABEL, slk.URL) + .from(slk) + .where(slk.SERIES_ID.eq(seriesId)) + .fetchInto(slk) + .map { WebLink(it.label, URI(it.url)) } @Transactional override fun insert(metadata: SeriesMetadata) { @@ -76,11 +85,13 @@ class SeriesMetadataDao( .set(d.TOTAL_BOOK_COUNT, metadata.totalBookCount) .set(d.TOTAL_BOOK_COUNT_LOCK, metadata.totalBookCountLock) .set(d.SHARING_LABELS_LOCK, metadata.sharingLabelsLock) + .set(d.LINKS_LOCK, metadata.linksLock) .execute() insertGenres(metadata) insertTags(metadata) insertSharingLabels(metadata) + insertLinks(metadata) } @Transactional @@ -107,6 +118,7 @@ class SeriesMetadataDao( .set(d.TOTAL_BOOK_COUNT, metadata.totalBookCount) .set(d.TOTAL_BOOK_COUNT_LOCK, metadata.totalBookCountLock) .set(d.SHARING_LABELS_LOCK, metadata.sharingLabelsLock) + .set(d.LINKS_LOCK, metadata.linksLock) .set(d.LAST_MODIFIED_DATE, LocalDateTime.now(ZoneId.of("Z"))) .where(d.SERIES_ID.eq(metadata.seriesId)) .execute() @@ -123,9 +135,14 @@ class SeriesMetadataDao( .where(sl.SERIES_ID.eq(metadata.seriesId)) .execute() + dsl.deleteFrom(slk) + .where(slk.SERIES_ID.eq(metadata.seriesId)) + .execute() + insertGenres(metadata) insertTags(metadata) insertSharingLabels(metadata) + insertLinks(metadata) } private fun insertGenres(metadata: SeriesMetadata) { @@ -173,11 +190,27 @@ class SeriesMetadataDao( } } + private fun insertLinks(metadata: SeriesMetadata) { + if (metadata.links.isNotEmpty()) { + metadata.links.chunked(batchSize).forEach { chunk -> + dsl.batch( + dsl.insertInto(slk, slk.SERIES_ID, slk.LABEL, slk.URL) + .values(null as String?, null, null), + ).also { step -> + chunk.forEach { + step.bind(metadata.seriesId, it.label, it.url.toString()) + } + }.execute() + } + } + } + @Transactional override fun delete(seriesId: String) { dsl.deleteFrom(g).where(g.SERIES_ID.eq(seriesId)).execute() dsl.deleteFrom(st).where(st.SERIES_ID.eq(seriesId)).execute() dsl.deleteFrom(sl).where(sl.SERIES_ID.eq(seriesId)).execute() + dsl.deleteFrom(slk).where(slk.SERIES_ID.eq(seriesId)).execute() dsl.deleteFrom(d).where(d.SERIES_ID.eq(seriesId)).execute() } @@ -188,12 +221,13 @@ class SeriesMetadataDao( dsl.deleteFrom(g).where(g.SERIES_ID.`in`(dsl.selectTempStrings())).execute() dsl.deleteFrom(st).where(st.SERIES_ID.`in`(dsl.selectTempStrings())).execute() dsl.deleteFrom(sl).where(sl.SERIES_ID.`in`(dsl.selectTempStrings())).execute() + dsl.deleteFrom(slk).where(slk.SERIES_ID.`in`(dsl.selectTempStrings())).execute() dsl.deleteFrom(d).where(d.SERIES_ID.`in`(dsl.selectTempStrings())).execute() } override fun count(): Long = dsl.fetchCount(d).toLong() - private fun SeriesMetadataRecord.toDomain(genres: Set, tags: Set, sharingLabels: Set) = + private fun SeriesMetadataRecord.toDomain(genres: Set, tags: Set, sharingLabels: Set, links: List) = SeriesMetadata( status = SeriesMetadata.Status.valueOf(status), title = title, @@ -209,6 +243,7 @@ class SeriesMetadataDao( tags = tags, totalBookCount = totalBookCount, sharingLabels = sharingLabels, + links = links, statusLock = statusLock, titleLock = titleLock, @@ -222,6 +257,7 @@ class SeriesMetadataDao( tagsLock = tagsLock, totalBookCountLock = totalBookCountLock, sharingLabelsLock = sharingLabelsLock, + linksLock = linksLock, seriesId = seriesId, diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/SeriesController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/SeriesController.kt index 4f0c3e0f9..746d00634 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/SeriesController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/SeriesController.kt @@ -30,6 +30,7 @@ import org.gotson.komga.domain.model.SeriesMetadata import org.gotson.komga.domain.model.SeriesSearch import org.gotson.komga.domain.model.SeriesSearchWithReadProgress import org.gotson.komga.domain.model.ThumbnailSeries +import org.gotson.komga.domain.model.WebLink import org.gotson.komga.domain.persistence.BookRepository import org.gotson.komga.domain.persistence.SeriesCollectionRepository import org.gotson.komga.domain.persistence.SeriesMetadataRepository @@ -88,6 +89,7 @@ import org.springframework.web.multipart.MultipartFile import org.springframework.web.server.ResponseStatusException import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody import java.io.OutputStream +import java.net.URI import java.nio.charset.StandardCharsets.UTF_8 import java.util.zip.Deflater import javax.validation.Valid @@ -544,6 +546,10 @@ class SeriesController( if (sharingLabels != null) sharingLabels!! else emptySet() } else existing.sharingLabels, sharingLabelsLock = sharingLabelsLock ?: existing.sharingLabelsLock, + links = if (isSet("links")) { + if (links != null) links!!.map { WebLink(it.label!!, URI(it.url!!)) } else emptyList() + } else existing.links, + linksLock = linksLock ?: existing.linksLock, ) } seriesMetadataRepository.update(updated) diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/SeriesDto.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/SeriesDto.kt index fd7a9d87a..8c154f186 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/SeriesDto.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/SeriesDto.kt @@ -52,6 +52,8 @@ data class SeriesMetadataDto( val totalBookCountLock: Boolean, val sharingLabels: Set, val sharingLabelsLock: Boolean, + val links: List, + val linksLock: Boolean, @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") val created: LocalDateTime, diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/SeriesMetadataUpdateDto.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/SeriesMetadataUpdateDto.kt index 77589bcbe..83323bdf8 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/SeriesMetadataUpdateDto.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/api/rest/dto/SeriesMetadataUpdateDto.kt @@ -3,6 +3,7 @@ package org.gotson.komga.interfaces.api.rest.dto import org.gotson.komga.domain.model.SeriesMetadata import org.gotson.komga.infrastructure.validation.NullOrBlankOrBCP47 import org.gotson.komga.infrastructure.validation.NullOrNotBlank +import javax.validation.Valid import javax.validation.constraints.Positive import javax.validation.constraints.PositiveOrZero import kotlin.properties.Delegates @@ -81,4 +82,12 @@ class SeriesMetadataUpdateDto { } var sharingLabelsLock: Boolean? = null + + @get:Valid + var links: List? + by Delegates.observable(null) { prop, _, _ -> + isSet[prop.name] = true + } + + var linksLock: Boolean? = null } diff --git a/komga/src/test/kotlin/org/gotson/komga/infrastructure/jooq/SeriesMetadataDaoTest.kt b/komga/src/test/kotlin/org/gotson/komga/infrastructure/jooq/SeriesMetadataDaoTest.kt index f423ba12b..c0728352f 100644 --- a/komga/src/test/kotlin/org/gotson/komga/infrastructure/jooq/SeriesMetadataDaoTest.kt +++ b/komga/src/test/kotlin/org/gotson/komga/infrastructure/jooq/SeriesMetadataDaoTest.kt @@ -3,6 +3,7 @@ package org.gotson.komga.infrastructure.jooq import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.catchThrowable import org.gotson.komga.domain.model.SeriesMetadata +import org.gotson.komga.domain.model.WebLink import org.gotson.komga.domain.model.makeLibrary import org.gotson.komga.domain.model.makeSeries import org.gotson.komga.domain.persistence.LibraryRepository @@ -15,6 +16,7 @@ import org.junit.jupiter.api.extension.ExtendWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.test.context.junit.jupiter.SpringExtension +import java.net.URI import java.time.LocalDateTime @ExtendWith(SpringExtension::class) @@ -63,6 +65,7 @@ class SeriesMetadataDaoTest( language = "en", totalBookCount = 5, sharingLabels = setOf("kids"), + links = listOf(WebLink("Comicvine", URI("https://comicvine.gamespot.com/doctor-strange/4050-2676/"))), titleLock = true, titleSortLock = true, summaryLock = true, @@ -74,6 +77,7 @@ class SeriesMetadataDaoTest( tagsLock = true, totalBookCountLock = true, sharingLabelsLock = true, + linksLock = true, seriesId = series.id, ) @@ -96,6 +100,10 @@ class SeriesMetadataDaoTest( assertThat(created.tags).containsAll(metadata.tags) assertThat(created.totalBookCount).isEqualTo(metadata.totalBookCount) assertThat(created.sharingLabels).containsAll(metadata.sharingLabels) + with(created.links.first()) { + assertThat(label).isEqualTo(metadata.links.first().label) + assertThat(url).isEqualTo(metadata.links.first().url) + } assertThat(created.titleLock).isEqualTo(metadata.titleLock) assertThat(created.titleSortLock).isEqualTo(metadata.titleSortLock) @@ -109,6 +117,7 @@ class SeriesMetadataDaoTest( assertThat(created.tagsLock).isEqualTo(metadata.tagsLock) assertThat(created.totalBookCountLock).isEqualTo(metadata.totalBookCountLock) assertThat(created.sharingLabelsLock).isEqualTo(metadata.sharingLabelsLock) + assertThat(created.linksLock).isEqualTo(metadata.linksLock) } @Test @@ -140,6 +149,7 @@ class SeriesMetadataDaoTest( assertThat(created.tags).isEmpty() assertThat(created.totalBookCount).isNull() assertThat(created.sharingLabels).isEmpty() + assertThat(created.links).isEmpty() assertThat(created.titleLock).isFalse assertThat(created.titleSortLock).isFalse @@ -153,6 +163,7 @@ class SeriesMetadataDaoTest( assertThat(created.tagsLock).isFalse assertThat(created.totalBookCountLock).isFalse assertThat(created.sharingLabelsLock).isFalse + assertThat(created.linksLock).isFalse } @Test @@ -205,6 +216,7 @@ class SeriesMetadataDaoTest( tags = setOf("tag"), totalBookCount = 3, sharingLabels = setOf("kids"), + links = listOf(WebLink("Comicvine", URI("https://comicvine.gamespot.com/doctor-strange/4050-2676/"))), seriesId = series.id, ) seriesMetadataDao.insert(metadata) @@ -226,6 +238,7 @@ class SeriesMetadataDaoTest( tags = setOf("Another"), totalBookCount = 8, sharingLabels = setOf("adult"), + links = emptyList(), statusLock = true, titleLock = true, titleSortLock = true, @@ -238,6 +251,7 @@ class SeriesMetadataDaoTest( tagsLock = true, totalBookCountLock = true, sharingLabelsLock = true, + linksLock = true, ) } @@ -261,6 +275,7 @@ class SeriesMetadataDaoTest( assertThat(modified.tags).containsAll(updated.tags) assertThat(modified.totalBookCount).isEqualTo(updated.totalBookCount) assertThat(modified.sharingLabels).containsAll(updated.sharingLabels) + assertThat(modified.links).isEmpty() assertThat(modified.titleLock).isTrue assertThat(modified.titleSortLock).isTrue @@ -274,5 +289,6 @@ class SeriesMetadataDaoTest( assertThat(modified.tagsLock).isTrue assertThat(modified.totalBookCountLock).isTrue assertThat(modified.sharingLabelsLock).isTrue + assertThat(modified.linksLock).isTrue } }