diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/BotalkaApplication.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/BotalkaApplication.kt index d9acc6f..3524710 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/BotalkaApplication.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/BotalkaApplication.kt @@ -4,12 +4,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration import org.springframework.boot.runApplication import org.springframework.context.annotation.Bean +import org.springframework.scheduling.annotation.EnableScheduling import java.time.Clock @SpringBootApplication(exclude = [JooqAutoConfiguration::class]) +@EnableScheduling class BotalkaApplication { @Bean - fun clock() = Clock.systemUTC() + fun clock(): Clock = Clock.systemUTC() } fun main(args: Array) { diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/task/SpringPublicationTask.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/task/SpringPublicationTask.kt new file mode 100644 index 0000000..8983a1b --- /dev/null +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/app/spring/task/SpringPublicationTask.kt @@ -0,0 +1,35 @@ +package ru.vityaman.lms.botalka.app.spring.task + +import kotlinx.coroutines.runBlocking +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Component +import ru.vityaman.lms.botalka.core.logging.Slf4jLog +import ru.vityaman.lms.botalka.core.publication.LoggingPublicationConsumer +import ru.vityaman.lms.botalka.core.publication.PublicationTask +import ru.vityaman.lms.botalka.core.publication.loggingPublicationCallbacks +import ru.vityaman.lms.botalka.core.storage.HomeworkStorage +import ru.vityaman.lms.botalka.core.tx.TxEnv +import java.time.Clock +import java.util.concurrent.TimeUnit + +@Component +class SpringPublicationTask( + homeworks: HomeworkStorage, + txEnv: TxEnv, + clock: Clock, +) { + private val logic = PublicationTask( + consumer = LoggingPublicationConsumer(Slf4jLog("PublicationConsumer")), + homeworks = homeworks, + txEnv = txEnv, + clock = clock, + callbacks = loggingPublicationCallbacks(Slf4jLog("PublicationTask")), + ) + + @Scheduled( + fixedRateString = "\${task.scheduled.publication.precision-seconds}", + initialDelayString = "\${task.scheduled.publication.precision-seconds}", + timeUnit = TimeUnit.SECONDS, + ) + fun run(): Unit = runBlocking { logic.run() } +} diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationCallbacks.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationCallbacks.kt index a7a83ce..73f0550 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationCallbacks.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationCallbacks.kt @@ -2,11 +2,10 @@ package ru.vityaman.lms.botalka.core.publication import ru.vityaman.lms.botalka.core.logging.Log -fun loggingPublicationCallbacks(log: Log) = - PublicationTask.Callbacks( - onStart = { log.info("Starting...") }, - onReceived = { log.info("Received ${it.size} homeworks") }, - onNext = { log.info("Publishing homework with id ${it.id}...") }, - onAccepted = { log.info("Published homework with id ${it.id}") }, - onRejected = { log.info("Failed to publish homework with id ${it.id}") }, - ) +fun loggingPublicationCallbacks(log: Log) = PublicationTask.Callbacks( + onStart = { log.info("Starting...") }, + onReceived = { log.info("Received ${it.size} homeworks") }, + onNext = { log.info("Publishing homework with id ${it.id}...") }, + onAccepted = { log.info("Published homework with id ${it.id}") }, + onRejected = { log.info("Failed to publish homework with id ${it.id}") }, +) diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqHomeworkStorage.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqHomeworkStorage.kt index f7703b0..8ef1577 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqHomeworkStorage.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/storage/jooq/JooqHomeworkStorage.kt @@ -47,16 +47,15 @@ class JooqHomeworkStorage( override suspend fun publishableAt( moment: OffsetDateTime, - ): Flow { - return database.flow { + ): Flow = + database.flow { select(HOMEWORK.ID) .from(HOMEWORK) .where( HOMEWORK.PUBLICATION_MOMENT.lessOrEqual(moment) - .and(HOMEWORK.IS_PUBLISHED.notEqual(true)) + .and(HOMEWORK.IS_PUBLISHED.notEqual(true)), ) }.map { Homework.Id(it["id"]!! as Int) } - } override suspend fun markPublished(id: Homework.Id) = database.only { diff --git a/botalka/src/main/resources/application-test.yml b/botalka/src/main/resources/application-test.yml index 6376ead..efabba2 100644 --- a/botalka/src/main/resources/application-test.yml +++ b/botalka/src/main/resources/application-test.yml @@ -10,4 +10,8 @@ external: clientId: fake-yandex-client-id clientSecret: fake-yandex-client-secret login: - url: http://localhost:8080/fake/external/service/yandex/login \ No newline at end of file + url: http://localhost:8080/fake/external/service/yandex/login +task: + scheduled: + publication: + precision-seconds: 66666 \ No newline at end of file diff --git a/botalka/src/main/resources/application.yml b/botalka/src/main/resources/application.yml index d7ebc18..bc15aef 100644 --- a/botalka/src/main/resources/application.yml +++ b/botalka/src/main/resources/application.yml @@ -53,4 +53,8 @@ external: clientId: ${LMS_YANDEX_CLIENT_ID} clientSecret: ${LMS_YANDEX_CLIENT_SECRET} login: - url: https://login.yandex.ru \ No newline at end of file + url: https://login.yandex.ru +task: + scheduled: + publication: + precision-seconds: 60 \ No newline at end of file diff --git a/config/detekt.yml b/config/detekt.yml index cc7f1b4..356cdfd 100644 --- a/config/detekt.yml +++ b/config/detekt.yml @@ -37,7 +37,7 @@ complexity: LongParameterList: active: true functionThreshold: 4 - constructorThreshold: 5 + constructorThreshold: 6 MethodOverloading: active: true NamedArguments: