Skip to content

Commit

Permalink
#139 Send published homeworks to telegram
Browse files Browse the repository at this point in the history
  • Loading branch information
vityaman committed Jun 14, 2024
1 parent f26ebab commit 3051d43
Show file tree
Hide file tree
Showing 10 changed files with 64 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class RatingHttpApi(
ResponseEntity.ok(
RatingGrades(
grades = service.grades().map { (student, grades) ->
println("$student $grades")
StudentGradesMessage(
studentId = student.id.number,
grades = grades.entries
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import ru.vityaman.lms.botalka.storage.kafka.KafkaProducer
import ru.vityaman.lms.botalka.storage.kafka.KafkaTopic

@Component
class SpringPublicationConsumer(
@Qualifier(SpringPublicationConfig.BeanName.KAFKA_CONSUMER)
class SpringKafkaPublicationConsumer(
@Value("\${broker.bootstrap-servers}")
bootstrapServers: String,

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package ru.vityaman.lms.botalka.app.spring.task

import kotlinx.coroutines.runBlocking
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.beans.factory.annotation.Value
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component
import ru.vityaman.lms.botalka.commons.Consumer
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.model.Homework
import ru.vityaman.lms.botalka.core.publication.PublicationConsumer
import ru.vityaman.lms.botalka.core.publication.PublicationSupplier
import ru.vityaman.lms.botalka.core.publication.logging.loggingNotificationCallbacks
import ru.vityaman.lms.botalka.core.publication.task.NotificationTask
Expand All @@ -19,20 +19,17 @@ class SpringNotificationTask(
batchDurationSeconds: Int,

supplier: PublicationSupplier,
) {
private val log = Slf4jLog("NotificationTask")

@Qualifier(SpringPublicationConfig.BeanName.TELEGRAM_CONSUMER)
consumer: PublicationConsumer,
) {
private val logic = NotificationTask(
supplier = supplier,
consumer = object : Consumer<Homework> {
override suspend fun accept(value: Homework) {
log.info("Consumed $value")
}
},
consumer = consumer,
config = NotificationTask.Config(
batchDuration = batchDurationSeconds.seconds,
),
callbacks = loggingNotificationCallbacks(log),
callbacks = loggingNotificationCallbacks(Slf4jLog("NotificationTask")),
)

@Scheduled(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ru.vityaman.lms.botalka.app.spring.task

class SpringPublicationConfig {
object BeanName {
const val KAFKA_CONSUMER = "kafkaPublicationConsumer"
const val TELEGRAM_CONSUMER = "telegramPublicationConsumer"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import java.util.concurrent.TimeUnit
class SpringPublicationTask(
homeworks: HomeworkStorage,

@Qualifier(SpringPublicationConfig.BeanName.KAFKA_CONSUMER)
consumer: PublicationConsumer,

@Qualifier(MainR2dbcConfig.BeanName.TX_ENV)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ru.vityaman.lms.botalka.app.spring.task

import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component
import ru.vityaman.lms.botalka.core.external.telegram.TelegramBot
import ru.vityaman.lms.botalka.core.external.telegram.TelegramChat
import ru.vityaman.lms.botalka.core.publication.PublicationConsumer
import ru.vityaman.lms.botalka.core.publication.telegram.TelegramPublicationConsumer

@Component
@Qualifier(SpringPublicationConfig.BeanName.TELEGRAM_CONSUMER)
class SpringTelegramPublicationConsumer(
telegram: TelegramBot,

@Value("\${external.service.telegram.admin-chat-id}")
adminChatId: Long,
) : PublicationConsumer by
TelegramPublicationConsumer(telegram, TelegramChat(adminChatId))
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class BasicTelegramBot(accessToken: String) : TelegramBot {

override suspend fun send(chat: TelegramChat, message: TelegramMessage) {
withContext(Dispatchers.IO) {
bot.sendMessage(ChatId.fromId(chat.id), text = message.text)
bot.sendMessage(ChatId.fromId(chat.id), text = message.text).get()
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package ru.vityaman.lms.botalka.core.publication.telegram

import ru.vityaman.lms.botalka.core.external.telegram.TelegramBot
import ru.vityaman.lms.botalka.core.external.telegram.TelegramChat
import ru.vityaman.lms.botalka.core.external.telegram.TelegramMessage
import ru.vityaman.lms.botalka.core.model.Homework
import ru.vityaman.lms.botalka.core.publication.PublicationConsumer

class TelegramPublicationConsumer(
private val telegram: TelegramBot,
private val adminChat: TelegramChat,
) : PublicationConsumer {
override suspend fun accept(value: Homework) {
val text = buildString {
append("Published homework '${value.title.text}'!\n")
append("\n")
append("${value.description}\n")
append("\n")
append("MaxScore: ${value.maxScore.value}\n")
append("Deadline: ${value.deadlineMoment}\n")
append("Id: ${value.id.number}\n")
}
telegram.send(adminChat, TelegramMessage(text))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ class KafkaProducer<K, V>(
.let { SenderRecord.create(it, null) }
.let { mono { it } }
kafka.send(record).asFlow().collect {}
println("Sent $value")
}

data class Config(
Expand Down
2 changes: 1 addition & 1 deletion infra/fuzzing/custom/homeworks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ MOMENT="$2"
echo "[fuzz] Got access token: '$TOKEN'"
echo "[fuzz] Got moment: '$MOMENT'"

for _ in $(seq 1 128); do
for _ in $(seq 1 32); do
curl -X 'POST' \
'http://localhost:8080/api/v1/homework' \
-H 'accept: application/json' \
Expand Down

0 comments on commit 3051d43

Please sign in to comment.