From c1659f1cf25db40e9379b59db685bd4efb1592aa Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Sat, 6 Feb 2021 18:48:59 +0330 Subject: [PATCH] refactor, add todos for library and category --- .../main/kotlin/ir/armor/tachidesk/Main.kt | 45 +++++++++++++++++++ .../ir/armor/tachidesk/database/DBMangaer.kt | 6 ++- .../database/entity/ExtensionEntity.kt | 24 +++++----- .../tachidesk/database/table/CategoryTable.kt | 12 +++++ .../database/table/ExtensionTable.kt | 2 +- .../tachidesk/database/table/MangaTable.kt | 2 + .../tachidesk/database/table/SourceTable.kt | 2 +- .../ir/armor/tachidesk/util/Extension.kt | 14 +++--- .../ir/armor/tachidesk/util/ExtensionsList.kt | 33 +++++++------- .../ir/armor/tachidesk/util/SourceList.kt | 6 +-- 10 files changed, 103 insertions(+), 43 deletions(-) create mode 100644 server/src/main/kotlin/ir/armor/tachidesk/database/table/CategoryTable.kt diff --git a/server/src/main/kotlin/ir/armor/tachidesk/Main.kt b/server/src/main/kotlin/ir/armor/tachidesk/Main.kt index 1b726344..eb82b74f 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/Main.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/Main.kt @@ -144,6 +144,26 @@ class Main { ctx.header("content-type", result.second) } + // adds the manga to library + app.get("api/v1/manga/:mangaId/library") { ctx -> + // TODO + } + + // removes the manga from the library + app.delete("api/v1/manga/:mangaId/library") { ctx -> + // TODO + } + + // adds the manga to category + app.get("api/v1/manga/:mangaId/category/:categoryId") { ctx -> + // TODO + } + + // removes the manga from the category + app.delete("api/v1/manga/:mangaId/category/:categoryId") { ctx -> + // TODO + } + app.get("/api/v1/manga/:mangaId/chapters") { ctx -> val mangaId = ctx.pathParam("mangaId").toInt() ctx.json(getChapterList(mangaId)) @@ -184,6 +204,31 @@ class Main { val sourceId = ctx.pathParam("sourceId").toLong() ctx.json(sourceFilters(sourceId)) } + + // lists all manga in the library, suitable if no categories are defined + app.get("/api/v1/library/") { ctx -> + // TODO + } + + // category list + app.get("/api/v1/category/") { ctx -> + // TODO + } + + // category create + app.post("/api/v1/category/") { ctx -> + // TODO + } + + // category modification + app.patch("/api/v1/category/:categoryId") { ctx -> + // TODO + } + + // returns the manga list associated with a category + app.get("/api/v1/category/:categoryId") { ctx -> + // TODO + } } } } diff --git a/server/src/main/kotlin/ir/armor/tachidesk/database/DBMangaer.kt b/server/src/main/kotlin/ir/armor/tachidesk/database/DBMangaer.kt index 0a5d0a87..76251161 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/database/DBMangaer.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/database/DBMangaer.kt @@ -5,8 +5,9 @@ package ir.armor.tachidesk.database * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import ir.armor.tachidesk.Config +import ir.armor.tachidesk.database.table.CategoryTable import ir.armor.tachidesk.database.table.ChapterTable -import ir.armor.tachidesk.database.table.ExtensionsTable +import ir.armor.tachidesk.database.table.ExtensionTable import ir.armor.tachidesk.database.table.MangaTable import ir.armor.tachidesk.database.table.PageTable import ir.armor.tachidesk.database.table.SourceTable @@ -27,10 +28,11 @@ fun makeDataBaseTables() { // db.useNestedTransactions = true transaction { - SchemaUtils.create(ExtensionsTable) + SchemaUtils.create(ExtensionTable) SchemaUtils.create(SourceTable) SchemaUtils.create(MangaTable) SchemaUtils.create(ChapterTable) SchemaUtils.create(PageTable) + SchemaUtils.create(CategoryTable) } } diff --git a/server/src/main/kotlin/ir/armor/tachidesk/database/entity/ExtensionEntity.kt b/server/src/main/kotlin/ir/armor/tachidesk/database/entity/ExtensionEntity.kt index 1b1ce477..9ef2f335 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/database/entity/ExtensionEntity.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/database/entity/ExtensionEntity.kt @@ -4,22 +4,22 @@ package ir.armor.tachidesk.database.entity * 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 ir.armor.tachidesk.database.table.ExtensionsTable +import ir.armor.tachidesk.database.table.ExtensionTable import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.IntEntityClass import org.jetbrains.exposed.dao.id.EntityID class ExtensionEntity(id: EntityID) : IntEntity(id) { - companion object : IntEntityClass(ExtensionsTable) + companion object : IntEntityClass(ExtensionTable) - var name by ExtensionsTable.name - var pkgName by ExtensionsTable.pkgName - var versionName by ExtensionsTable.versionName - var versionCode by ExtensionsTable.versionCode - var lang by ExtensionsTable.lang - var isNsfw by ExtensionsTable.isNsfw - var apkName by ExtensionsTable.apkName - var iconUrl by ExtensionsTable.iconUrl - var installed by ExtensionsTable.installed - var classFQName by ExtensionsTable.classFQName + var name by ExtensionTable.name + var pkgName by ExtensionTable.pkgName + var versionName by ExtensionTable.versionName + var versionCode by ExtensionTable.versionCode + var lang by ExtensionTable.lang + var isNsfw by ExtensionTable.isNsfw + var apkName by ExtensionTable.apkName + var iconUrl by ExtensionTable.iconUrl + var installed by ExtensionTable.installed + var classFQName by ExtensionTable.classFQName } diff --git a/server/src/main/kotlin/ir/armor/tachidesk/database/table/CategoryTable.kt b/server/src/main/kotlin/ir/armor/tachidesk/database/table/CategoryTable.kt new file mode 100644 index 00000000..9f7e437f --- /dev/null +++ b/server/src/main/kotlin/ir/armor/tachidesk/database/table/CategoryTable.kt @@ -0,0 +1,12 @@ +package ir.armor.tachidesk.database.table + +/* This Source Code Form is subject to the terms of the Mozilla Public + * 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 org.jetbrains.exposed.dao.id.IntIdTable + +object CategoryTable : IntIdTable() { + val name = varchar("name", 64) + val isLanding = bool("is_landing").default(false) +} diff --git a/server/src/main/kotlin/ir/armor/tachidesk/database/table/ExtensionTable.kt b/server/src/main/kotlin/ir/armor/tachidesk/database/table/ExtensionTable.kt index 7cbdbc40..c044c60e 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/database/table/ExtensionTable.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/database/table/ExtensionTable.kt @@ -6,7 +6,7 @@ package ir.armor.tachidesk.database.table import org.jetbrains.exposed.dao.id.IntIdTable -object ExtensionsTable : IntIdTable() { +object ExtensionTable : IntIdTable() { val name = varchar("name", 128) val pkgName = varchar("pkg_name", 128) val versionName = varchar("version_name", 16) diff --git a/server/src/main/kotlin/ir/armor/tachidesk/database/table/MangaTable.kt b/server/src/main/kotlin/ir/armor/tachidesk/database/table/MangaTable.kt index cd8d6bb1..bfa36c91 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/database/table/MangaTable.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/database/table/MangaTable.kt @@ -21,6 +21,8 @@ object MangaTable : IntIdTable() { val status = integer("status").default(SManga.UNKNOWN) val thumbnail_url = varchar("thumbnail_url", 2048).nullable() + val inLibrary = bool("in_library").default(false) + // source is used by some ancestor of IntIdTable val sourceReference = reference("source", SourceTable) } diff --git a/server/src/main/kotlin/ir/armor/tachidesk/database/table/SourceTable.kt b/server/src/main/kotlin/ir/armor/tachidesk/database/table/SourceTable.kt index d664c4dd..25f54d43 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/database/table/SourceTable.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/database/table/SourceTable.kt @@ -10,7 +10,7 @@ object SourceTable : IdTable() { override val id = long("id").entityId() val name = varchar("name", 128) val lang = varchar("lang", 10) - val extension = reference("extension", ExtensionsTable) + val extension = reference("extension", ExtensionTable) val partOfFactorySource = bool("part_of_factory_source").default(false) val positionInFactorySource = integer("position_in_factory_source").nullable() } diff --git a/server/src/main/kotlin/ir/armor/tachidesk/util/Extension.kt b/server/src/main/kotlin/ir/armor/tachidesk/util/Extension.kt index 92b22f2e..6570bf12 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/util/Extension.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/util/Extension.kt @@ -12,7 +12,7 @@ import eu.kanade.tachiyomi.source.SourceFactory import eu.kanade.tachiyomi.source.online.HttpSource import ir.armor.tachidesk.APKExtractor import ir.armor.tachidesk.Config -import ir.armor.tachidesk.database.table.ExtensionsTable +import ir.armor.tachidesk.database.table.ExtensionTable import ir.armor.tachidesk.database.table.SourceTable import kotlinx.coroutines.runBlocking import okhttp3.Request @@ -63,7 +63,7 @@ fun installAPK(apkName: String): Int { val instance = classToLoad.newInstance() val extensionId = transaction { - return@transaction ExtensionsTable.select { ExtensionsTable.name eq extensionRecord.name }.first()[ExtensionsTable.id] + return@transaction ExtensionTable.select { ExtensionTable.name eq extensionRecord.name }.first()[ExtensionTable.id] } if (instance is HttpSource) { // single source @@ -110,7 +110,7 @@ fun installAPK(apkName: String): Int { // update extension info transaction { - ExtensionsTable.update({ ExtensionsTable.name eq extensionRecord.name }) { + ExtensionTable.update({ ExtensionTable.name eq extensionRecord.name }) { it[installed] = true it[classFQName] = className } @@ -139,11 +139,11 @@ fun removeExtension(pkgName: String) { val fileNameWithoutType = pkgName.substringBefore(".apk") val jarPath = "${Config.extensionsRoot}/$fileNameWithoutType.jar" transaction { - val extensionId = ExtensionsTable.select { ExtensionsTable.name eq extensionRecord.name }.first()[ExtensionsTable.id] + val extensionId = ExtensionTable.select { ExtensionTable.name eq extensionRecord.name }.first()[ExtensionTable.id] SourceTable.deleteWhere { SourceTable.extension eq extensionId } - ExtensionsTable.update({ ExtensionsTable.name eq extensionRecord.name }) { - it[ExtensionsTable.installed] = false + ExtensionTable.update({ ExtensionTable.name eq extensionRecord.name }) { + it[ExtensionTable.installed] = false } } @@ -155,7 +155,7 @@ fun removeExtension(pkgName: String) { val network: NetworkHelper by injectLazy() fun getExtensionIcon(apkName: String): Pair { - val iconUrl = transaction { ExtensionsTable.select { ExtensionsTable.apkName eq apkName }.firstOrNull()!! }[ExtensionsTable.iconUrl] + val iconUrl = transaction { ExtensionTable.select { ExtensionTable.apkName eq apkName }.firstOrNull()!! }[ExtensionTable.iconUrl] val saveDir = "${Config.extensionsRoot}/icon" val fileName = apkName diff --git a/server/src/main/kotlin/ir/armor/tachidesk/util/ExtensionsList.kt b/server/src/main/kotlin/ir/armor/tachidesk/util/ExtensionsList.kt index bed95bb9..346c7613 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/util/ExtensionsList.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/util/ExtensionsList.kt @@ -7,9 +7,8 @@ package ir.armor.tachidesk.util import eu.kanade.tachiyomi.extension.api.ExtensionGithubApi import eu.kanade.tachiyomi.extension.model.Extension import ir.armor.tachidesk.database.dataclass.ExtensionDataClass -import ir.armor.tachidesk.database.table.ExtensionsTable +import ir.armor.tachidesk.database.table.ExtensionTable import kotlinx.coroutines.runBlocking -import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq import org.jetbrains.exposed.sql.insert import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll @@ -22,7 +21,7 @@ private object Data { private fun extensionDatabaseIsEmtpy(): Boolean { return transaction { - return@transaction ExtensionsTable.selectAll().count() == 0L + return@transaction ExtensionTable.selectAll().count() == 0L } } @@ -37,10 +36,10 @@ fun getExtensionList(offline: Boolean = false): List { foundExtensions = api.findExtensions() transaction { foundExtensions.forEach { foundExtension -> - val extensionRecord = ExtensionsTable.select { ExtensionsTable.name eq foundExtension.name }.firstOrNull() + val extensionRecord = ExtensionTable.select { ExtensionTable.name eq foundExtension.name }.firstOrNull() if (extensionRecord != null) { // update the record - ExtensionsTable.update({ ExtensionsTable.name eq foundExtension.name }) { + ExtensionTable.update({ ExtensionTable.name eq foundExtension.name }) { it[name] = foundExtension.name it[pkgName] = foundExtension.pkgName it[versionName] = foundExtension.versionName @@ -52,7 +51,7 @@ fun getExtensionList(offline: Boolean = false): List { } } else { // insert new record - ExtensionsTable.insert { + ExtensionTable.insert { it[name] = foundExtension.name it[pkgName] = foundExtension.pkgName it[versionName] = foundExtension.versionName @@ -71,18 +70,18 @@ fun getExtensionList(offline: Boolean = false): List { } return transaction { - return@transaction ExtensionsTable.selectAll().map { + return@transaction ExtensionTable.selectAll().map { ExtensionDataClass( - it[ExtensionsTable.name], - it[ExtensionsTable.pkgName], - it[ExtensionsTable.versionName], - it[ExtensionsTable.versionCode], - it[ExtensionsTable.lang], - it[ExtensionsTable.isNsfw], - it[ExtensionsTable.apkName], - getExtensionIconUrl(it[ExtensionsTable.apkName]), - it[ExtensionsTable.installed], - it[ExtensionsTable.classFQName] + it[ExtensionTable.name], + it[ExtensionTable.pkgName], + it[ExtensionTable.versionName], + it[ExtensionTable.versionCode], + it[ExtensionTable.lang], + it[ExtensionTable.isNsfw], + it[ExtensionTable.apkName], + getExtensionIconUrl(it[ExtensionTable.apkName]), + it[ExtensionTable.installed], + it[ExtensionTable.classFQName] ) } } diff --git a/server/src/main/kotlin/ir/armor/tachidesk/util/SourceList.kt b/server/src/main/kotlin/ir/armor/tachidesk/util/SourceList.kt index 7d6e9143..9a6c53ff 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/util/SourceList.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/util/SourceList.kt @@ -10,7 +10,7 @@ import ir.armor.tachidesk.Config import ir.armor.tachidesk.database.dataclass.SourceDataClass import ir.armor.tachidesk.database.entity.ExtensionEntity import ir.armor.tachidesk.database.entity.SourceEntity -import ir.armor.tachidesk.database.table.ExtensionsTable +import ir.armor.tachidesk.database.table.ExtensionTable import ir.armor.tachidesk.database.table.SourceTable import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.selectAll @@ -78,7 +78,7 @@ fun getSourceList(): List { it[SourceTable.id].value.toString(), it[SourceTable.name], Locale(it[SourceTable.lang]).getDisplayLanguage(Locale(it[SourceTable.lang])), - getExtensionIconUrl(ExtensionsTable.select { ExtensionsTable.id eq it[SourceTable.extension] }.first()[ExtensionsTable.apkName]), + getExtensionIconUrl(ExtensionTable.select { ExtensionTable.id eq it[SourceTable.extension] }.first()[ExtensionTable.apkName]), getHttpSource(it[SourceTable.id].value).supportsLatest ) } @@ -93,7 +93,7 @@ fun getSource(sourceId: Long): SourceDataClass { source[SourceTable.id].value.toString(), source[SourceTable.name], Locale(source[SourceTable.lang]).getDisplayLanguage(Locale(source[SourceTable.lang])), - ExtensionsTable.select { ExtensionsTable.id eq source[SourceTable.extension] }.first()[ExtensionsTable.iconUrl], + ExtensionTable.select { ExtensionTable.id eq source[SourceTable.extension] }.first()[ExtensionTable.iconUrl], getHttpSource(source[SourceTable.id].value).supportsLatest ) }