mirror of
https://github.com/Suwayomi/Suwayomi-Server.git
synced 2026-07-04 19:34:35 -05:00
187 lines
6.1 KiB
Kotlin
187 lines
6.1 KiB
Kotlin
package suwayomi.tachidesk.manga.controller
|
|
|
|
/*
|
|
* Copyright (C) Contributors to the Suwayomi project
|
|
*
|
|
* 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 io.javalin.http.Context
|
|
import io.javalin.http.HttpCode
|
|
import suwayomi.tachidesk.manga.impl.CategoryManga
|
|
import suwayomi.tachidesk.manga.impl.Chapter
|
|
import suwayomi.tachidesk.manga.impl.Library
|
|
import suwayomi.tachidesk.manga.impl.Manga
|
|
import suwayomi.tachidesk.manga.impl.Page
|
|
import suwayomi.tachidesk.manga.impl.chapter.getChapterDownloadReady
|
|
import suwayomi.tachidesk.manga.model.dataclass.MangaDataClass
|
|
import suwayomi.tachidesk.server.JavalinSetup.future
|
|
import suwayomi.tachidesk.server.util.handler
|
|
import suwayomi.tachidesk.server.util.pathParam
|
|
import suwayomi.tachidesk.server.util.queryParam
|
|
import suwayomi.tachidesk.server.util.withOperation
|
|
|
|
object MangaController {
|
|
/** get manga info */
|
|
val retrieve = handler(
|
|
pathParam<Int>("mangaId"),
|
|
queryParam("onlineFetch", false),
|
|
documentWith = {
|
|
withOperation {
|
|
summary("Get a manga")
|
|
description("Get a manga from the database using a specific id")
|
|
}
|
|
},
|
|
behaviorOf = { ctx, mangaId, onlineFetch ->
|
|
ctx.future(
|
|
future {
|
|
Manga.getManga(mangaId, onlineFetch)
|
|
}
|
|
)
|
|
},
|
|
withResults = {
|
|
json<MangaDataClass>(HttpCode.OK)
|
|
httpCode(HttpCode.NOT_FOUND)
|
|
}
|
|
)
|
|
|
|
/** manga thumbnail */
|
|
fun thumbnail(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
val useCache = ctx.queryParam("useCache")?.toBoolean() ?: true
|
|
|
|
ctx.future(
|
|
future { Manga.getMangaThumbnail(mangaId, useCache) }
|
|
.thenApply {
|
|
ctx.header("content-type", it.second)
|
|
val httpCacheSeconds = 60 * 60 * 24
|
|
ctx.header("cache-control", "max-age=$httpCacheSeconds")
|
|
it.first
|
|
}
|
|
)
|
|
}
|
|
|
|
/** adds the manga to library */
|
|
fun addToLibrary(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
|
|
ctx.future(
|
|
future { Library.addMangaToLibrary(mangaId) }
|
|
)
|
|
}
|
|
|
|
/** removes the manga from the library */
|
|
fun removeFromLibrary(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
|
|
ctx.future(
|
|
future { Library.removeMangaFromLibrary(mangaId) }
|
|
)
|
|
}
|
|
|
|
/** list manga's categories */
|
|
fun categoryList(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
ctx.json(CategoryManga.getMangaCategories(mangaId))
|
|
}
|
|
|
|
/** adds the manga to category */
|
|
fun addToCategory(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
val categoryId = ctx.pathParam("categoryId").toInt()
|
|
CategoryManga.addMangaToCategory(mangaId, categoryId)
|
|
ctx.status(200)
|
|
}
|
|
|
|
/** removes the manga from the category */
|
|
fun removeFromCategory(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
val categoryId = ctx.pathParam("categoryId").toInt()
|
|
CategoryManga.removeMangaFromCategory(mangaId, categoryId)
|
|
ctx.status(200)
|
|
}
|
|
|
|
/** used to modify a manga's meta parameters */
|
|
fun meta(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
|
|
val key = ctx.formParam("key")!!
|
|
val value = ctx.formParam("value")!!
|
|
|
|
Manga.modifyMangaMeta(mangaId, key, value)
|
|
|
|
ctx.status(200)
|
|
}
|
|
|
|
/** get chapter list when showing a manga */
|
|
fun chapterList(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
|
|
val onlineFetch = ctx.queryParam("onlineFetch")?.toBoolean() ?: false
|
|
|
|
ctx.future(future { Chapter.getChapterList(mangaId, onlineFetch) })
|
|
}
|
|
|
|
/** used to display a chapter, get a chapter in order to show its pages */
|
|
fun chapterRetrieve(ctx: Context) {
|
|
val chapterIndex = ctx.pathParam("chapterIndex").toInt()
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
ctx.future(future { getChapterDownloadReady(chapterIndex, mangaId) })
|
|
}
|
|
|
|
/** used to modify a chapter's parameters */
|
|
fun chapterModify(ctx: Context) {
|
|
val chapterIndex = ctx.pathParam("chapterIndex").toInt()
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
|
|
val read = ctx.formParam("read")?.toBoolean()
|
|
val bookmarked = ctx.formParam("bookmarked")?.toBoolean()
|
|
val markPrevRead = ctx.formParam("markPrevRead")?.toBoolean()
|
|
val lastPageRead = ctx.formParam("lastPageRead")?.toInt()
|
|
|
|
Chapter.modifyChapter(mangaId, chapterIndex, read, bookmarked, markPrevRead, lastPageRead)
|
|
|
|
ctx.status(200)
|
|
}
|
|
|
|
/** delete a downloaded chapter */
|
|
fun chapterDelete(ctx: Context) {
|
|
val chapterIndex = ctx.pathParam("chapterIndex").toInt()
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
|
|
Chapter.deleteChapter(mangaId, chapterIndex)
|
|
|
|
ctx.status(200)
|
|
}
|
|
|
|
/** used to modify a chapter's meta parameters */
|
|
fun chapterMeta(ctx: Context) {
|
|
val chapterIndex = ctx.pathParam("chapterIndex").toInt()
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
|
|
val key = ctx.formParam("key")!!
|
|
val value = ctx.formParam("value")!!
|
|
|
|
Chapter.modifyChapterMeta(mangaId, chapterIndex, key, value)
|
|
|
|
ctx.status(200)
|
|
}
|
|
|
|
/** get page at index "index" */
|
|
fun pageRetrieve(ctx: Context) {
|
|
val mangaId = ctx.pathParam("mangaId").toInt()
|
|
val chapterIndex = ctx.pathParam("chapterIndex").toInt()
|
|
val index = ctx.pathParam("index").toInt()
|
|
val useCache = ctx.queryParam("useCache")?.toBoolean() ?: true
|
|
|
|
ctx.future(
|
|
future { Page.getPageImage(mangaId, chapterIndex, index, useCache) }
|
|
.thenApply {
|
|
ctx.header("content-type", it.second)
|
|
it.first
|
|
}
|
|
)
|
|
}
|
|
}
|