Skip to content

Commit

Permalink
✨ Init database component (#116)
Browse files Browse the repository at this point in the history
  • Loading branch information
guiyanakuang committed Dec 1, 2023
1 parent 7ff3112 commit 77d38c9
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 69 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.clipevery.config

enum class FileType {
USER,
APP,
LOG
LOG,
ENCRYPT,
DATA,
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,23 @@ import com.clipevery.config.FileType
import java.nio.file.Path

interface PathProvider {
fun resolve(fileName: String, fileType: FileType): Path {
return when (fileType) {
FileType.USER -> resolveUser(fileName)
FileType.APP -> resolveApp(fileName)
FileType.LOG -> resolveLog(fileName)
fun resolve(fileName: String?, fileType: FileType): Path {
val path = when (fileType) {
FileType.USER -> clipUserPath
FileType.LOG -> clipUserPath.resolve("logs")
FileType.ENCRYPT -> clipUserPath.resolve("encrypt")
FileType.DATA -> clipUserPath.resolve("data")
}

if (!path.toFile().exists()) {
path.toFile().mkdirs()
}
}

fun resolveUser(fileName: String?): Path
return fileName?.let {
path.resolve(fileName)
} ?: path
}

fun resolveApp(fileName: String?): Path
val clipUserPath: Path

fun resolveLog(fileName: String?): Path
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@ package com.clipevery.data
import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver
import com.clipevery.Database
import com.clipevery.config.FileType
import com.clipevery.path.getPathProvider
import java.nio.file.Path

actual class DriverFactory {

private val dbFilePath: Path = getPathProvider().resolve("clipevery.db", FileType.DATA)

actual fun createDriver(): SqlDriver {
val driver: SqlDriver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY)
val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite:${dbFilePath.toAbsolutePath()}")
Database.Schema.create(driver)
return driver
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.clipevery.encrypt

import com.clipevery.config.FileType
import com.clipevery.model.AppInfo
import com.clipevery.macos.MacosKeychainHelper
import com.clipevery.path.getPathProvider
Expand All @@ -23,7 +24,8 @@ fun getSignalProtocolFactory(appInfo: AppInfo): SignalProtocolFactory {

class MacosSignalProtocolFactory(private val appInfo: AppInfo): SignalProtocolFactory {

private val filePersist = DesktopOneFilePersist(getPathProvider().resolveUser("signal.data"))
private val filePersist = DesktopOneFilePersist(getPathProvider()
.resolve("signal.data", FileType.ENCRYPT))

override fun createSignalProtocol(): SignalProtocolWithState {
val file = filePersist.path.toFile()
Expand Down Expand Up @@ -82,7 +84,8 @@ class MacosSignalProtocolFactory(private val appInfo: AppInfo): SignalProtocolFa

class WindowsSignalProtocolFactory : SignalProtocolFactory {

private val filePersist = DesktopOneFilePersist(getPathProvider().resolveUser("signal.data"))
private val filePersist = DesktopOneFilePersist(getPathProvider()
.resolve("signal.data", FileType.ENCRYPT))

override fun createSignalProtocol(): SignalProtocolWithState {
val file = filePersist.path.toFile()
Expand Down
5 changes: 4 additions & 1 deletion composeApp/src/desktopMain/kotlin/com/clipevery/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import com.clipevery.clip.TransferableConsumer
import com.clipevery.clip.getDesktopClipboardService
import com.clipevery.config.ConfigManager
import com.clipevery.config.DefaultConfigManager
import com.clipevery.config.FileType
import com.clipevery.data.DriverFactory
import com.clipevery.encrypt.SignalProtocol
import com.clipevery.encrypt.SignalProtocolWithState
import com.clipevery.encrypt.getSignalProtocolFactory
Expand Down Expand Up @@ -67,6 +69,7 @@ fun initKoinApplication(ioScope: CoroutineScope): KoinApplication {
single<ClipboardService> { getDesktopClipboardService(get()) }
single<TransferableConsumer> { DesktopTransferableConsumer() }
single<GlobalListener> { GlobalListener() }
single<DriverFactory> { DriverFactory() }
}
return startKoin {
modules(appModule)
Expand All @@ -75,7 +78,7 @@ fun initKoinApplication(ioScope: CoroutineScope): KoinApplication {

fun main() = application {
val pathProvider = getPathProvider()
initLogger(pathProvider.resolveLog("clipevery.log").pathString)
initLogger(pathProvider.resolve("clipevery.log", FileType.LOG).pathString)
val logger = KotlinLogging.logger {}

logger.info { "Starting Clipevery" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import com.clipevery.model.AppHostInfo
import com.clipevery.model.AppRequestBindInfo
import com.clipevery.platform.currentPlatform
import io.github.oshai.kotlinlogging.KotlinLogging
import io.ktor.server.application.ApplicationStarted
import io.ktor.server.application.call
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty
import io.ktor.server.netty.NettyApplicationEngine
import io.ktor.server.response.respondText
import io.ktor.server.routing.get
import io.ktor.server.routing.routing
import kotlinx.coroutines.runBlocking
import java.net.NetworkInterface
import java.util.Collections

Expand All @@ -31,7 +33,12 @@ class DesktopClipServer(private val signalProtocol: SignalProtocol): ClipServer

override fun start(): ClipServer {
server.start(wait = false)
logger.info { "start server ${port()}" }
runBlocking {
server.environment.monitor.subscribe(ApplicationStarted) {
val actualPort = server.environment.connectors.map { it.port }.first()
logger.info { "Server started on port: $actualPort" }
}
}
return this
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,31 +22,13 @@ class WindowsPathProvider: PathProvider {

private val userHomePath = System.getProperty("user.home")

private val userDir = System.getProperty("user.dir")

override fun resolveUser(fileName: String?): Path {
return fileName?.let {
Paths.get(userHomePath).resolve(".clipevery").resolve(fileName)
} ?: Paths.get(userHomePath).resolve(".clipevery")
}

override fun resolveApp(fileName: String?): Path {
return fileName?.let {
Paths.get(userDir).resolve(fileName)
} ?: Paths.get(userDir)
}

override fun resolveLog(fileName: String?): Path {
return fileName?.let {
Paths.get(userDir).resolve("logs").resolve(fileName)
} ?: Paths.get(userDir).resolve("logs")
}
override val clipUserPath: Path = Paths.get(userHomePath).resolve(".clipevery")
}


class MacosPathProvider: PathProvider {

private val appPath = System.getProperty("jpackage.app-path")
override val clipUserPath: Path = getAppSupportPath()

private fun getAppSupportPath(): Path {
val userHome = System.getProperty("user.home")
Expand All @@ -59,38 +41,9 @@ class MacosPathProvider: PathProvider {
return appSupportPath
}

override fun resolveUser(fileName: String?): Path {
return fileName?.let {
getAppSupportPath().resolve(fileName)
} ?: getAppSupportPath()
}

override fun resolveApp(fileName: String?): Path {
val appPath = Paths.get(appPath).parent.parent

return fileName?.let {
appPath.resolve(fileName)
} ?: appPath
}

override fun resolveLog(fileName: String?): Path {
return fileName?.let {
getAppSupportPath().resolve("logs").resolve(fileName)
} ?: getAppSupportPath().resolve("logs")
}
}

class LinuxPathProvider: PathProvider {

override fun resolveUser(fileName: String?): Path {
TODO("Not yet implemented")
}

override fun resolveApp(fileName: String?): Path {
TODO("Not yet implemented")
}

override fun resolveLog(fileName: String?): Path {
TODO("Not yet implemented")
}
override val clipUserPath: Path
get() = TODO("Not yet implemented")
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.clipevery.path

import com.clipevery.config.FileType
import com.clipevery.platform.currentPlatform
import org.junit.Test
import kotlin.test.assertEquals

Expand All @@ -9,9 +11,14 @@ class PathProviderTest {
fun testPathProvider() {
val pathProvider = getPathProvider()

val configPath = pathProvider.resolveUser("test.config")
val configPath = pathProvider.resolve("test.config", FileType.USER)

assertEquals("test.config", configPath.fileName.toString())
assertEquals(".clipevery", configPath.parent.fileName.toString())
val currentPlatform = currentPlatform()
if (currentPlatform.isMacos()) {
assertEquals("Clipevery", configPath.parent.fileName.toString())
} else if (currentPlatform.isWindows()) {
assertEquals(".clipevery", configPath.parent.fileName.toString())
}
}
}

0 comments on commit 77d38c9

Please sign in to comment.