Manga database classes, api url change, fix source id

This commit is contained in:
Aria Moradi 2020-12-25 17:16:26 +03:30
parent 5597ad66b4
commit ab33a0ef1d
12 changed files with 105 additions and 22 deletions

View File

@ -20,21 +20,32 @@ class Main {
ctx.header("Access-Control-Allow-Origin", "*") // allow the client which is running on another port ctx.header("Access-Control-Allow-Origin", "*") // allow the client which is running on another port
} }
app.get("/api/v1/extensions") { ctx -> app.get("/api/v1/extension/list") { ctx ->
ctx.json(getExtensionList()) ctx.json(getExtensionList())
} }
app.get("/api/v1/extensions/install/:apkName") { ctx -> app.get("/api/v1/extension/install/:apkName") { ctx ->
val apkName = ctx.pathParam("apkName") val apkName = ctx.pathParam("apkName")
println(apkName) println(apkName)
ctx.status( ctx.status(
installAPK(apkName) installAPK(apkName)
) )
} }
app.get("/api/v1/sources/") { ctx -> app.get("/api/v1/source/list") { ctx ->
ctx.json(getSourceList()) ctx.json(getSourceList())
} }
app.get("/api/v1/source/:source_id/popular") { ctx ->
val sourceId = ctx.pathParam("source_id")
ctx.json(getPopularManga(sourceId))
}
}
private fun getPopularManga(sourceId: String): List<Any> {
TODO("Not yet implemented")
} }
} }
} }

View File

@ -2,6 +2,7 @@ package ir.armor.tachidesk.database
import ir.armor.tachidesk.Config import ir.armor.tachidesk.Config
import ir.armor.tachidesk.database.table.ExtensionsTable import ir.armor.tachidesk.database.table.ExtensionsTable
import ir.armor.tachidesk.database.table.MangasTable
import ir.armor.tachidesk.database.table.SourcesTable import ir.armor.tachidesk.database.table.SourcesTable
import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.SchemaUtils import org.jetbrains.exposed.sql.SchemaUtils
@ -20,5 +21,6 @@ fun makeDataBaseTables() {
transaction { transaction {
SchemaUtils.create(ExtensionsTable) SchemaUtils.create(ExtensionsTable)
SchemaUtils.create(SourcesTable) SchemaUtils.create(SourcesTable)
SchemaUtils.create(MangasTable)
} }
} }

View File

@ -0,0 +1,19 @@
package ir.armor.tachidesk.database.dataclass
import ir.armor.tachidesk.database.table.MangaStatus
data class MangaDataClass(
val sourceId: Long,
val url: String,
val title: String,
val thumbnail_url: String? = null,
val initialized: Boolean = false,
val artist: String? = null,
val author: String? = null,
val description: String? = null,
val genre: String? = null,
val status: String = MangaStatus.UNKNOWN.name
)

View File

@ -0,0 +1,24 @@
package ir.armor.tachidesk.database.entity
import ir.armor.tachidesk.database.table.MangasTable
import ir.armor.tachidesk.database.table.SourcesTable
import org.jetbrains.exposed.dao.IntEntity
import org.jetbrains.exposed.dao.IntEntityClass
import org.jetbrains.exposed.dao.id.EntityID
class MangaEntity(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<MangaEntity>(MangasTable)
var url by MangasTable.url
var title by MangasTable.title
var initialized by MangasTable.initialized
var artist by MangasTable.artist
var author by MangasTable.author
var description by MangasTable.description
var genre by MangasTable.genre
var status by MangasTable.status
var thumbnail_url by MangasTable.thumbnail_url
var sourceReference by MangaEntity referencedOn MangasTable.sourceReference
}

View File

