Add chapter and manga meta field
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
package suwayomi.tachidesk.graphql.dataLoaders
|
||||
|
||||
import com.expediagroup.graphql.dataloader.KotlinDataLoader
|
||||
import org.dataloader.DataLoader
|
||||
import org.dataloader.DataLoaderFactory
|
||||
import org.jetbrains.exposed.sql.StdOutSqlLogger
|
||||
import org.jetbrains.exposed.sql.addLogger
|
||||
import org.jetbrains.exposed.sql.select
|
||||
import org.jetbrains.exposed.sql.transactions.transaction
|
||||
import suwayomi.tachidesk.graphql.types.ChapterMetaItem
|
||||
import suwayomi.tachidesk.graphql.types.MangaMetaItem
|
||||
import suwayomi.tachidesk.graphql.types.MetaType
|
||||
import suwayomi.tachidesk.manga.model.table.ChapterMetaTable
|
||||
import suwayomi.tachidesk.manga.model.table.MangaMetaTable
|
||||
import java.util.concurrent.CompletableFuture
|
||||
|
||||
class ChapterMetaDataLoader : KotlinDataLoader<Int, MetaType> {
|
||||
override val dataLoaderName = "ChapterMetaDataLoader"
|
||||
override fun getDataLoader(): DataLoader<Int, MetaType> = DataLoaderFactory.newDataLoader<Int, MetaType> { ids ->
|
||||
CompletableFuture.supplyAsync {
|
||||
transaction {
|
||||
addLogger(StdOutSqlLogger)
|
||||
val metasByChapterId = ChapterMetaTable.select { ChapterMetaTable.ref inList ids }
|
||||
.map { ChapterMetaItem(it) }
|
||||
.groupBy { it.ref }
|
||||
ids.map { metasByChapterId[it] ?: emptyList() }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class MangaMetaDataLoader : KotlinDataLoader<Int, MetaType> {
|
||||
override val dataLoaderName = "MangaMetaDataLoader"
|
||||
override fun getDataLoader(): DataLoader<Int, MetaType> = DataLoaderFactory.newDataLoader<Int, MetaType> { ids ->
|
||||
CompletableFuture.supplyAsync {
|
||||
transaction {
|
||||
addLogger(StdOutSqlLogger)
|
||||
val metasByChapterId = MangaMetaTable.select { MangaMetaTable.ref inList ids }
|
||||
.map { MangaMetaItem(it) }
|
||||
.groupBy { it.ref }
|
||||
ids.map { metasByChapterId[it] ?: emptyList() }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+3
-1
@@ -12,5 +12,7 @@ import com.expediagroup.graphql.dataloader.KotlinDataLoaderRegistryFactory
|
||||
val tachideskDataLoaderRegistryFactory = KotlinDataLoaderRegistryFactory(
|
||||
MangaDataLoader(),
|
||||
ChapterDataLoader(),
|
||||
ChaptersForMangaDataLoader()
|
||||
ChaptersForMangaDataLoader(),
|
||||
ChapterMetaDataLoader(),
|
||||
MangaMetaDataLoader()
|
||||
)
|
||||
|
||||
@@ -30,7 +30,6 @@ class ChapterType(
|
||||
val isDownloaded: Boolean,
|
||||
val pageCount: Int
|
||||
// val chapterCount: Int?,
|
||||
// val meta: Map<String, String> = emptyMap()
|
||||
) {
|
||||
constructor(row: ResultRow) : this(
|
||||
row[ChapterTable.id].value,
|
||||
@@ -49,14 +48,13 @@ class ChapterType(
|
||||
row[ChapterTable.isDownloaded],
|
||||
row[ChapterTable.pageCount]
|
||||
// transaction { ChapterTable.select { manga eq chapterEntry[manga].value }.count().toInt() },
|
||||
// Chapter.getChapterMetaMap(chapterEntry[id])
|
||||
)
|
||||
|
||||
fun manga(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture<MangaType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader<Int, MangaType>("MangaDataLoader", mangaId)
|
||||
}
|
||||
|
||||
// fun chapters(): List<String> {
|
||||
// return listOf("Foo", "Bar", "Baz")
|
||||
// }
|
||||
fun meta(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture<MetaType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader<Int, MetaType>("ChapterMetaDataLoader", id)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,4 +67,8 @@ class MangaType(
|
||||
|
||||
return Instant.now().epochSecond.minus(chaptersLastFetchedAt!!)
|
||||
}
|
||||
|
||||
fun meta(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture<MetaType> {
|
||||
return dataFetchingEnvironment.getValueFromDataLoader<Int, MetaType>("MangaMetaDataLoader", id)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package suwayomi.tachidesk.graphql.types
|
||||
|
||||
import com.expediagroup.graphql.generator.annotations.GraphQLIgnore
|
||||
import org.jetbrains.exposed.sql.ResultRow
|
||||
import suwayomi.tachidesk.manga.model.table.ChapterMetaTable
|
||||
import suwayomi.tachidesk.manga.model.table.MangaMetaTable
|
||||
|
||||
typealias MetaType = List<MetaItem>
|
||||
|
||||
open class MetaItem(
|
||||
val key: String,
|
||||
val value: String,
|
||||
@GraphQLIgnore
|
||||
val ref: Int
|
||||
)
|
||||
|
||||
class ChapterMetaItem(
|
||||
private val row: ResultRow
|
||||
) : MetaItem(row[ChapterMetaTable.key], row[ChapterMetaTable.value], row[ChapterMetaTable.ref].value)
|
||||
|
||||
class MangaMetaItem(
|
||||
private val row: ResultRow
|
||||
) : MetaItem(row[MangaMetaTable.key], row[MangaMetaTable.value], row[MangaMetaTable.ref].value)
|
||||
Reference in New Issue
Block a user