From 05513bf8b9e011c06f3fd2194f2081c05900bfcf Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Sat, 5 Mar 2022 00:06:55 +0330 Subject: [PATCH] support array filter changes (#304) * support array filter changes * typo * better formating --- .../suwayomi/tachidesk/manga/MangaAPI.kt | 2 +- .../manga/controller/SourceController.kt | 11 +++-- .../suwayomi/tachidesk/manga/impl/Search.kt | 44 ++++++++++--------- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt index 77523918..e493a498 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/MangaAPI.kt @@ -45,7 +45,7 @@ object MangaAPI { post("{sourceId}/preferences", SourceController::setPreference) get("{sourceId}/filters", SourceController::getFilters) - post("{sourceId}/filters", SourceController::setFilter) + post("{sourceId}/filters", SourceController::setFilters) get("{sourceId}/search", SourceController::searchSingle) // get("all/search", SourceController::searchGlobal) // TODO diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/SourceController.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/SourceController.kt index 9e1f0e96..b9a14786 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/SourceController.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/controller/SourceController.kt @@ -7,6 +7,7 @@ package suwayomi.tachidesk.manga.controller * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +import com.fasterxml.jackson.databind.exc.MismatchedInputException import io.javalin.http.Context import suwayomi.tachidesk.manga.impl.MangaList import suwayomi.tachidesk.manga.impl.Search @@ -69,10 +70,14 @@ object SourceController { ctx.json(Search.getFilterList(sourceId, reset)) } - /** set one filter of source with id `sourceId` */ - fun setFilter(ctx: Context) { + /** change filters of source with id `sourceId` */ + fun setFilters(ctx: Context) { val sourceId = ctx.pathParam("sourceId").toLong() - val filterChange = ctx.bodyAsClass(FilterChange::class.java) + val filterChange = try { + ctx.bodyAsClass>() + } catch (e: MismatchedInputException) { + listOf(ctx.bodyAsClass()) + } ctx.json(Search.setFilter(sourceId, filterChange)) } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Search.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Search.kt index 3b20b370..97ec261c 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Search.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Search.kt @@ -80,32 +80,36 @@ object Search { val filter: Filter<*>, ) - fun setFilter(sourceId: Long, change: FilterChange) { + fun setFilter(sourceId: Long, changes: List) { val source = getCatalogueSourceOrStub(sourceId) val filterList = getFilterListOf(source, false) - when (val filter = filterList[change.position]) { - is Filter.Header -> { - // NOOP - } - is Filter.Separator -> { - // NOOP - } - is Filter.Select<*> -> filter.state = change.state.toInt() - is Filter.Text -> filter.state = change.state - is Filter.CheckBox -> filter.state = change.state.toBooleanStrict() - is Filter.TriState -> filter.state = change.state.toInt() - is Filter.Group<*> -> { - val groupChange = jsonMapper.fromJsonString(change.state, FilterChange::class.java) + changes.forEach { change -> + when (val filter = filterList[change.position]) { + is Filter.Header -> { + // NOOP + } + is Filter.Separator -> { + // NOOP + } + is Filter.Select<*> -> filter.state = change.state.toInt() + is Filter.Text -> filter.state = change.state + is Filter.CheckBox -> filter.state = change.state.toBooleanStrict() + is Filter.TriState -> filter.state = change.state.toInt() + is Filter.Group<*> -> { + val groupChange = jsonMapper.fromJsonString(change.state, FilterChange::class.java) - when (val groupFilter = filter.state[groupChange.position]) { - is Filter.CheckBox -> groupFilter.state = groupChange.state.toBooleanStrict() - is Filter.TriState -> groupFilter.state = groupChange.state.toInt() - is Filter.Text -> groupFilter.state = groupChange.state - is Filter.Select<*> -> groupFilter.state = groupChange.state.toInt() + when (val groupFilter = filter.state[groupChange.position]) { + is Filter.CheckBox -> groupFilter.state = groupChange.state.toBooleanStrict() + is Filter.TriState -> groupFilter.state = groupChange.state.toInt() + is Filter.Text -> groupFilter.state = groupChange.state + is Filter.Select<*> -> groupFilter.state = groupChange.state.toInt() + } + } + is Filter.Sort -> { + filter.state = jsonMapper.fromJsonString(change.state, Filter.Sort.Selection::class.java) } } - is Filter.Sort -> filter.state = jsonMapper.fromJsonString(change.state, Filter.Sort.Selection::class.java) } }