@ -1,14 +1,13 @@
package ir.armor.tachidesk.database.entity package ir.armor.tachidesk.database.entity
import ir.armor.tachidesk.database.table.SourcesTable import ir.armor.tachidesk.database.table.SourcesTable
import org.jetbrains.exposed.dao.IntEntity import org.jetbrains.exposed.dao.*
import org.jetbrains.exposed.dao.IntEntityClass
import org.jetbrains.exposed.dao.id.EntityID import org.jetbrains.exposed.dao.id.EntityID
class SourceEntity(id: EntityID<Int>) : IntEntity(id) { class SourceEntity(id: EntityID<Long>) : LongEntity(id) {
companion object : IntEntityClass<SourceEntity>(SourcesTable) companion object : EntityClass<Long, SourceEntity>(SourcesTable, null)
var sourceId by SourcesTable.sourceId var sourceId by SourcesTable.id
var name by SourcesTable.name var name by SourcesTable.name
var lang by SourcesTable.lang var lang by SourcesTable.lang
var extension by ExtensionEntity referencedOn SourcesTable.extension var extension by ExtensionEntity referencedOn SourcesTable.extension

View File

@ -0,0 +1,26 @@
package ir.armor.tachidesk.database.table
import org.jetbrains.exposed.dao.id.IntIdTable
object MangasTable : IntIdTable() {
val url = varchar("url", 2048)
val title = varchar("title", 512)
val initialized = bool("initialized").default(false)
val artist = varchar("artist", 64).nullable()
val author = varchar("author", 64).nullable()
val description = varchar("description", 4096).nullable()
val genre = varchar("genre", 1024).nullable()
val status = enumeration("status", MangaStatus::class).default(MangaStatus.UNKNOWN)
val thumbnail_url = varchar("thumbnail_url", 2048).nullable()
// source is used by some ancestor of IntIdTable
val sourceReference = reference("source", SourcesTable)
}
enum class MangaStatus(val status: Int) {
UNKNOWN(0),
ONGOING(1),
COMPLETED(2),
LICENSED(3),
}

View File

@ -1,9 +1,9 @@
package ir.armor.tachidesk.database.table package ir.armor.tachidesk.database.table
import org.jetbrains.exposed.dao.id.IntIdTable import org.jetbrains.exposed.dao.id.IdTable
object SourcesTable : IntIdTable() { object SourcesTable : IdTable<Long>() {
val sourceId = long("source_id") override val id = long("id").entityId()
val name= varchar("name", 128) val name= varchar("name", 128)
val lang = varchar("lang", 5) val lang = varchar("lang", 5)
val extension = reference("extension", ExtensionsTable) val extension = reference("extension", ExtensionsTable)

View File

@ -68,9 +68,9 @@ fun installAPK(apkName: String): Int {
// name = httpSource.name // name = httpSource.name
// this.extension = ExtensionEntity.find { ExtensionsTable.name eq extension.name }.first().id // this.extension = ExtensionEntity.find { ExtensionsTable.name eq extension.name }.first().id
// } // }
if (SourcesTable.select { SourcesTable.sourceId eq httpSource.id }.count() == 0L) { if (SourcesTable.select { SourcesTable.id eq httpSource.id }.count() == 0L) {
SourcesTable.insert { SourcesTable.insert {
it[this.sourceId] = httpSource.id it[this.id] = httpSource.id
it[name] = httpSource.name it[name] = httpSource.name
it[this.lang] = httpSource.lang it[this.lang] = httpSource.lang
it[extension] = extensionId it[extension] = extensionId
@ -86,9 +86,9 @@ fun installAPK(apkName: String): Int {
transaction { transaction {
sourceFactory.createSources().forEachIndexed { index, source -> sourceFactory.createSources().forEachIndexed { index, source ->
val httpSource = source as HttpSource val httpSource = source as HttpSource
if (SourcesTable.select { SourcesTable.sourceId eq httpSource.id }.count() == 0L) { if (SourcesTable.select { SourcesTable.id eq httpSource.id }.count() == 0L) {
SourcesTable.insert { SourcesTable.insert {
it[this.sourceId] = httpSource.id it[this.id] = httpSource.id
it[name] = httpSource.name it[name] = httpSource.name
it[this.lang] = httpSource.lang it[this.lang] = httpSource.lang
it[extension] = extensionId it[extension] = extensionId

View File

@ -0,0 +1,2 @@
package ir.armor.tachidesk.util

View File

@ -18,7 +18,7 @@ import java.net.URLClassLoader
fun getHttpSource(sourceId: Long): HttpSource { fun getHttpSource(sourceId: Long): HttpSource {
return transaction { return transaction {
val sourceRecord = SourceEntity.find { SourcesTable.sourceId eq sourceId }.first() val sourceRecord = SourceEntity.get(sourceId)
val extensionId = sourceRecord.extension.id.value val extensionId = sourceRecord.extension.id.value
val extensionRecord = ExtensionEntity.get(extensionId) val extensionRecord = ExtensionEntity.get(extensionId)
val apkName = extensionRecord.apkName val apkName = extensionRecord.apkName
@ -44,11 +44,11 @@ fun getSourceList(): List<SourceDataClass> {
return transaction { return transaction {
return@transaction SourcesTable.selectAll().map { return@transaction SourcesTable.selectAll().map {
SourceDataClass( SourceDataClass(
it[SourcesTable.sourceId], it[SourcesTable.id].value,
it[SourcesTable.name], it[SourcesTable.name],
it[SourcesTable.lang], it[SourcesTable.lang],
ExtensionsTable.select { ExtensionsTable.id eq it[SourcesTable.extension] }.first()[ExtensionsTable.iconUrl], ExtensionsTable.select { ExtensionsTable.id eq it[SourcesTable.extension] }.first()[ExtensionsTable.iconUrl],
getHttpSource(it[SourcesTable.sourceId]).supportsLatest getHttpSource(it[SourcesTable.id].value).supportsLatest
) )
} }
} }

View File

@ -15,7 +15,7 @@ function Extensions() {
if (extensions.length === 0) { if (extensions.length === 0) {
mapped = <h3>wait</h3>; mapped = <h3>wait</h3>;
fetch('http://127.0.0.1:4567/api/v1/extensions') fetch('http://127.0.0.1:4567/api/v1/extension/list')
.then((response) => response.json()) .then((response) => response.json())
.then((data) => setExtensions(data)); .then((data) => setExtensions(data));
} else { } else {
@ -31,7 +31,7 @@ function Sources() {
if (sources.length === 0) { if (sources.length === 0) {
mapped = <h3>wait</h3>; mapped = <h3>wait</h3>;
fetch('http://127.0.0.1:4567/api/v1/sources') fetch('http://127.0.0.1:4567/api/v1/source/list')
.then((response) => response.json()) .then((response) => response.json())
.then((data) => setSources(data)); .then((data) => setSources(data));
} else { } else {

View File

@ -49,7 +49,7 @@ export default function ExtensionCard(props: IProps) {
function install() { function install() {
setInstalledState('installing'); setInstalledState('installing');
fetch(`http://127.0.0.1:4567/api/v1/extensions/install/${apkName}`).then(() => { fetch(`http://127.0.0.1:4567/api/v1/extension/install/${apkName}`).then(() => {
setInstalledState('installed'); setInstalledState('installed');
}); });
} }