diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/CategoryQuery.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/CategoryQuery.kt index 8374d7cf..418bb05b 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/CategoryQuery.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/CategoryQuery.kt @@ -99,7 +99,7 @@ class CategoryQuery { andFilterWithCompareEntity(CategoryTable.id, id), andFilterWithCompare(CategoryTable.order, order), andFilterWithCompareString(CategoryTable.name, name), - andFilterWithCompare(CategoryTable.isDefault, default), + andFilterWithCompare(CategoryTable.isDefault, default) ) } } @@ -191,15 +191,29 @@ class CategoryQuery { return CategoryNodeList( resultsAsType, - CategoryNodeList.CategoryEdges( - cursor = getAsCursor(orderBy, resultsAsType.last()), - node = resultsAsType.last() - ), + if (resultsAsType.isEmpty()) { + emptyList() + } else { + listOf( + resultsAsType.first().let { + CategoryNodeList.CategoryEdge( + getAsCursor(orderBy, it), + it + ) + }, + resultsAsType.last().let { + CategoryNodeList.CategoryEdge( + getAsCursor(orderBy, it), + it + ) + } + ) + }, pageInfo = PageInfo( hasNextPage = queryResults.lastKey != resultsAsType.last().id, hasPreviousPage = queryResults.firstKey != resultsAsType.first().id, - startCursor = getAsCursor(orderBy, resultsAsType.first()), - endCursor = getAsCursor(orderBy, resultsAsType.last()) + startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(orderBy, it) }, + endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(orderBy, it) } ), totalCount = queryResults.total.toInt() ) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt index f2b487ca..df1b1dc6 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/queries/MangaQuery.kt @@ -259,15 +259,29 @@ class MangaQuery { return MangaNodeList( resultsAsType, - MangaNodeList.MangaEdges( - cursor = getAsCursor(orderBy, resultsAsType.last()), - node = resultsAsType.last() - ), + if (resultsAsType.isEmpty()) { + emptyList() + } else { + listOf( + resultsAsType.first().let { + MangaNodeList.MangaEdge( + getAsCursor(orderBy, it), + it + ) + }, + resultsAsType.last().let { + MangaNodeList.MangaEdge( + getAsCursor(orderBy, it), + it + ) + } + ) + }, pageInfo = PageInfo( hasNextPage = queryResults.lastKey != resultsAsType.last().id, hasPreviousPage = queryResults.firstKey != resultsAsType.first().id, - startCursor = getAsCursor(orderBy, resultsAsType.first()), - endCursor = getAsCursor(orderBy, resultsAsType.last()) + startCursor = resultsAsType.firstOrNull()?.let { getAsCursor(orderBy, it) }, + endCursor = resultsAsType.lastOrNull()?.let { getAsCursor(orderBy, it) } ), totalCount = queryResults.total.toInt() ) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/primitives/NodeList.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/primitives/NodeList.kt index 9a886f9f..ae4ac253 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/primitives/NodeList.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/primitives/NodeList.kt @@ -9,7 +9,7 @@ abstract class NodeList { abstract val nodes: List @GraphQLDescription("A list of edges which contains the [T] and cursor to aid in pagination.") - abstract val edges: Edges + abstract val edges: List @GraphQLDescription("Information to aid in pagination.") abstract val pageInfo: PageInfo @@ -24,12 +24,12 @@ data class PageInfo( @GraphQLDescription("When paginating backwards, are there more items?") val hasPreviousPage: Boolean, @GraphQLDescription("When paginating backwards, the cursor to continue.") - val startCursor: Cursor, + val startCursor: Cursor?, @GraphQLDescription("When paginating forwards, the cursor to continue.") - val endCursor: Cursor + val endCursor: Cursor? ) -abstract class Edges { +abstract class Edge { @GraphQLDescription("A cursor for use in pagination.") abstract val cursor: Cursor diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/CategoryType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/CategoryType.kt index 16d2a83b..b535c6cc 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/CategoryType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/CategoryType.kt @@ -11,7 +11,7 @@ import com.expediagroup.graphql.server.extensions.getValueFromDataLoader import graphql.schema.DataFetchingEnvironment import org.jetbrains.exposed.sql.ResultRow import suwayomi.tachidesk.graphql.server.primitives.Cursor -import suwayomi.tachidesk.graphql.server.primitives.Edges +import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo @@ -42,23 +42,20 @@ class CategoryType( data class CategoryNodeList( override val nodes: List, - override val edges: CategoryEdges, + override val edges: List, override val pageInfo: PageInfo, override val totalCount: Int ) : NodeList() { - data class CategoryEdges( + data class CategoryEdge( override val cursor: Cursor, override val node: CategoryType - ) : Edges() + ) : Edge() companion object { fun List.toNodeList(): CategoryNodeList { return CategoryNodeList( nodes = this, - edges = CategoryEdges( - cursor = Cursor(lastIndex.toString()), - node = last() - ), + edges = getEdges(), pageInfo = PageInfo( hasNextPage = false, hasPreviousPage = false, @@ -68,5 +65,19 @@ data class CategoryNodeList( totalCount = size ) } + + private fun List.getEdges(): List { + if (isEmpty()) return emptyList() + return listOf( + CategoryEdge( + cursor = Cursor("0"), + node = first() + ), + CategoryEdge( + cursor = Cursor(lastIndex.toString()), + node = last() + ) + ) + } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt index 8d87d8f8..8ec24372 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ChapterType.kt @@ -11,7 +11,7 @@ import com.expediagroup.graphql.server.extensions.getValueFromDataLoader import graphql.schema.DataFetchingEnvironment import org.jetbrains.exposed.sql.ResultRow import suwayomi.tachidesk.graphql.server.primitives.Cursor -import suwayomi.tachidesk.graphql.server.primitives.Edges +import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo @@ -85,23 +85,20 @@ class ChapterType( data class ChapterNodeList( override val nodes: List, - override val edges: ChapterEdges, + override val edges: List, override val pageInfo: PageInfo, override val totalCount: Int ) : NodeList() { - data class ChapterEdges( + data class ChapterEdge( override val cursor: Cursor, override val node: ChapterType - ) : Edges() + ) : Edge() companion object { fun List.toNodeList(): ChapterNodeList { return ChapterNodeList( nodes = this, - edges = ChapterEdges( - cursor = Cursor(lastIndex.toString()), - node = last() - ), + edges = getEdges(), pageInfo = PageInfo( hasNextPage = false, hasPreviousPage = false, @@ -111,5 +108,19 @@ data class ChapterNodeList( totalCount = size ) } + + private fun List.getEdges(): List { + if (isEmpty()) return emptyList() + return listOf( + ChapterEdge( + cursor = Cursor("0"), + node = first() + ), + ChapterEdge( + cursor = Cursor(lastIndex.toString()), + node = last() + ) + ) + } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/DownloadType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/DownloadType.kt index fc6565b8..37d7e8f3 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/DownloadType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/DownloadType.kt @@ -9,7 +9,7 @@ package suwayomi.tachidesk.graphql.types import com.expediagroup.graphql.generator.annotations.GraphQLIgnore import suwayomi.tachidesk.graphql.server.primitives.Cursor -import suwayomi.tachidesk.graphql.server.primitives.Edges +import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo @@ -52,23 +52,20 @@ class DownloadType( data class DownloadNodeList( override val nodes: List, - override val edges: DownloadEdges, + override val edges: List, override val pageInfo: PageInfo, override val totalCount: Int ) : NodeList() { - data class DownloadEdges( + data class DownloadEdge( override val cursor: Cursor, override val node: DownloadType - ) : Edges() + ) : Edge() companion object { fun List.toNodeList(): DownloadNodeList { return DownloadNodeList( nodes = this, - edges = DownloadEdges( - cursor = Cursor(lastIndex.toString()), - node = last() - ), + edges = getEdges(), pageInfo = PageInfo( hasNextPage = false, hasPreviousPage = false, @@ -78,5 +75,19 @@ data class DownloadNodeList( totalCount = size ) } + + private fun List.getEdges(): List { + if (isEmpty()) return emptyList() + return listOf( + DownloadEdge( + cursor = Cursor("0"), + node = first() + ), + DownloadEdge( + cursor = Cursor(lastIndex.toString()), + node = last() + ) + ) + } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ExtensionType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ExtensionType.kt index adee3407..1c7c11a0 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ExtensionType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/ExtensionType.kt @@ -11,7 +11,7 @@ import com.expediagroup.graphql.server.extensions.getValueFromDataLoader import graphql.schema.DataFetchingEnvironment import org.jetbrains.exposed.sql.ResultRow import suwayomi.tachidesk.graphql.server.primitives.Cursor -import suwayomi.tachidesk.graphql.server.primitives.Edges +import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo @@ -54,23 +54,20 @@ class ExtensionType( data class ExtensionNodeList( override val nodes: List, - override val edges: ExtensionEdges, + override val edges: List, override val pageInfo: PageInfo, override val totalCount: Int ) : NodeList() { - data class ExtensionEdges( + data class ExtensionEdge( override val cursor: Cursor, override val node: ExtensionType - ) : Edges() + ) : Edge() companion object { fun List.toNodeList(): ExtensionNodeList { return ExtensionNodeList( nodes = this, - edges = ExtensionEdges( - cursor = Cursor(lastIndex.toString()), - node = last() - ), + edges = getEdges(), pageInfo = PageInfo( hasNextPage = false, hasPreviousPage = false, @@ -80,5 +77,19 @@ data class ExtensionNodeList( totalCount = size ) } + + private fun List.getEdges(): List { + if (isEmpty()) return emptyList() + return listOf( + ExtensionEdge( + cursor = Cursor("0"), + node = first() + ), + ExtensionEdge( + cursor = Cursor(lastIndex.toString()), + node = last() + ) + ) + } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt index 816b793a..4abe5b27 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt @@ -11,7 +11,7 @@ import com.expediagroup.graphql.server.extensions.getValueFromDataLoader import graphql.schema.DataFetchingEnvironment import org.jetbrains.exposed.sql.ResultRow import suwayomi.tachidesk.graphql.server.primitives.Cursor -import suwayomi.tachidesk.graphql.server.primitives.Edges +import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo @@ -108,23 +108,20 @@ class MangaType( data class MangaNodeList( override val nodes: List, - override val edges: MangaEdges, + override val edges: List, override val pageInfo: PageInfo, override val totalCount: Int ) : NodeList() { - data class MangaEdges( + data class MangaEdge( override val cursor: Cursor, override val node: MangaType - ) : Edges() + ) : Edge() companion object { fun List.toNodeList(): MangaNodeList { return MangaNodeList( nodes = this, - edges = MangaEdges( - cursor = Cursor(lastIndex.toString()), - node = last() - ), + edges = getEdges(), pageInfo = PageInfo( hasNextPage = false, hasPreviousPage = false, @@ -134,5 +131,19 @@ data class MangaNodeList( totalCount = size ) } + + private fun List.getEdges(): List { + if (isEmpty()) return emptyList() + return listOf( + MangaEdge( + cursor = Cursor("0"), + node = first() + ), + MangaEdge( + cursor = Cursor(lastIndex.toString()), + node = last() + ) + ) + } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt index 288170b6..5c5ba1c0 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MetaType.kt @@ -4,7 +4,7 @@ import com.expediagroup.graphql.generator.annotations.GraphQLIgnore import org.jetbrains.exposed.sql.ResultRow import suwayomi.tachidesk.global.model.table.GlobalMetaTable import suwayomi.tachidesk.graphql.server.primitives.Cursor -import suwayomi.tachidesk.graphql.server.primitives.Edges +import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo @@ -37,23 +37,20 @@ class GlobalMetaItem( data class MetaNodeList( override val nodes: List, - override val edges: MetaEdges, + override val edges: List, override val pageInfo: PageInfo, override val totalCount: Int ) : NodeList() { - data class MetaEdges( + data class MetaEdge( override val cursor: Cursor, override val node: MetaItem - ) : Edges() + ) : Edge() companion object { fun List.toNodeList(): MetaNodeList { return MetaNodeList( nodes = this, - edges = MetaEdges( - cursor = Cursor(lastIndex.toString()), - node = last() - ), + edges = getEdges(), pageInfo = PageInfo( hasNextPage = false, hasPreviousPage = false, @@ -63,5 +60,19 @@ data class MetaNodeList( totalCount = size ) } + + private fun List.getEdges(): List { + if (isEmpty()) return emptyList() + return listOf( + MetaEdge( + cursor = Cursor("0"), + node = first() + ), + MetaEdge( + cursor = Cursor(lastIndex.toString()), + node = last() + ) + ) + } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/SourceType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/SourceType.kt index bb0b9496..a3018c39 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/SourceType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/SourceType.kt @@ -14,7 +14,7 @@ import graphql.schema.DataFetchingEnvironment import org.jetbrains.exposed.sql.ResultRow import org.jetbrains.exposed.sql.select import suwayomi.tachidesk.graphql.server.primitives.Cursor -import suwayomi.tachidesk.graphql.server.primitives.Edges +import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo @@ -83,23 +83,20 @@ fun SourceType(row: ResultRow): SourceType? { data class SourceNodeList( override val nodes: List, - override val edges: SourceEdges, + override val edges: List, override val pageInfo: PageInfo, override val totalCount: Int ) : NodeList() { - data class SourceEdges( + data class SourceEdge( override val cursor: Cursor, override val node: SourceType - ) : Edges() + ) : Edge() companion object { fun List.toNodeList(): SourceNodeList { return SourceNodeList( nodes = this, - edges = SourceEdges( - cursor = Cursor(lastIndex.toString()), - node = last() - ), + edges = getEdges(), pageInfo = PageInfo( hasNextPage = false, hasPreviousPage = false, @@ -109,5 +106,19 @@ data class SourceNodeList( totalCount = size ) } + + private fun List.getEdges(): List { + if (isEmpty()) return emptyList() + return listOf( + SourceEdge( + cursor = Cursor("0"), + node = first() + ), + SourceEdge( + cursor = Cursor(lastIndex.toString()), + node = last() + ) + ) + } } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/UpdatesType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/UpdatesType.kt index e32ecb1a..7260e5a2 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/UpdatesType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/UpdatesType.kt @@ -9,7 +9,7 @@ package suwayomi.tachidesk.graphql.types import org.jetbrains.exposed.sql.ResultRow import suwayomi.tachidesk.graphql.server.primitives.Cursor -import suwayomi.tachidesk.graphql.server.primitives.Edges +import suwayomi.tachidesk.graphql.server.primitives.Edge import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.NodeList import suwayomi.tachidesk.graphql.server.primitives.PageInfo @@ -26,23 +26,20 @@ class UpdatesType( data class UpdatesNodeList( override val nodes: List, - override val edges: UpdatesEdges, + override val edges: List, override val pageInfo: PageInfo, override val totalCount: Int ) : NodeList() { - data class UpdatesEdges( + data class UpdatesEdge( override val cursor: Cursor, override val node: UpdatesType - ) : Edges() + ) : Edge() companion object { fun List.toNodeList(): UpdatesNodeList { return UpdatesNodeList( nodes = this, - edges = UpdatesEdges( - cursor = Cursor(lastIndex.toString()), - node = last() - ), + edges = getEdges(), pageInfo = PageInfo( hasNextPage = false, hasPreviousPage = false, @@ -52,5 +49,19 @@ data class UpdatesNodeList( totalCount = size ) } + + private fun List.getEdges(): List { + if (isEmpty()) return emptyList() + return listOf( + UpdatesEdge( + cursor = Cursor("0"), + node = first() + ), + UpdatesEdge( + cursor = Cursor(lastIndex.toString()), + node = last() + ) + ) + } } }