diff --git a/pom.xml b/pom.xml index 2f18f1e..928e019 100644 --- a/pom.xml +++ b/pom.xml @@ -18,18 +18,10 @@ 4.11.1 2.16.1 2.17.2 + 5.10.2 + 1.6.0.Final - - org.springframework.data - spring-data-redis - 3.2.5 - - - redis.clients - jedis - 5.1.2 - com.github.pengrad java-telegram-bot-api @@ -51,15 +43,15 @@ ${jackson-databind.version} - org.junit-pioneer - junit-pioneer - 2.2.0 + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter-api.version} test org.cache2k cache2k-base-bom - 1.6.0.Final + ${cache2k-base-bom.version} pom @@ -70,7 +62,6 @@ - maven-assembly-plugin 3.7.1 diff --git a/src/main/java/org/example/configs/MongoDBConfig.java b/src/main/java/org/example/configs/MongoDBConfig.java index 45bd7d8..edd78e3 100644 --- a/src/main/java/org/example/configs/MongoDBConfig.java +++ b/src/main/java/org/example/configs/MongoDBConfig.java @@ -1,29 +1,29 @@ package org.example.configs; + import com.mongodb.ConnectionString; +import com.mongodb.client.ChangeStreamIterable; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; -import com.mongodb.client.model.changestream.FullDocument; -import com.mongodb.client.model.changestream.OperationType; -import org.example.model.QuizQuestions; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.model.Aggregates; +import com.mongodb.client.model.Filters; +import org.bson.Document; +import org.bson.conversions.Bson; import org.example.services.QuizService; import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; -import org.springframework.data.mongodb.core.ChangeStreamOptions; import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.data.mongodb.core.aggregation.Aggregation; -import org.springframework.data.mongodb.core.messaging.ChangeStreamRequest; -import org.springframework.data.mongodb.core.messaging.DefaultMessageListenerContainer; -import org.springframework.data.mongodb.core.messaging.Subscription; -import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; +import java.util.Arrays; +import java.util.List; + @Configuration @ComponentScan(basePackages = "org.example") @PropertySource("classpath:application.properties") @@ -50,29 +50,29 @@ public MongoClient mongoClient() { return MongoClients.create(new ConnectionString(connectionUri)); } - public MongoClient reconnectToDB() { - MongoClient currentClient = mongoClient(); - currentClient.close(); - return MongoClients.create(new ConnectionString(connectionUri)); - } - @Bean - public DefaultMessageListenerContainer messageListenerContainer(MongoTemplate mongoTemplate, QuizService quizService) { - DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(mongoTemplate); - container.start(); - ChangeStreamOptions changeStreamOptions = ChangeStreamOptions.builder() - .filter(Aggregation.newAggregation(Aggregation.match(Criteria.where("operationType").is(OperationType.INSERT.getValue())))) - .fullDocumentLookup(FullDocument.UPDATE_LOOKUP) - .build(); - ChangeStreamRequest.ChangeStreamRequestOptions options = new ChangeStreamRequest.ChangeStreamRequestOptions(databaseName, "quizQuestions", changeStreamOptions); + public ChangeStreamIterable runEventListener(MongoTemplate mongoTemplate, QuizService quizService) { + MongoCollection collection = mongoTemplate.getCollection("quizQuestions"); + List pipeline = List.of( + Aggregates.match(Filters.in("operationType", Arrays.asList("insert", "delete")))); + ChangeStreamIterable changeStream = collection.watch(pipeline); + changeStream.forEach(event -> { + String operationType = event.getOperationTypeString(); + if (operationType == null) { + return; + } - Subscription subscription = container.register(new ChangeStreamRequest<>(message -> { - QuizQuestions quizQuestions = message.getBody(); - if (quizQuestions != null) { - String topic = quizQuestions.getTopicName(); - quizService.addTopic(topic); + switch (operationType) { + case "insert" -> { + Document document = event.getFullDocument(); + if (document != null && document.containsKey("topicName")) { + quizService.addTopic(document.getString("topicName")); + } + } + case "delete" -> quizService.updateTopics(); } - }, options), QuizQuestions.class); - return container; + + }); + return changeStream; } } diff --git a/src/main/java/org/example/services/QuizService.java b/src/main/java/org/example/services/QuizService.java index 2bbfc46..445b39a 100644 --- a/src/main/java/org/example/services/QuizService.java +++ b/src/main/java/org/example/services/QuizService.java @@ -48,4 +48,8 @@ public QuizQuestions findRandomQuestionsByTopicName(String topicName, int count) return quizRepo.findRandomQuestionsByTopicName(topicName, count); } + public void updateTopics(){ + List topics = Arrays.stream(quizRepo.findAllTopic().split(",")).toList(); + topicsCache.put("topics", topics); + } }