From 6f0ff2da7c3af144600f1d5872939bc8fb95cdfb Mon Sep 17 00:00:00 2001 From: bskjon Date: Sat, 22 Feb 2025 01:53:25 +0100 Subject: [PATCH] Updated UI --- .../mediaprocessing/ui/Configuration.kt | 4 ++ .../mediaprocessing/ui/UIApplication.kt | 3 +- .../ui/explorer/ExplorerCore.kt | 2 +- .../ui/service/FileRegisterService.kt | 60 ------------------ .../ui/socket/UnprocessedFilesTopic.kt | 63 +++++++++++++++++++ .../common/contract/dto/EventRequest.kt | 5 +- 6 files changed, 73 insertions(+), 64 deletions(-) delete mode 100644 apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/service/FileRegisterService.kt create mode 100644 apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/socket/UnprocessedFilesTopic.kt diff --git a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/Configuration.kt b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/Configuration.kt index 5a6a479a..f836ee6a 100644 --- a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/Configuration.kt +++ b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/Configuration.kt @@ -3,6 +3,7 @@ package no.iktdev.mediaprocessing.ui import no.iktdev.mediaprocessing.shared.common.Defaults import no.iktdev.mediaprocessing.shared.common.socket.SocketImplementation import org.springframework.beans.factory.annotation.Value +import org.springframework.boot.web.client.RestTemplateBuilder import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory import org.springframework.boot.web.server.WebServerFactoryCustomizer import org.springframework.context.annotation.Bean @@ -15,6 +16,8 @@ import org.springframework.web.servlet.config.annotation.CorsRegistry import org.springframework.web.servlet.config.annotation.PathMatchConfigurer import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry import org.springframework.web.servlet.config.annotation.WebMvcConfigurer +import org.springframework.web.util.DefaultUriBuilderFactory +import org.springframework.web.util.UriTemplateHandler @Configuration @@ -53,6 +56,7 @@ class ApiCommunicationConfig { @Bean fun coordinatorTemplate(): RestTemplate { val restTemplate = RestTemplate() + restTemplate.uriTemplateHandler = DefaultUriBuilderFactory(UIEnv.coordinatorUrl) return restTemplate } } diff --git a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/UIApplication.kt b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/UIApplication.kt index 08bef36a..d9ee2018 100644 --- a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/UIApplication.kt +++ b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/UIApplication.kt @@ -35,7 +35,7 @@ class UIApplication { } } -private lateinit var eventsDatabase: EventsDatabase +lateinit var eventsDatabase: EventsDatabase lateinit var taskManager: TasksManager @@ -47,7 +47,6 @@ fun getContext(): ApplicationContext? { return context } -val fileRegister: ObservableMap = observableMapOf() fun main(args: Array) { diff --git a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/explorer/ExplorerCore.kt b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/explorer/ExplorerCore.kt index 9887a476..14c82c64 100644 --- a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/explorer/ExplorerCore.kt +++ b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/explorer/ExplorerCore.kt @@ -70,7 +70,7 @@ class ExplorerCore { } fun getHomeCursor(): ExplorerCursor? { - return getCursor(SharedConfig.incomingContent.absolutePath) + return getCursor(SharedConfig.inputRoot.absolutePath) } } \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/service/FileRegisterService.kt b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/service/FileRegisterService.kt deleted file mode 100644 index e9a5dc7b..00000000 --- a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/service/FileRegisterService.kt +++ /dev/null @@ -1,60 +0,0 @@ -package no.iktdev.mediaprocessing.ui.service - -import dev.vishna.watchservice.KWatchEvent -import dev.vishna.watchservice.asWatchChannel -import kotlinx.coroutines.channels.consumeEach -import kotlinx.coroutines.launch -import no.iktdev.mediaprocessing.shared.common.SharedConfig -import no.iktdev.mediaprocessing.ui.explorer.ExplorerCore -import no.iktdev.mediaprocessing.ui.fileRegister -import no.iktdev.mediaprocessing.ui.ioCoroutine -import org.springframework.stereotype.Service -import java.io.File -import java.math.BigInteger -import java.security.MessageDigest - -@Service -class FileRegisterService { - val watcherChannel = SharedConfig.incomingContent.asWatchChannel() - val core = ExplorerCore() - - fun fid(name: String): String { - val md = MessageDigest.getInstance("MD5") - return BigInteger(1, md.digest(name.toByteArray())).toString(16).padStart(32, '0') - } - - private fun addFileToIndex(it: KWatchEvent) { - core.fromFile(it.file)?.let { info -> - val fid = fid(it.file.name) - fileRegister.put(fid, info) - } - } - private fun indexItemsInFolder(it: File) { - - } - - private fun indexItems() { - - } - - init { - ioCoroutine.launch { - watcherChannel.consumeEach { - when (it.kind) { - KWatchEvent.Kind.Created, KWatchEvent.Kind.Modified, KWatchEvent.Kind.Initialized -> { - if (it.file.isDirectory) { - indexItemsInFolder(it.file) - } else { - addFileToIndex(it) - } - } - KWatchEvent.Kind.Deleted -> { - val fid = fid(it.file.name) - fileRegister.remove(fid) - } - } - } - } - } - -} \ No newline at end of file diff --git a/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/socket/UnprocessedFilesTopic.kt b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/socket/UnprocessedFilesTopic.kt new file mode 100644 index 00000000..f4d3b824 --- /dev/null +++ b/apps/ui/src/main/kotlin/no/iktdev/mediaprocessing/ui/socket/UnprocessedFilesTopic.kt @@ -0,0 +1,63 @@ +package no.iktdev.mediaprocessing.ui.socket + +import no.iktdev.eventi.database.withTransaction +import no.iktdev.mediaprocessing.shared.common.contract.dto.EventRequest +import no.iktdev.mediaprocessing.shared.common.database.tables.files +import no.iktdev.mediaprocessing.shared.common.database.tables.filesProcessed +import no.iktdev.mediaprocessing.ui.UIEnv +import no.iktdev.mediaprocessing.ui.eventsDatabase +import org.jetbrains.exposed.sql.select +import org.jetbrains.exposed.sql.selectAll +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.messaging.handler.annotation.MessageMapping +import org.springframework.messaging.handler.annotation.Payload +import org.springframework.messaging.simp.SimpMessagingTemplate +import org.springframework.scheduling.annotation.EnableScheduling +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Controller +import org.springframework.web.client.RestTemplate +import java.io.File + +@Controller +@EnableScheduling +class UnprocessedFilesTopic( + @Autowired private val template: SimpMessagingTemplate?, + @Autowired private val coordinatorTemplate: RestTemplate, +) { + fun pullUnprocessedFiles(): List = withTransaction(eventsDatabase.database) { + files.select { + files.checksum notInSubQuery filesProcessed.slice(filesProcessed.checksum).selectAll() + }.mapNotNull { + FileInfo( + it[files.baseName], + it[files.fileName], + it[files.checksum] + ) + }.filter { File(it.fileName).exists() } + } ?: emptyList() + + + @MessageMapping("/files") + fun getUnprocessedFiles() { + refreshUnprocessedFiles() + } + @MessageMapping("/request/process") + fun requestProcess(@Payload data: EventRequest) { + val req = coordinatorTemplate.postForEntity("/request/all", data, String::class.java) + log.info { "RequestProcess report:\n\tStatus: ${req.statusCode}\n\tMessage: ${req.body}" } + } + + + + @Scheduled(fixedDelay = 5_000) + fun refreshUnprocessedFiles() { + val unprocessedFiles = pullUnprocessedFiles() + template?.convertAndSend("/topic/files/unprocessed", unprocessedFiles) + } +} + +data class FileInfo( + val name: String, + val fileName: String, + val checksum: String +) \ No newline at end of file diff --git a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/dto/EventRequest.kt b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/dto/EventRequest.kt index d80aeb32..cfb1a5ce 100644 --- a/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/dto/EventRequest.kt +++ b/shared/common/src/main/kotlin/no/iktdev/mediaprocessing/shared/common/contract/dto/EventRequest.kt @@ -1,6 +1,9 @@ package no.iktdev.mediaprocessing.shared.common.contract.dto +import no.iktdev.mediaprocessing.shared.common.contract.ProcessType + data class EventRequest( val file: String, // FullPath - override val source: String + override val source: String, + val mode: ProcessType = ProcessType.MANUAL ): Requester() \ No newline at end of file