From db9c0b58d186fdeef799449ef7b41ccf30ba4b65 Mon Sep 17 00:00:00 2001 From: Maksim Pischulenok Date: Sun, 8 Jun 2025 23:35:06 +0300 Subject: [PATCH] Upload index.html on app startup --- .gitignore | 5 ++- .../bot/handler/ThisCommandHandlerService.kt | 5 ++- .../memestv/s3/FileUploaderService.kt | 20 ------------ .../memestv/upload/DummyFileUploadService.kt | 16 ++++++++++ .../memestv/upload/FileUploaderService.kt | 8 +++++ .../memestv/upload/IndexInitializer.kt | 31 +++++++++++++++++++ .../memestv/{s3 => upload}/S3Config.kt | 4 ++- .../memestv/upload/S3FileUploaderService.kt | 26 ++++++++++++++++ .../memestv/{s3 => upload}/S3Props.kt | 2 +- 9 files changed, 91 insertions(+), 26 deletions(-) delete mode 100644 src/main/kotlin/com/pischule/memestv/s3/FileUploaderService.kt create mode 100644 src/main/kotlin/com/pischule/memestv/upload/DummyFileUploadService.kt create mode 100644 src/main/kotlin/com/pischule/memestv/upload/FileUploaderService.kt create mode 100644 src/main/kotlin/com/pischule/memestv/upload/IndexInitializer.kt rename src/main/kotlin/com/pischule/memestv/{s3 => upload}/S3Config.kt (88%) create mode 100644 src/main/kotlin/com/pischule/memestv/upload/S3FileUploaderService.kt rename src/main/kotlin/com/pischule/memestv/{s3 => upload}/S3Props.kt (84%) diff --git a/.gitignore b/.gitignore index ca10150..2afa612 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,7 @@ out/ .kotlin -src/main/resources/application-local.properties \ No newline at end of file +src/main/resources/application-local.properties + +src/main/resources/static +!src/main/resources/static/index.html diff --git a/src/main/kotlin/com/pischule/memestv/bot/handler/ThisCommandHandlerService.kt b/src/main/kotlin/com/pischule/memestv/bot/handler/ThisCommandHandlerService.kt index e13d463..d836440 100644 --- a/src/main/kotlin/com/pischule/memestv/bot/handler/ThisCommandHandlerService.kt +++ b/src/main/kotlin/com/pischule/memestv/bot/handler/ThisCommandHandlerService.kt @@ -4,7 +4,7 @@ import com.github.kotlintelegrambot.dispatcher.handlers.MessageHandlerEnvironmen import com.github.kotlintelegrambot.entities.ChatId import com.github.kotlintelegrambot.entities.reaction.ReactionType import com.pischule.memestv.bot.BotProps -import com.pischule.memestv.s3.FileUploaderService +import com.pischule.memestv.upload.FileUploaderService import com.pischule.memestv.util.getMaxResPhotoId import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.withLoggingContext @@ -28,8 +28,7 @@ class ThisCommandHandlerService( val fileBytes = env.bot.downloadFileBytes(maxResPhotoId) ?: return logger.info { "Downloaded a file from Telegram" } - fileUploaderService.uploadFile(fileBytes) - logger.info { "Uploaded a file to S3" } + fileUploaderService.uploadFile(fileBytes, "_.jpeg") reactToMessage(env, "👍") } diff --git a/src/main/kotlin/com/pischule/memestv/s3/FileUploaderService.kt b/src/main/kotlin/com/pischule/memestv/s3/FileUploaderService.kt deleted file mode 100644 index 6768714..0000000 --- a/src/main/kotlin/com/pischule/memestv/s3/FileUploaderService.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.pischule.memestv.s3 - -import aws.sdk.kotlin.services.s3.S3Client -import aws.sdk.kotlin.services.s3.model.PutObjectRequest -import aws.smithy.kotlin.runtime.content.ByteStream -import org.springframework.stereotype.Service - -@Service -class FileUploaderService(private val s3Client: S3Client, private val s3Props: S3Props) { - - suspend fun uploadFile(fileBytes: ByteArray) { - s3Client.putObject( - PutObjectRequest { - body = ByteStream.fromBytes(fileBytes) - bucket = s3Props.bucket - key = "_.jpeg" - } - ) - } -} diff --git a/src/main/kotlin/com/pischule/memestv/upload/DummyFileUploadService.kt b/src/main/kotlin/com/pischule/memestv/upload/DummyFileUploadService.kt new file mode 100644 index 0000000..47fd8ba --- /dev/null +++ b/src/main/kotlin/com/pischule/memestv/upload/DummyFileUploadService.kt @@ -0,0 +1,16 @@ +package com.pischule.memestv.upload + +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.context.annotation.Profile +import org.springframework.stereotype.Service + +private val logger = KotlinLogging.logger {} + +@Profile("local") +@Service +class DummyFileUploadService() : FileUploaderService { + + override suspend fun uploadFile(fileBytes: ByteArray, filename: String) { + logger.info { "File $filename has been successfully uploaded to nowhere" } + } +} diff --git a/src/main/kotlin/com/pischule/memestv/upload/FileUploaderService.kt b/src/main/kotlin/com/pischule/memestv/upload/FileUploaderService.kt new file mode 100644 index 0000000..61cf280 --- /dev/null +++ b/src/main/kotlin/com/pischule/memestv/upload/FileUploaderService.kt @@ -0,0 +1,8 @@ +package com.pischule.memestv.upload + +import org.springframework.stereotype.Service + +@Service +interface FileUploaderService { + suspend fun uploadFile(fileBytes: ByteArray, filename: String) +} diff --git a/src/main/kotlin/com/pischule/memestv/upload/IndexInitializer.kt b/src/main/kotlin/com/pischule/memestv/upload/IndexInitializer.kt new file mode 100644 index 0000000..49d3adf --- /dev/null +++ b/src/main/kotlin/com/pischule/memestv/upload/IndexInitializer.kt @@ -0,0 +1,31 @@ +package com.pischule.memestv.upload + +import io.github.oshai.kotlinlogging.KotlinLogging +import kotlinx.coroutines.runBlocking +import org.springframework.boot.context.event.ApplicationStartedEvent +import org.springframework.context.annotation.Configuration +import org.springframework.context.event.EventListener +import org.springframework.scheduling.annotation.Async + +private val logger = KotlinLogging.logger {} + +@Configuration +class IndexInitializer(val fileUploaderService: FileUploaderService) { + + @Async + @EventListener + fun applicationStartedHandler(event: ApplicationStartedEvent) { + try { + val fileBytes = readResourceAsByteArray("static/index.html") + runBlocking { fileUploaderService.uploadFile(fileBytes, "index.html") } + } catch (e: Error) { + logger.warn(e) { "Failed to upload " } + } + } + + private fun readResourceAsByteArray(resourcePath: String): ByteArray { + val inputStream = + ClassLoader.getSystemResourceAsStream(resourcePath) ?: error("$resourcePath not found") + return inputStream.use { it.readAllBytes() } + } +} diff --git a/src/main/kotlin/com/pischule/memestv/s3/S3Config.kt b/src/main/kotlin/com/pischule/memestv/upload/S3Config.kt similarity index 88% rename from src/main/kotlin/com/pischule/memestv/s3/S3Config.kt rename to src/main/kotlin/com/pischule/memestv/upload/S3Config.kt index 161f051..a618afa 100644 --- a/src/main/kotlin/com/pischule/memestv/s3/S3Config.kt +++ b/src/main/kotlin/com/pischule/memestv/upload/S3Config.kt @@ -1,4 +1,4 @@ -package com.pischule.memestv.s3 +package com.pischule.memestv.upload import aws.sdk.kotlin.runtime.auth.credentials.StaticCredentialsProvider import aws.sdk.kotlin.services.s3.S3Client @@ -6,7 +6,9 @@ import aws.smithy.kotlin.runtime.net.url.Url import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.Profile +@Profile("!local") @EnableConfigurationProperties(S3Props::class) @Configuration class S3Config { diff --git a/src/main/kotlin/com/pischule/memestv/upload/S3FileUploaderService.kt b/src/main/kotlin/com/pischule/memestv/upload/S3FileUploaderService.kt new file mode 100644 index 0000000..0ec060b --- /dev/null +++ b/src/main/kotlin/com/pischule/memestv/upload/S3FileUploaderService.kt @@ -0,0 +1,26 @@ +package com.pischule.memestv.upload + +import aws.sdk.kotlin.services.s3.S3Client +import aws.sdk.kotlin.services.s3.model.PutObjectRequest +import aws.smithy.kotlin.runtime.content.ByteStream +import io.github.oshai.kotlinlogging.KotlinLogging +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean +import org.springframework.stereotype.Service + +private val logger = KotlinLogging.logger {} + +@ConditionalOnBean(S3Config::class) +@Service +class S3FileUploaderService(private val s3Client: S3Client, private val s3Props: S3Props) : + FileUploaderService { + override suspend fun uploadFile(fileBytes: ByteArray, filename: String) { + s3Client.putObject( + PutObjectRequest { + body = ByteStream.fromBytes(fileBytes) + bucket = s3Props.bucket + key = filename + } + ) + logger.info { "File $filename has been uploaded to S3" } + } +} diff --git a/src/main/kotlin/com/pischule/memestv/s3/S3Props.kt b/src/main/kotlin/com/pischule/memestv/upload/S3Props.kt similarity index 84% rename from src/main/kotlin/com/pischule/memestv/s3/S3Props.kt rename to src/main/kotlin/com/pischule/memestv/upload/S3Props.kt index f202d8b..ea821dc 100644 --- a/src/main/kotlin/com/pischule/memestv/s3/S3Props.kt +++ b/src/main/kotlin/com/pischule/memestv/upload/S3Props.kt @@ -1,4 +1,4 @@ -package com.pischule.memestv.s3 +package com.pischule.memestv.upload import org.springframework.boot.context.properties.ConfigurationProperties