From 35470b86057e1dcfeed45968e265664aa419ef3f Mon Sep 17 00:00:00 2001 From: Aria Moradi Date: Wed, 28 Dec 2022 17:26:02 +0330 Subject: [PATCH] multi-user experiment --- .../suwayomi/tachidesk/server/JavalinSetup.kt | 4 +- .../tachidesk/server/database/DBManager.kt | 45 ++++++++++++++----- .../tachidesk/server/model/table/User.kt | 10 +++++ 3 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 server/src/main/kotlin/suwayomi/tachidesk/server/model/table/User.kt diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt index 7ccce731..bdd46aae 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/JavalinSetup.kt @@ -25,10 +25,10 @@ import org.kodein.di.conf.global import org.kodein.di.instance import suwayomi.tachidesk.global.GlobalAPI import suwayomi.tachidesk.manga.MangaAPI +import suwayomi.tachidesk.server.database.DBManager.databaseForUser import suwayomi.tachidesk.server.util.Browser import suwayomi.tachidesk.server.util.setupWebInterface import java.io.IOException -import java.lang.IllegalArgumentException import java.util.concurrent.CompletableFuture import kotlin.concurrent.thread @@ -66,6 +66,8 @@ object JavalinSetup { ctx.header("WWW-Authenticate", "Basic") ctx.status(401).json("Unauthorized") } else { + val username = if (serverConfig.basicAuthEnabled) serverConfig.basicAuthUsername else "default-user" + ctx.attribute("db", databaseForUser(username)) handler.handle(ctx) } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/database/DBManager.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/database/DBManager.kt index 4c4e9282..129defe7 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/server/database/DBManager.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/database/DBManager.kt @@ -19,27 +19,50 @@ import suwayomi.tachidesk.server.ApplicationDirs import suwayomi.tachidesk.server.ServerConfig object DBManager { + private val logger = KotlinLogging.logger {} - val db by lazy { + val masterDB by lazy { val applicationDirs by DI.global.instance() + Database.connect( - "jdbc:h2:${applicationDirs.dataRoot}/database", + "jdbc:h2:${applicationDirs.dataRoot}/server", "org.h2.Driver", databaseConfig = DatabaseConfig { useNestedTransactions = true } ) } -} -private val logger = KotlinLogging.logger {} - -fun databaseUp(db: Database = DBManager.db) { - // call db to initialize the lazy object - logger.info { - "Using ${db.vendor} database version ${db.version}" + fun masterDbUp() { + val db = masterDB + logger.info { "Initialized masterDb: ${masterDB.url}" } } - val migrations = loadMigrationsFrom("suwayomi.tachidesk.server.database.migration", ServerConfig::class.java) - runMigrations(migrations) + private val usersDatabases = mutableMapOf() + fun databaseForUser(username: String) { + usersDatabases.getOrElse(username) { + val applicationDirs by DI.global.instance() + + // call db to initialize the lazy object + logger.info { + "initializing database for user $username" + } + + val database = Database.connect( + "jdbc:h2:${applicationDirs.dataRoot}/server", + "org.h2.Driver", + databaseConfig = DatabaseConfig { + useNestedTransactions = true + } + ) + + val migrations = + loadMigrationsFrom("suwayomi.tachidesk.server.database.migration", ServerConfig::class.java) + runMigrations(migrations, database) + + usersDatabases[username] = database + + database + } + } } diff --git a/server/src/main/kotlin/suwayomi/tachidesk/server/model/table/User.kt b/server/src/main/kotlin/suwayomi/tachidesk/server/model/table/User.kt new file mode 100644 index 00000000..3eb294cd --- /dev/null +++ b/server/src/main/kotlin/suwayomi/tachidesk/server/model/table/User.kt @@ -0,0 +1,10 @@ +package suwayomi.tachidesk.server.model.table + +/* + * 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/. */ + +class User