From 669cdd89480b679aebbbd19f8fbae9471f9fbdaf Mon Sep 17 00:00:00 2001 From: AleksOBM Date: Sun, 13 Sep 2026 05:09:35 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=203.=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- --- .test/Readme.md | 57 +++ core/aggregation-api/pom.xml | 6 - .../aggregation/client/stats/StatsClient.java | 31 -- .../client/stats/StatsFallbackFactory.java | 36 -- .../dto/event/output/EventFullDto.java | 7 +- .../dto/event/output/EventShortDto.java | 6 +- .../repository/StatsFeignRepository.java | 16 - .../repository/StatsFeignRepositoryImpl.java | 96 ---- core/event-service/pom.xml | 11 + .../practicum/ewm/events/EventServiceApp.java | 7 +- .../controller/free/FreeEventController.java | 12 +- .../system/SystemRatingController.java | 28 -- .../controller/user/UserEventController.java | 38 +- .../controller/user/UserRatingController.java | 33 ++ .../user/UserRecomendationsController.java | 35 ++ .../ru/practicum/ewm/events/entity/Event.java | 4 - .../ewm/events/mapper/CompilationMapper.java | 4 +- .../ewm/events/mapper/EventMapper.java | 7 +- .../practicum/ewm/events/model/EventData.java | 8 +- .../compilation/CompilationServiceImpl.java | 59 +-- .../events/service/event/EventService.java | 2 + .../service/event/EventServiceImpl.java | 181 ++++---- .../service/rating/EventRatingService.java | 10 - .../rating/EventRatingServiceImpl.java | 27 -- .../main/resources/application-test.yaml.bak | 10 - .../src/main/resources/schema-h2.sql.bak | 93 ---- .../src/main/resources/schema-postgres.sql | 1 - .../main/resources/schema-postgres.sql.bak | 93 ---- core/pom.xml | 1 - .../ewm/ratings/RatingServiceApp.java | 33 -- .../controller/UserRatingController.java | 50 --- .../practicum/ewm/ratings/entity/Rating.java | 33 -- .../ewm/ratings/mapper/RatingMapper.java | 19 - .../ratings/repository/RatingRepository.java | 14 - .../ewm/ratings/service/RatingService.java | 13 - .../ratings/service/RatingServiceImpl.java | 101 ----- .../src/main/resources/schema-postgres.sql | 8 - core/request-service/pom.xml | 11 + .../ewm/requests/RequestServiceApp.java | 7 +- .../controller/UserRequestController.java | 23 +- .../practicum/ewm/users/UserServiceApp.java | 4 +- docker-compose.yml | 40 +- docker-init.sql => docker-init-core.sql | 0 docker-init-stats.sql | 6 + docker-init-topics.sh | 17 + infra/config-repo/core/event-service.yml | 15 + infra/config-repo/core/rating-service.yml | 50 --- infra/config-repo/core/request-service.yml | 9 + infra/config-repo/stats/aggregator.yml | 24 + infra/config-repo/stats/analyzer.yml | 51 +++ infra/config-repo/stats/collector.yml | 15 + infra/config-repo/stats/stats-server.yml | 18 - pom.xml | 72 ++- stats/aggregator/pom.xml | 93 ++++ .../ewm/stats/aggregator/AggregatorApp.java | 16 + .../stats/aggregator/AggregatorRunner.java | 30 ++ .../aggregator/cofig/AggregatorConfig.java | 42 ++ .../consumer/BaseKafkaProcessor.java | 129 ++++++ .../consumer/UserActionConsumer.java | 27 ++ .../producer/EventsSimilarityProducer.java | 45 ++ .../aggregator/service/SimilarityService.java | 8 + .../service/SimilarityServiceImpl.java | 425 ++++++++++++++++++ .../stats/aggregator/util/TableRenderer.java | 139 ++++++ .../src/main/resources/application.yml} | 3 +- .../rating-service => stats/analyzer}/pom.xml | 72 ++- .../ewm/stats/analyzer/AnalyzerApp.java | 19 + .../ewm/stats/analyzer/AnalyzerRunner.java | 53 +++ .../config/AnalyzerConfiguration.java | 41 ++ .../analyzer/consumer/BaseKafkaProcessor.java | 128 ++++++ .../consumer/EventsSimilarityComsumer.java | 27 ++ .../consumer/UsersInteractionConsumer.java | 25 ++ .../controller/AnalyzerController.java | 96 ++++ .../ewm/stats/analyzer/entity/BaseEntity.java | 43 ++ .../stats/analyzer/entity/Interaction.java | 32 ++ .../ewm/stats/analyzer/entity/Similarity.java | 32 ++ .../analyzer/mapper/InteractionMapper.java | 31 ++ .../analyzer/mapper/SimilarityMapper.java | 27 ++ .../analyzer/model/EventInteraction.java | 10 + .../stats/analyzer/model/EventSimilarity.java | 10 + .../stats/analyzer/model/EventWeightSum.java | 9 + .../repository/InteractionsRepository.java | 56 +++ .../repository/SimilarityRepository.java | 32 ++ .../analyzer/service/InteractionsService.java | 16 + .../service/InteractionsServiceImpl.java | 74 +++ .../service/RecommendationService.java | 10 + .../service/RecommendationServiceImpl.java | 223 +++++++++ .../analyzer/service/SimilarityService.java | 16 + .../service/SimilarityServiceImpl.java | 81 ++++ .../src/main/resources/application.yml | 3 +- .../src/main/resources/schema-postgres.sql | 15 + stats/{stats-server => collector}/pom.xml | 38 +- .../ewm/stats/collector/CollectorApp.java} | 6 +- .../config/CollectorConfiguration.java | 28 ++ .../controller/CollectorController.java | 53 +++ .../collector/mapper/UserActionMapper.java | 32 ++ .../producer/UserActionProducer.java | 44 ++ .../collector/service/UserActionService.java | 8 + .../service/UserActionServiceImpl.java | 42 ++ .../src/main/resources/application.yml | 31 ++ stats/pom.xml | 7 +- stats/serialization/avro-schemas/pom.xml | 88 ++++ .../src/main/avro/stats/Event.avdl | 12 + .../src/main/avro/stats/EventsSimilarity.avdl | 17 + .../src/main/avro/stats/UserAction.avdl | 17 + .../EventsSimilarityDeserializer.java | 12 + .../deserializer/UserActionsDeserializer.java | 12 + .../base/BaseAvroDeserializer.java | 37 ++ .../base/DeserializationException.java | 9 + .../serializer/GeneralAvroSerializer.java | 42 ++ stats/serialization/pom.xml | 22 + stats/serialization/proto-schemas/pom.xml | 68 +++ .../request/interactions_count_request.proto | 16 + .../request/similar_events_request.proto | 13 + .../request/user_predictions_request.proto | 12 + .../analyzer/response/recommended_event.proto | 12 + .../messages/collector/user_action.proto | 22 + .../recommendations_controller.proto" | 26 ++ .../collector/user_action_controller.proto" | 15 + stats/serialization/timestamp-utils/pom.xml | 30 ++ .../telemetry/utils/TimestampUtils.java | 64 +++ stats/stat-dto/pom.xml | 52 --- .../ru/practicum/stat/dto/EndpointHitDto.java | 38 -- .../ru/practicum/stat/dto/ViewStatsDto.java | 16 - stats/stats-client/pom.xml | 59 +++ .../stats/client/dto/ActionType.java | 7 + .../stats/client/dto/ActionsWeightsSum.java | 10 + .../stats/client/dto/PredictedScore.java | 13 + .../client/dto/SimilarityCoefficient.java | 10 + .../stats/client/dto/UserActionDto.java | 14 + .../stats/client/grpc/AnalyzerClient.java | 92 ++++ .../stats/client/grpc/CollectorClient.java | 47 ++ .../stats/client/mapper/ActionTypeMapper.java | 27 ++ .../server/config/JacksonConfiguration.java | 28 -- .../stat/server/config/WebConfig.java | 20 - .../server/controller/StatController.java | 48 -- .../stat/server/entity/EndpointHit.java | 44 -- .../practicum/stat/server/error/ApiError.java | 25 -- .../stat/server/error/StatErrorHandler.java | 52 --- .../stat/server/mapper/EndpointHitMapper.java | 19 - .../server/repository/StatRepository.java | 33 -- .../stat/server/service/StatService.java | 42 -- .../main/resources/application-test.yaml.bak | 12 - .../src/main/resources/schema-postgres.sql | 9 - 143 files changed, 3750 insertions(+), 1492 deletions(-) create mode 100644 .test/Readme.md delete mode 100644 core/aggregation-api/src/main/java/ru/practicum/aggregation/client/stats/StatsClient.java delete mode 100644 core/aggregation-api/src/main/java/ru/practicum/aggregation/client/stats/StatsFallbackFactory.java delete mode 100644 core/aggregation-api/src/main/java/ru/practicum/aggregation/repository/StatsFeignRepository.java delete mode 100644 core/aggregation-api/src/main/java/ru/practicum/aggregation/repository/StatsFeignRepositoryImpl.java delete mode 100644 core/event-service/src/main/java/ru/practicum/ewm/events/controller/system/SystemRatingController.java create mode 100644 core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserRatingController.java create mode 100644 core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserRecomendationsController.java delete mode 100644 core/event-service/src/main/java/ru/practicum/ewm/events/service/rating/EventRatingService.java delete mode 100644 core/event-service/src/main/java/ru/practicum/ewm/events/service/rating/EventRatingServiceImpl.java delete mode 100644 core/event-service/src/main/resources/application-test.yaml.bak delete mode 100644 core/event-service/src/main/resources/schema-h2.sql.bak delete mode 100644 core/event-service/src/main/resources/schema-postgres.sql.bak delete mode 100644 core/rating-service/src/main/java/ru/practicum/ewm/ratings/RatingServiceApp.java delete mode 100644 core/rating-service/src/main/java/ru/practicum/ewm/ratings/controller/UserRatingController.java delete mode 100644 core/rating-service/src/main/java/ru/practicum/ewm/ratings/entity/Rating.java delete mode 100644 core/rating-service/src/main/java/ru/practicum/ewm/ratings/mapper/RatingMapper.java delete mode 100644 core/rating-service/src/main/java/ru/practicum/ewm/ratings/repository/RatingRepository.java delete mode 100644 core/rating-service/src/main/java/ru/practicum/ewm/ratings/service/RatingService.java delete mode 100644 core/rating-service/src/main/java/ru/practicum/ewm/ratings/service/RatingServiceImpl.java delete mode 100644 core/rating-service/src/main/resources/schema-postgres.sql rename docker-init.sql => docker-init-core.sql (100%) create mode 100644 docker-init-stats.sql create mode 100644 docker-init-topics.sh delete mode 100644 infra/config-repo/core/rating-service.yml create mode 100644 infra/config-repo/stats/aggregator.yml create mode 100644 infra/config-repo/stats/analyzer.yml create mode 100644 infra/config-repo/stats/collector.yml delete mode 100644 infra/config-repo/stats/stats-server.yml create mode 100644 stats/aggregator/pom.xml create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/AggregatorApp.java create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/AggregatorRunner.java create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/cofig/AggregatorConfig.java create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/consumer/BaseKafkaProcessor.java create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/consumer/UserActionConsumer.java create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/producer/EventsSimilarityProducer.java create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/service/SimilarityService.java create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/service/SimilarityServiceImpl.java create mode 100644 stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/util/TableRenderer.java rename stats/{stats-server/src/main/resources/application.yaml => aggregator/src/main/resources/application.yml} (96%) rename {core/rating-service => stats/analyzer}/pom.xml (70%) create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/AnalyzerApp.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/AnalyzerRunner.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/config/AnalyzerConfiguration.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/BaseKafkaProcessor.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/EventsSimilarityComsumer.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/UsersInteractionConsumer.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/controller/AnalyzerController.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/BaseEntity.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/Interaction.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/Similarity.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/mapper/InteractionMapper.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/mapper/SimilarityMapper.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventInteraction.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventSimilarity.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventWeightSum.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/repository/InteractionsRepository.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/repository/SimilarityRepository.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/InteractionsService.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/InteractionsServiceImpl.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/RecommendationService.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/RecommendationServiceImpl.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/SimilarityService.java create mode 100644 stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/SimilarityServiceImpl.java rename {core/rating-service => stats/analyzer}/src/main/resources/application.yml (96%) create mode 100644 stats/analyzer/src/main/resources/schema-postgres.sql rename stats/{stats-server => collector}/pom.xml (80%) rename stats/{stats-server/src/main/java/ru/practicum/stat/server/StatsServerApp.java => collector/src/main/java/ru/practicum/ewm/stats/collector/CollectorApp.java} (61%) create mode 100644 stats/collector/src/main/java/ru/practicum/ewm/stats/collector/config/CollectorConfiguration.java create mode 100644 stats/collector/src/main/java/ru/practicum/ewm/stats/collector/controller/CollectorController.java create mode 100644 stats/collector/src/main/java/ru/practicum/ewm/stats/collector/mapper/UserActionMapper.java create mode 100644 stats/collector/src/main/java/ru/practicum/ewm/stats/collector/producer/UserActionProducer.java create mode 100644 stats/collector/src/main/java/ru/practicum/ewm/stats/collector/service/UserActionService.java create mode 100644 stats/collector/src/main/java/ru/practicum/ewm/stats/collector/service/UserActionServiceImpl.java create mode 100644 stats/collector/src/main/resources/application.yml create mode 100644 stats/serialization/avro-schemas/pom.xml create mode 100644 stats/serialization/avro-schemas/src/main/avro/stats/Event.avdl create mode 100644 stats/serialization/avro-schemas/src/main/avro/stats/EventsSimilarity.avdl create mode 100644 stats/serialization/avro-schemas/src/main/avro/stats/UserAction.avdl create mode 100644 stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/EventsSimilarityDeserializer.java create mode 100644 stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/UserActionsDeserializer.java create mode 100644 stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/base/BaseAvroDeserializer.java create mode 100644 stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/base/DeserializationException.java create mode 100644 stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/serializer/GeneralAvroSerializer.java create mode 100644 stats/serialization/pom.xml create mode 100644 stats/serialization/proto-schemas/pom.xml create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/interactions_count_request.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/similar_events_request.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/user_predictions_request.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/response/recommended_event.proto create mode 100644 stats/serialization/proto-schemas/src/main/protobuf/stats/messages/collector/user_action.proto create mode 100644 "stats/serialization/proto-schemas/src/main/protobuf/stats/servi\321\201e/analyzer/recommendations_controller.proto" create mode 100644 "stats/serialization/proto-schemas/src/main/protobuf/stats/servi\321\201e/collector/user_action_controller.proto" create mode 100644 stats/serialization/timestamp-utils/pom.xml create mode 100644 stats/serialization/timestamp-utils/src/main/java/ru/yandex/practicum/telemetry/utils/TimestampUtils.java delete mode 100644 stats/stat-dto/pom.xml delete mode 100644 stats/stat-dto/src/main/java/ru/practicum/stat/dto/EndpointHitDto.java delete mode 100644 stats/stat-dto/src/main/java/ru/practicum/stat/dto/ViewStatsDto.java create mode 100644 stats/stats-client/pom.xml create mode 100644 stats/stats-client/src/main/java/ru/practicum/stats/client/dto/ActionType.java create mode 100644 stats/stats-client/src/main/java/ru/practicum/stats/client/dto/ActionsWeightsSum.java create mode 100644 stats/stats-client/src/main/java/ru/practicum/stats/client/dto/PredictedScore.java create mode 100644 stats/stats-client/src/main/java/ru/practicum/stats/client/dto/SimilarityCoefficient.java create mode 100644 stats/stats-client/src/main/java/ru/practicum/stats/client/dto/UserActionDto.java create mode 100644 stats/stats-client/src/main/java/ru/practicum/stats/client/grpc/AnalyzerClient.java create mode 100644 stats/stats-client/src/main/java/ru/practicum/stats/client/grpc/CollectorClient.java create mode 100644 stats/stats-client/src/main/java/ru/practicum/stats/client/mapper/ActionTypeMapper.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/config/JacksonConfiguration.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/config/WebConfig.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/controller/StatController.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/entity/EndpointHit.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/error/ApiError.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/error/StatErrorHandler.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/mapper/EndpointHitMapper.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/repository/StatRepository.java delete mode 100644 stats/stats-server/src/main/java/ru/practicum/stat/server/service/StatService.java delete mode 100644 stats/stats-server/src/main/resources/application-test.yaml.bak delete mode 100644 stats/stats-server/src/main/resources/schema-postgres.sql diff --git a/.test/Readme.md b/.test/Readme.md new file mode 100644 index 0000000..db5acb9 --- /dev/null +++ b/.test/Readme.md @@ -0,0 +1,57 @@ +# Тестер +## Скачать: [tester-0.0.1.jar](.github/workflows/stuff/tester-0.0.1.jar) + +## Пример запуска тестируем только коллектор, сохраняем отчёт в другой файл +`java -jar tester.jar --tester.execution.mode=COLLECTION --tester.execution.output.file-path=./report.txt` + +# Настройки генерации данных + +### Случайное количество уникальных пользователей, которое будет сгенерировано в указанном диапазоне. +tester.generation.user-count: 5 - 15 + +### Случайное количество различных мероприятий, которые будут сгенерированы в указанном диапазоне. +tester.generation.event-count: 10 - 20 + +### Лимит суммарного количества действий с мероприятиями то есть верхний лимит генерации действий для выбранного, с помощью настроек выше, случайного количества пользователей и мероприятий +tester.generation.actions-limit: 50 - 100 + +### Параметры временных меток генерируемых данных + +### Насколько «назад» во времени смещается первая метка (от текущего момента). +### Значение парсится в Duration так, что можно использовать разные обозначения +tester.generation.timestamp-settings.back: 3d + +### Минимальный интервал между последовательными метками. +tester.generation.timestamp-settings.increment-start: 1m + +### Максимальный интервал между последовательными метками. +tester.generation.timestamp-settings.increment-end: 10m + + +# Настройки выполнения тестов # + +### Режим проверки: +### - COLLECTION – только collector +### - AGGREGATION – collector + aggregator +### - ANALYZE – collector + aggregator + analyzer +tester.execution.mode: ANALYZE + +### Логировать сразу в консоль (т.е. помимо сохранения в отчет, который выводится только в конце работы) +tester.execution.immediate-logging.enabled: false + +## Настройки вывода результатов + +### Печатать сообщения уровня info (если false, то будут выводиться только ошибки). +tester.execution.output.info-enabled: true + +### Печатать TRACE‑сообщения. +tester.execution.output.trace-enabled: true + +### Выводить отчёт в консоль. +tester.execution.output.print: true + +### Сохранять отчёт в файл. +tester.execution.output.file: true + +### Путь к файлу отчёта. +tester.execution.output.file-path: "./execution-report.txt" \ No newline at end of file diff --git a/core/aggregation-api/pom.xml b/core/aggregation-api/pom.xml index 3d1e4eb..205e35e 100644 --- a/core/aggregation-api/pom.xml +++ b/core/aggregation-api/pom.xml @@ -14,12 +14,6 @@ jar - - ru.practicum - stat-dto - 0.0.1-SNAPSHOT - - jakarta.servlet jakarta.servlet-api diff --git a/core/aggregation-api/src/main/java/ru/practicum/aggregation/client/stats/StatsClient.java b/core/aggregation-api/src/main/java/ru/practicum/aggregation/client/stats/StatsClient.java deleted file mode 100644 index 77dee9b..0000000 --- a/core/aggregation-api/src/main/java/ru/practicum/aggregation/client/stats/StatsClient.java +++ /dev/null @@ -1,31 +0,0 @@ -package ru.practicum.aggregation.client.stats; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.format.annotation.DateTimeFormat; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import ru.practicum.stat.dto.EndpointHitDto; -import ru.practicum.stat.dto.ViewStatsDto; - -import java.time.LocalDateTime; -import java.util.List; - -@FeignClient( - name = "stats-server", - fallbackFactory = StatsFallbackFactory.class -) -public interface StatsClient { - - @PostMapping("/hit") - void hit(@RequestBody EndpointHitDto endpointHitDto); - - @GetMapping("/stats") - List getStats( - @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime start, - @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime end, - @RequestParam List uris, - @RequestParam boolean unique); - -} diff --git a/core/aggregation-api/src/main/java/ru/practicum/aggregation/client/stats/StatsFallbackFactory.java b/core/aggregation-api/src/main/java/ru/practicum/aggregation/client/stats/StatsFallbackFactory.java deleted file mode 100644 index 5b1afe3..0000000 --- a/core/aggregation-api/src/main/java/ru/practicum/aggregation/client/stats/StatsFallbackFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package ru.practicum.aggregation.client.stats; - -import org.springframework.cloud.openfeign.FallbackFactory; -import org.springframework.stereotype.Component; -import ru.practicum.aggregation.error.exception.unavailable.StatsServerUnavailableException; -import ru.practicum.stat.dto.EndpointHitDto; -import ru.practicum.stat.dto.ViewStatsDto; - -import java.time.LocalDateTime; -import java.util.List; - -@Component -public class StatsFallbackFactory implements FallbackFactory { - - @Override - public StatsClient create(Throwable cause) { - - return new StatsClient() { - - @Override - public void hit(EndpointHitDto endpointHitDto) { - throw new StatsServerUnavailableException("", cause); - } - - @Override - public List getStats(LocalDateTime start, - LocalDateTime end, - List uris, - boolean unique) { - - throw new StatsServerUnavailableException("", cause); - } - }; - } - -} diff --git a/core/aggregation-api/src/main/java/ru/practicum/aggregation/dto/event/output/EventFullDto.java b/core/aggregation-api/src/main/java/ru/practicum/aggregation/dto/event/output/EventFullDto.java index 492adf3..ec210c3 100644 --- a/core/aggregation-api/src/main/java/ru/practicum/aggregation/dto/event/output/EventFullDto.java +++ b/core/aggregation-api/src/main/java/ru/practicum/aggregation/dto/event/output/EventFullDto.java @@ -26,8 +26,7 @@ * boolean requestModeration
* EventState state
* String title
- * Long views
- * long rate + * double rating */ @Builder public record EventFullDto( @@ -68,8 +67,6 @@ public record EventFullDto( @NotBlank String title, - Long views, - - long rate + double rating ) { } \ No newline at end of file diff --git a/core/aggregation-api/src/main/java/ru/practicum/aggregation/dto/event/output/EventShortDto.java b/core/aggregation-api/src/main/java/ru/practicum/aggregation/dto/event/output/EventShortDto.java index d074fe0..cef28c8 100644 --- a/core/aggregation-api/src/main/java/ru/practicum/aggregation/dto/event/output/EventShortDto.java +++ b/core/aggregation-api/src/main/java/ru/practicum/aggregation/dto/event/output/EventShortDto.java @@ -16,8 +16,7 @@ * {@link UserShortDto} initiator
* boolean paid
* {@link String} title
- * long views
- * long rate + * double rateing */ @Builder public record EventShortDto( @@ -29,7 +28,6 @@ public record EventShortDto( UserShortDto initiator, boolean paid, String title, - long views, - long rate + double rating ) { } diff --git a/core/aggregation-api/src/main/java/ru/practicum/aggregation/repository/StatsFeignRepository.java b/core/aggregation-api/src/main/java/ru/practicum/aggregation/repository/StatsFeignRepository.java deleted file mode 100644 index 0ff5776..0000000 --- a/core/aggregation-api/src/main/java/ru/practicum/aggregation/repository/StatsFeignRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.practicum.aggregation.repository; - -import jakarta.servlet.http.HttpServletRequest; -import ru.practicum.aggregation.model.data.StatsRequestData; -import ru.practicum.stat.dto.ViewStatsDto; - -import java.util.List; -import java.util.Optional; - -public interface StatsFeignRepository { - - void sendHitRequest(HttpServletRequest request); - - Optional> getStatList(StatsRequestData request); - -} diff --git a/core/aggregation-api/src/main/java/ru/practicum/aggregation/repository/StatsFeignRepositoryImpl.java b/core/aggregation-api/src/main/java/ru/practicum/aggregation/repository/StatsFeignRepositoryImpl.java deleted file mode 100644 index 6f090e7..0000000 --- a/core/aggregation-api/src/main/java/ru/practicum/aggregation/repository/StatsFeignRepositoryImpl.java +++ /dev/null @@ -1,96 +0,0 @@ -package ru.practicum.aggregation.repository; - -import jakarta.servlet.http.HttpServletRequest; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.experimental.FieldDefaults; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.env.Environment; -import org.springframework.lang.NonNull; -import org.springframework.stereotype.Component; -import ru.practicum.aggregation.client.RemoteCallExecutor; -import ru.practicum.aggregation.client.RemoteCallResult; -import ru.practicum.aggregation.client.stats.StatsClient; -import ru.practicum.aggregation.error.exception.stats.StatsResponseException; -import ru.practicum.stat.dto.EndpointHitDto; -import ru.practicum.aggregation.model.data.StatsRequestData; -import ru.practicum.stat.dto.ViewStatsDto; - -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.Optional; - -@Slf4j -@Component -@RequiredArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) -public class StatsFeignRepositoryImpl implements StatsFeignRepository { - - Environment environment; - StatsClient statsClient; - - @Override - public void sendHitRequest(@NonNull HttpServletRequest request) { - hit(EndpointHitDto.builder() - .ip(request.getRemoteAddr()) - .uri(request.getRequestURI()) - .app(environment.getProperty("spring.application.name")) - .timestamp(LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS)) - .build()); - } - - @Override - public Optional> getStatList(@NonNull StatsRequestData request) { - - var statUris = request.getUris(); - if (statUris.isEmpty()) { - throw new StatsResponseException(); - } - - return getStatistic(request.getStart(), request.getEnd(), statUris, request.getUnique()); - } - - @SuppressWarnings("unused") - private void hit(EndpointHitDto endpointHitDto) { - log.info(""" - PLEASE WAITING - Система регистрирует статистику - {}""", endpointHitDto); - switch (RemoteCallExecutor.executeVoid(() -> statsClient.hit(endpointHitDto))) { - - case RemoteCallResult.Success(var nullable) -> { - } - case RemoteCallResult.Failure(var exeptionNullable) -> { - } - case RemoteCallResult.Degraded(var cause) -> log.warn(""" - Деградация - Не удалось зарегистрировать статистику - {}""", endpointHitDto, cause); - - } - } - - @NonNull - private Optional> getStatistic(LocalDateTime start, - LocalDateTime end, - List uris, - boolean unique) { - log.info(""" - PLEASE WAITING - Система получает статистику - uris: {}""", uris); - return switch (RemoteCallExecutor.execute(() -> statsClient.getStats(start, end, uris, unique))) { - case RemoteCallResult.Success(var response) -> Optional.of(response); - case RemoteCallResult.Failure(var exeptionNullable) -> throw exeptionNullable; - case RemoteCallResult.Degraded(var cause) -> { - log.warn(""" - Деградация - Не удалось получить статистику - uris: {}""", uris, cause); - - yield Optional.empty(); - } - }; - } -} diff --git a/core/event-service/pom.xml b/core/event-service/pom.xml index 86abe85..961b10f 100644 --- a/core/event-service/pom.xml +++ b/core/event-service/pom.xml @@ -24,6 +24,11 @@ aggregation-api 0.0.1-SNAPSHOT
+ + ru.practicum + stat-client + 0.0.1-SNAPSHOT + org.springframework.boot @@ -108,6 +113,12 @@ org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j + + ru.practicum + stats-client + 0.0.1-SNAPSHOT + compile +
diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/EventServiceApp.java b/core/event-service/src/main/java/ru/practicum/ewm/events/EventServiceApp.java index d7cdb4d..0b228fc 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/EventServiceApp.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/EventServiceApp.java @@ -7,7 +7,6 @@ import org.springframework.context.annotation.ComponentScan; import ru.practicum.aggregation.client.event.EventClient; import ru.practicum.aggregation.client.request.RequestClient; -import ru.practicum.aggregation.client.stats.StatsClient; import ru.practicum.aggregation.client.user.UserClient; import ru.practicum.aggregation.config.JacksonConfiguration; @@ -15,15 +14,15 @@ @EnableFeignClients(clients = { UserClient.class, EventClient.class, - RequestClient.class, - StatsClient.class + RequestClient.class }) @ComponentScan(value = { "ru.practicum.ewm.events", "ru.practicum.aggregation.config", "ru.practicum.aggregation.client", "ru.practicum.aggregation.error", - "ru.practicum.aggregation.repository" + "ru.practicum.aggregation.repository", + "ru.practicum.stats.client.grpc" }) @ConfigurationPropertiesScan(basePackageClasses = JacksonConfiguration.class) public class EventServiceApp { diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/free/FreeEventController.java b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/free/FreeEventController.java index 728027a..c51499f 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/free/FreeEventController.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/free/FreeEventController.java @@ -11,7 +11,6 @@ import ru.practicum.aggregation.dto.event.output.EventFullDto; import ru.practicum.aggregation.dto.event.output.EventShortDto; import ru.practicum.aggregation.model.data.FreeGetData; -import ru.practicum.aggregation.repository.StatsFeignRepository; import ru.practicum.ewm.events.service.event.EventService; import java.time.LocalDateTime; @@ -25,7 +24,6 @@ public class FreeEventController { EventService eventService; - StatsFeignRepository statsFeignRepository; /** * Обратите внимание:
@@ -90,10 +88,7 @@ public List getFreeEvents( Получение событий с возможностью фильтрации {} {}""", request.getMethod(), request.getRequestURI()); - var result = eventService.getFreeEvents(freeGetData, request); - statsFeignRepository.sendHitRequest(request); - - return result; + return eventService.getFreeEvents(freeGetData, request); } @GetMapping(value = "/{eventId}") @@ -105,10 +100,7 @@ public EventFullDto getFreeEventById(@PathVariable Long eventId, Получение подробной информации об опубликованном событии по его идентификатору. {} {}""", request.getMethod(), request.getRequestURI()); - var result = eventService.getFreeEventById(eventId, request); - statsFeignRepository.sendHitRequest(request); - - return result; + return eventService.getFreeEventById(eventId, request); } } diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/system/SystemRatingController.java b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/system/SystemRatingController.java deleted file mode 100644 index 6bd9ceb..0000000 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/system/SystemRatingController.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.practicum.ewm.events.controller.system; - -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.experimental.FieldDefaults; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import ru.practicum.aggregation.dto.rating.come.update.RatingUpdateRequest; -import ru.practicum.ewm.events.service.rating.EventRatingService; - -@Slf4j -@RestController -@RequestMapping(path = "/system/events/ratings") -@RequiredArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) -public class SystemRatingController { - - EventRatingService eventRatingService; - - @PatchMapping - public void updateRating(@RequestBody @NotNull RatingUpdateRequest request) { - eventRatingService.updateRating(request); - } -} diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserEventController.java b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserEventController.java index 591c2da..94d07b3 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserEventController.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserEventController.java @@ -5,8 +5,10 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.PositiveOrZero; +import lombok.AccessLevel; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; @@ -19,23 +21,29 @@ import ru.practicum.aggregation.dto.participation.output.ParticipationRequestDto; import ru.practicum.ewm.events.service.event.EventService; import ru.practicum.ewm.events.service.request.EventRequestService; +import ru.practicum.stats.client.dto.ActionType; +import ru.practicum.stats.client.dto.UserActionDto; +import ru.practicum.stats.client.grpc.CollectorClient; +import java.time.LocalDateTime; import java.util.List; @Slf4j @RestController @RequestMapping(path = "/users/{userId}/events") @RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class UserEventController { - private final EventService eventService; - private final EventRequestService eventRequestService; + EventService eventService; + EventRequestService eventRequestService; + CollectorClient collectorClient; /** - * @param from количество элементов, которые нужно пропустить для формирования текущего набора
- * Default value : 0 - * @param size количество элементов в наборе
- * Default value : 10 + * @param from количество элементов, которые нужно пропустить для формирования текущего набора
+ * Default value : 0 + * @param size количество элементов в наборе
+ * Default value : 10 */ @GetMapping public List findEventsByUserId( @@ -52,15 +60,27 @@ public List findEventsByUserId( return eventService.findByUserId(userId, from, size); } - @GetMapping("/{eventId}") - public EventFullDto findEventById(@PathVariable @Positive Long userId, + @GetMapping(value = "/{eventId}", headers = "X-EWM-USER-ID") + public EventFullDto findEventById(@RequestHeader("X-EWM-USER-ID") @Positive Long userId, @PathVariable @Positive Long eventId, @NonNull HttpServletRequest request) { log.info(""" ENDPOINT Получение полной информации о событии добавленном текущим пользователем {} {}""", request.getMethod(), request.getRequestURI()); - return eventService.findEventByUserIdAndEventId(userId, eventId); + + var result = eventService.findEventByUserIdAndEventId(userId, eventId); + + log.info("Регистрация просмотра события {} пользователем {}", eventId, userId); + collectorClient.collectUserAction( + UserActionDto.builder() + .userId(userId) + .eventId(eventId) + .actionType(ActionType.VIEWS) + .timestamp(LocalDateTime.now()) + .build()); + + return result; } /** diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserRatingController.java b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserRatingController.java new file mode 100644 index 0000000..3cb40f1 --- /dev/null +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserRatingController.java @@ -0,0 +1,33 @@ +package ru.practicum.ewm.events.controller.user; + +import jakarta.validation.constraints.Positive; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import ru.practicum.stats.client.dto.ActionType; +import ru.practicum.stats.client.dto.UserActionDto; +import ru.practicum.stats.client.grpc.CollectorClient; + +import java.time.LocalDateTime; + +@Slf4j +@RestController +@RequestMapping("/events") +@RequiredArgsConstructor +public class UserRatingController { + + private final CollectorClient collectorClient; + + @PutMapping("/{eventId}/like") + public void addLike(@PathVariable @Positive Long eventId, @RequestHeader("X-EWM-USER-ID") Long userId) { + log.info("Пользователь {} поставил лайк событию {}", userId, eventId); + collectorClient.collectUserAction( + UserActionDto.builder() + .userId(userId) + .eventId(eventId) + .actionType(ActionType.LIKE) + .timestamp(LocalDateTime.now()) + .build() + ); + } +} diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserRecomendationsController.java b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserRecomendationsController.java new file mode 100644 index 0000000..00d57c9 --- /dev/null +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserRecomendationsController.java @@ -0,0 +1,35 @@ +package ru.practicum.ewm.events.controller.user; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import ru.practicum.aggregation.dto.event.output.EventShortDto; +import ru.practicum.ewm.events.service.event.EventService; + +import java.util.List; + +@Slf4j +@RestController +@RequestMapping(path = "/events/recommendations") +@RequiredArgsConstructor +public class UserRecomendationsController { + + private final EventService eventService; + + @GetMapping + public List getRecommendationsForUser(@RequestHeader("X-EWM-USER-ID") + long userId, + @RequestParam(defaultValue = "10", required = false) + Integer maxResults, + @NonNull HttpServletRequest request) { + log.info(""" + ENDPOINT + Получение рекомендации мероприятий для пользователя. + {} {}""", request.getMethod(), request.getRequestURI()); + + return eventService.getRecommendationsForUser(userId, maxResults); + } + +} diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/entity/Event.java b/core/event-service/src/main/java/ru/practicum/ewm/events/entity/Event.java index 4d09417..c8dcd2c 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/entity/Event.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/entity/Event.java @@ -103,8 +103,4 @@ public class Event extends BaseEntity { /// В каких компиляциях состоит событие @ManyToMany(mappedBy = "events") List compilations; - - /// Рейтинг события, вычисляемый как количество лайков и дизлайков - @Column(nullable = false) - private long rate; } diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/mapper/CompilationMapper.java b/core/event-service/src/main/java/ru/practicum/ewm/events/mapper/CompilationMapper.java index 3078c24..d339b8f 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/mapper/CompilationMapper.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/mapper/CompilationMapper.java @@ -19,7 +19,7 @@ public class CompilationMapper { public CompilationDto toCompilationDto(@NonNull Compilation compilation, @NonNull Map eventIdToInitiator, @NonNull Map confirmedRequests, - @NonNull Map views) { + @NonNull Map ratings) { return CompilationDto.builder() .id(compilation.getId()) .pinned(compilation.isPinned()) @@ -31,7 +31,7 @@ public CompilationDto toCompilationDto(@NonNull Compilation compilation, .initiator(eventIdToInitiator.get(event.getId())) .confirmedRequests(confirmedRequests .getOrDefault(event.getId(), 0L)) - .views(views.getOrDefault(event.getId(), 0L)) + .rating(ratings.getOrDefault(event.getId(), 0.0)) .build() )) .toList()) diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/mapper/EventMapper.java b/core/event-service/src/main/java/ru/practicum/ewm/events/mapper/EventMapper.java index a6d885e..609f47a 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/mapper/EventMapper.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/mapper/EventMapper.java @@ -29,8 +29,7 @@ public EventShortDto toEventShortDto(@NonNull Event event, .initiator(eventData.initiator()) .paid(event.isPaid()) .title(event.getTitle()) - .views(eventData.views()) - .rate(event.getRate()) + .rating(eventData.rating()) .build(); } @@ -52,8 +51,7 @@ public EventFullDto toEventFullDto(@NonNull Event event, .requestModeration(event.isRequestModeration()) .state(event.getState()) .title(event.getTitle()) - .views(eventData.views()) - .rate(event.getRate()) + .rating(eventData.rating()) .build(); } @@ -79,7 +77,6 @@ public Event toEntity(@NonNull NewEventDto newEventDto, || newEventDto.requestModeration()) .state(state) .title(newEventDto.title()) - .rate(0) .build(); } diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/model/EventData.java b/core/event-service/src/main/java/ru/practicum/ewm/events/model/EventData.java index 49c8111..271fe93 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/model/EventData.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/model/EventData.java @@ -5,14 +5,14 @@ /** * @apiNote - * UserShortDto initiator
- * long confirmedRequests
- * long views + * UserShortDto initiator
+ * long confirmedRequests
+ * double rating */ @Builder public record EventData( UserShortDto initiator, long confirmedRequests, - long views + double rating ) { } \ No newline at end of file diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/service/compilation/CompilationServiceImpl.java b/core/event-service/src/main/java/ru/practicum/ewm/events/service/compilation/CompilationServiceImpl.java index 9ae7429..c8a664f 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/service/compilation/CompilationServiceImpl.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/service/compilation/CompilationServiceImpl.java @@ -17,15 +17,14 @@ import ru.practicum.aggregation.model.entity.BaseEntity; import ru.practicum.aggregation.model.repository.EventRequestCount; import ru.practicum.aggregation.repository.RequestFeignRepository; -import ru.practicum.aggregation.repository.StatsFeignRepository; import ru.practicum.aggregation.repository.UserFeignRepository; import ru.practicum.ewm.events.entity.Compilation; import ru.practicum.ewm.events.entity.Event; import ru.practicum.ewm.events.mapper.CompilationMapper; import ru.practicum.ewm.events.repository.CompilationRepository; import ru.practicum.ewm.events.repository.EventRepository; -import ru.practicum.aggregation.model.data.StatsRequestData; -import ru.practicum.stat.dto.ViewStatsDto; +import ru.practicum.stats.client.dto.ActionsWeightsSum; +import ru.practicum.stats.client.grpc.AnalyzerClient; import java.util.*; import java.util.function.Function; @@ -39,18 +38,16 @@ public class CompilationServiceImpl implements CompilationService { EventRepository eventRepository; CompilationRepository compilationRepository; - StatsFeignRepository statsFeignRepository; - UserFeignRepository userFeignRepository; RequestFeignRepository requestFeignRepository; + AnalyzerClient analyzerClient; + @Override public CompilationDto getById(Long compilationId, HttpServletRequest request) { - statsFeignRepository.sendHitRequest(request); - var compilation = getCompilationById(compilationId); var confirmedRequests = getConfirmedRequests(List.of(compilation)); - var views = getViews(List.of(compilation)); + var views = getRatingMap(List.of(compilation)); var events = compilation.getEvents(); var eventIdToInitiator = eventIdToInitiatorMap(events); @@ -80,13 +77,13 @@ public CompilationDto addCompilation(@NonNull NewCompilationDto compilationDto) Map confirmedRequests = new HashMap<>(); savedCompilation.getEvents().forEach(event -> confirmedRequests.put(event.getId(), 0L)); - Map views = new HashMap<>(); - savedCompilation.getEvents().forEach(event -> views.put(event.getId(), 0L)); + Map ratings = new HashMap<>(); + savedCompilation.getEvents().forEach(event -> ratings.put(event.getId(), 0.0)); var eventIdToInitiator = eventIdToInitiatorMap(events); return CompilationMapper.toCompilationDto( - savedCompilation, eventIdToInitiator, confirmedRequests, views); + savedCompilation, eventIdToInitiator, confirmedRequests, ratings); } @Override @@ -115,13 +112,13 @@ public CompilationDto updateCompilation(Long compilationId, } var confirmedRequests = getConfirmedRequests(List.of(compilationInDb)); - var views = getViews(List.of(compilationInDb)); + var ratings = getRatingMap(List.of(compilationInDb)); var compilation = getCompilationById(compilationId); var events = compilation.getEvents(); var eventIdToInitiator = eventIdToInitiatorMap(events); return CompilationMapper.toCompilationDto( - compilationInDb, eventIdToInitiator, confirmedRequests, views); + compilationInDb, eventIdToInitiator, confirmedRequests, ratings); } @NonNull @@ -157,7 +154,7 @@ public List getByFilter(@NonNull CompilationSearchFilter filter, } Map allConfirmedRequests = getConfirmedRequests(compilations); - Map allViews = getViews(compilations); + Map allRatings = getRatingMap(compilations); var result = new ArrayList(); for (Compilation compilation : compilations) { @@ -166,7 +163,7 @@ public List getByFilter(@NonNull CompilationSearchFilter filter, var eventIdToInitiator = eventIdToInitiatorMap(events); result.add(CompilationMapper.toCompilationDto( - compilation, eventIdToInitiator, allConfirmedRequests, allViews)); + compilation, eventIdToInitiator, allConfirmedRequests, allRatings)); } return result; @@ -200,36 +197,28 @@ private Map getConfirmedRequests(@NonNull Collection co ); } - /// Map + /// Map @NonNull - private Map getViews(@NonNull Collection compilations) { + private Map getRatingMap(@NonNull Collection compilations) { // Все уникальные события - List allEvents = compilations.stream() + List events = compilations.stream() .flatMap(c -> c.getEvents().stream()) .distinct() .toList(); - if (allEvents.isEmpty()) return Collections.emptyMap(); + if (events.isEmpty()) return Collections.emptyMap(); - // Все URIs - List uris = allEvents.stream().map(e -> "/events/" + e.getId()).toList(); + return getRatingMap(events.stream().map(Event::getId).toList()); + } - var statsOptional = statsFeignRepository.getStatList( - StatsRequestData.builder() - .uris(uris) - .unique(false) - .build() - ); + private Map getRatingMap(@NonNull List eventIds) { + if (eventIds.isEmpty()) { + return Collections.emptyMap(); + } - // Map - return statsOptional.map(viewStatsDtos -> viewStatsDtos.stream() - .collect(Collectors.toMap(statsDto -> - Long.parseLong(statsDto.getUri().replace("/events/", "")), - ViewStatsDto::getHits, - (a, b) -> a - )) - ).orElse(Collections.emptyMap()); + return analyzerClient.getInteractionsCount(eventIds).stream() + .collect(Collectors.toMap(ActionsWeightsSum::eventId, ActionsWeightsSum::score)); } } diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/service/event/EventService.java b/core/event-service/src/main/java/ru/practicum/ewm/events/service/event/EventService.java index eac622a..12f9c2e 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/service/event/EventService.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/service/event/EventService.java @@ -49,5 +49,7 @@ public interface EventService { @Transactional EventFullDto patchEvent(Long userId, Long eventId, UpdateEventUserRequest request); + List getRecommendationsForUser(long userId, int maxResults); + long getInitiatorIfPublished(@Positive Long eventId); } diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/service/event/EventServiceImpl.java b/core/event-service/src/main/java/ru/practicum/ewm/events/service/event/EventServiceImpl.java index 0f1a1e5..9d657d3 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/service/event/EventServiceImpl.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/service/event/EventServiceImpl.java @@ -27,10 +27,8 @@ import ru.practicum.aggregation.error.exception.bussines.cause.NotFoundException; import ru.practicum.aggregation.model.data.AdminGetData; import ru.practicum.aggregation.model.data.FreeGetData; -import ru.practicum.aggregation.model.data.StatsRequestData; import ru.practicum.aggregation.model.repository.EventRequestCount; import ru.practicum.aggregation.repository.RequestFeignRepositoryImpl; -import ru.practicum.aggregation.repository.StatsFeignRepository; import ru.practicum.aggregation.repository.UserFeignRepositoryImpl; import ru.practicum.ewm.events.entity.Category; import ru.practicum.ewm.events.entity.Event; @@ -42,7 +40,9 @@ import ru.practicum.ewm.events.repository.EventRepository; import ru.practicum.ewm.events.specification.EventSpecifications; import ru.practicum.ewm.events.specification.SpecBuilder; -import ru.practicum.stat.dto.ViewStatsDto; +import ru.practicum.stats.client.dto.ActionsWeightsSum; +import ru.practicum.stats.client.dto.PredictedScore; +import ru.practicum.stats.client.grpc.AnalyzerClient; import java.time.Instant; import java.time.LocalDateTime; @@ -50,7 +50,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; @Slf4j @@ -59,14 +58,14 @@ @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class EventServiceImpl implements EventService { - StatsFeignRepository statsFeignRepository; EventRepository eventRepository; CategoryRepository categoryRepository; UserFeignRepositoryImpl userFeignRepository; RequestFeignRepositoryImpl requestFeignRepository; - private static final String EVENTS_PATH = "/events/"; + AnalyzerClient analyzerClient; + private static final int HOURS_BEFORE_START = 2; @Override @@ -109,7 +108,7 @@ public List getFreeEvents(@NonNull FreeGetData dto, HttpServletRe if (dto.sort() != null) { switch (dto.sort()) { case EVENT_DATE -> sort = Sort.by("eventDate").ascending(); - case VIEWS -> sort = Sort.by("views").descending(); + case VIEWS -> sort = Sort.by("rating").descending(); } } @@ -122,33 +121,19 @@ public List getFreeEvents(@NonNull FreeGetData dto, HttpServletRe var confirmedRequestsCounts = fetchConfirmedRequestsCount( events.stream().map(Event::getId).toList()); - - Map eventIdToRequestCount = getRequestCountMap(confirmedRequestsCounts); - - var statsData = StatsRequestData.builder() - .uris(getUris(events)) - .start(dto.rangeStart()) - .end(dto.rangeEnd()) - .unique(false) - .build(); - - var statsOptional = statsFeignRepository.getStatList(statsData); - - Map userIdToInitiator = getUserShortDtoMap(events); + var eventIdToRequestCount = getRequestCountMap(confirmedRequestsCounts); + var eventIdToRating = getRatingMap(events.stream().map(Event::getId).toList()); + var userIdToInitiator = getUserShortDtoMap(events); return events.stream() .map(event -> { var userId = event.getInitiatorId(); var confirmets = eventIdToRequestCount.getOrDefault(userId, 0L); - AtomicLong views = new AtomicLong(); - statsOptional.ifPresentOrElse(stats -> - views.set(getViewsFromStatsList(stats, event.getId())), - () -> views.set(1L) - ); + double rating = eventIdToRating.getOrDefault(event.getId(), 0.0); var eventData = EventData.builder() .initiator(userIdToInitiator.get(userId)) .confirmedRequests(confirmets) - .views(views.get()) + .rating(rating) .build(); return EventMapper.toEventShortDto(event, eventData); }) @@ -161,27 +146,13 @@ public EventFullDto getFreeEventById(Long eventId, @NonNull HttpServletRequest r var event = getEventById(eventId); var initiator = UserMapper.toUserShortDto(getUserById(event.getInitiatorId())); - var uris = List.of(request.getRequestURI()); - var statsOptional = statsFeignRepository.getStatList( - StatsRequestData.builder() - .uris(uris) - .unique(true) - .build() - ); - - long views = statsOptional.map(viewStatsDtos -> viewStatsDtos.stream() - .findFirst() - .map(ViewStatsDto::getHits) - .orElse(0L) - ) - .orElse(1L); - + var rating = getRating(eventId); var confirmedRequestsCount = getConfirmedRequestsCountByEventId(eventId); var eventData = EventData.builder() .initiator(initiator) .confirmedRequests(confirmedRequestsCount) - .views(views) + .rating(rating) .build(); return EventMapper.toEventFullDto(event, eventData); @@ -218,7 +189,7 @@ public EventFullDto userAddNewEvent(Long userId, @NonNull NewEventDto newEventDt var eventData = EventData.builder() .initiator(initiator) .confirmedRequests(0) - .views(0) + .rating(0) .build(); return EventMapper.toEventFullDto(event, eventData); @@ -252,16 +223,9 @@ public List adminGetEvents(@NonNull AdminGetData dto) { List confirmedRequestsCounts = fetchConfirmedRequestsCount( events.stream().map(Event::getId).toList()); - Map eventIdToRequestCount = getRequestCountMap(confirmedRequestsCounts); + var eventIdToRequestCount = getRequestCountMap(confirmedRequestsCounts); - var statsData = StatsRequestData.builder() - .uris(getUris(events)) - .start(dto.rangeStart()) - .end(dto.rangeEnd()) - .unique(false) - .build(); - - var statsOptional = statsFeignRepository.getStatList(statsData); + var eventIdToRating = getRatingMap(events.stream().map(Event::getId).toList()); Map initiators = getUserShortDtoMap(events); @@ -269,15 +233,11 @@ public List adminGetEvents(@NonNull AdminGetData dto) { .map(event -> { var userId = event.getInitiatorId(); var count = getConfirmedRequestsCountFromMap(eventIdToRequestCount, event.getId()); - AtomicLong views = new AtomicLong(); - statsOptional.ifPresentOrElse(stats -> - views.set(getViewsFromStatsList(stats, event.getId())), - () -> views.set(1L) - ); + double rating = eventIdToRating.getOrDefault(event.getId(), 0.0); var eventData = EventData.builder() .initiator(initiators.get(userId)) .confirmedRequests(count) - .views(views.get()) + .rating(rating) .build(); return EventMapper.toEventFullDto(event, eventData); }) @@ -358,30 +318,20 @@ public List findByUserId(Long userId, Integer from, Integer size) List confirmedRequestsCounts = fetchConfirmedRequestsCount( events.stream().map(Event::getId).toList()); - Map eventIdToRequestCount = getRequestCountMap(confirmedRequestsCounts); + var eventIdToRequestCount = getRequestCountMap(confirmedRequestsCounts); - List uris = getUris(events); - var statsOptional = statsFeignRepository.getStatList( - StatsRequestData.builder() - .uris(uris) - .unique(true) - .build() - ); + var eventIdToRating = getRatingMap(events.stream().map(Event::getId).toList()); Map initiators = getUserShortDtoMap(events); return events.stream() .map(event -> { var count = getConfirmedRequestsCountFromMap(eventIdToRequestCount, event.getId()); - AtomicLong views = new AtomicLong(); - statsOptional.ifPresentOrElse(stats -> - views.set(getViewsFromStatsList(stats, event.getId())), - () -> views.set(1L) - ); + double rating = eventIdToRating.getOrDefault(event.getId(), 0.0); var eventData = EventData.builder() .initiator(initiators.get(userId)) .confirmedRequests(count) - .views(views.get()) + .rating(rating) .build(); return EventMapper.toEventShortDto(event, eventData); }) @@ -408,7 +358,7 @@ public EventFullDto findEventById(long eventId, long confirmets) { var eventData = EventData.builder() .initiator(UserMapper.toUserShortDto(getUserById(event.getInitiatorId()))) .confirmedRequests(confirmets) - .views(getViews(event.getId())) + .rating(getRating(eventId)) .build(); return EventMapper.toEventFullDto(event, eventData); @@ -425,6 +375,42 @@ public EventFullDto patchEvent(Long userId, Long eventId, @NonNull UpdateEventUs return patchEvent(eventId, request, false); } + @Override + public List getRecommendationsForUser(long userId, int maxResults) { + + // Получаем предсказания + List predicteds = analyzerClient.getRecomendationsForUser(userId, maxResults); + if (predicteds.isEmpty()) { + return Collections.emptyList(); + } + + var eventIds = predicteds.stream() + .map(PredictedScore::eventId) + .toList(); + + var events = eventRepository.findAllById(eventIds); + + var confirmedRequestsCounts = fetchConfirmedRequestsCount( + events.stream().map(Event::getId).toList()); + var eventIdToRequestCount = getRequestCountMap(confirmedRequestsCounts); + var eventIdToRating = getRatingMap(events.stream().map(Event::getId).toList()); + var userIdToInitiator = getUserShortDtoMap(events); + + return events.stream() + .map(event -> { + var currentUserId = event.getInitiatorId(); + var confirmets = eventIdToRequestCount.getOrDefault(currentUserId, 0L); + double rating = eventIdToRating.getOrDefault(event.getId(), 0.0); + var eventData = EventData.builder() + .initiator(userIdToInitiator.get(currentUserId)) + .confirmedRequests(confirmets) + .rating(rating) + .build(); + return EventMapper.toEventShortDto(event, eventData); + }) + .toList(); + } + @Override public long getInitiatorIfPublished(Long eventId) { checkEvent(eventId); @@ -503,11 +489,6 @@ private List fetchConfirmedRequestsCount(List events) { return requestFeignRepository.getConfirmedRequestsCount(events); } - @NonNull - private List getUris(@NonNull List events) { - return events.stream().map(event -> EVENTS_PATH + event.getId()).toList(); - } - private Map getRequestCountMap(@NonNull List eventRequestCountList) { return eventRequestCountList.stream() .collect(Collectors.toMap(EventRequestCount::eventId, EventRequestCount::count, @@ -526,10 +507,18 @@ private EventData getEventData(long eventId, long initiatorId) { return EventData.builder() .initiator(UserMapper.toUserShortDto(getUserById(initiatorId))) .confirmedRequests(getConfirmedRequestsCountByEventId(eventId)) - .views(getViews(eventId)) + .rating(getRating(eventId)) .build(); } + private double getRating(long eventId) { + return analyzerClient.getInteractionsCount( + List.of(eventId)).stream() + .map(ActionsWeightsSum::score) + .findAny() + .orElse(0.0); + } + @NonNull private UserDto getUserById(long userId) { return userFeignRepository.getUserDtoById(userId); @@ -558,27 +547,6 @@ private long getConfirmedRequestsCountByEventId(long eventId) { return counts.getFirst().count(); } - private long getViews(long eventId) { - var uris = List.of(EVENTS_PATH + eventId); - var statsOptional = statsFeignRepository.getStatList( - StatsRequestData.builder() - .uris(uris) - .unique(true) - .build() - ); - - if (statsOptional.isEmpty()) { - return 1; - } - - List stats = statsOptional.get(); - - if (stats.isEmpty()) { - return 0; - } - return stats.getFirst().getHits(); - } - private long getConfirmedRequestsCountFromMap(@NonNull Map requestCountMap, long eventId) { @@ -591,12 +559,13 @@ private long getConfirmedRequestsCountFromMap(@NonNull return 0; } - private long getViewsFromStatsList(@NonNull List viewStatsMap, long eventId) { - return viewStatsMap.stream() - .filter(statsDto -> statsDto.getUri().equals(EVENTS_PATH + eventId)) - .map(ViewStatsDto::getHits) - .findAny() - .orElse(0L); + private Map getRatingMap(@NonNull List eventIds) { + if (eventIds.isEmpty()) { + return Collections.emptyMap(); + } + + return analyzerClient.getInteractionsCount(eventIds).stream() + .collect(Collectors.toMap(ActionsWeightsSum::eventId, ActionsWeightsSum::score)); } } diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/service/rating/EventRatingService.java b/core/event-service/src/main/java/ru/practicum/ewm/events/service/rating/EventRatingService.java deleted file mode 100644 index aecad37..0000000 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/service/rating/EventRatingService.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.practicum.ewm.events.service.rating; - -import org.springframework.transaction.annotation.Transactional; -import ru.practicum.aggregation.dto.rating.come.update.RatingUpdateRequest; - -@Transactional -public interface EventRatingService { - - void updateRating(RatingUpdateRequest request); -} diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/service/rating/EventRatingServiceImpl.java b/core/event-service/src/main/java/ru/practicum/ewm/events/service/rating/EventRatingServiceImpl.java deleted file mode 100644 index a31ca86..0000000 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/service/rating/EventRatingServiceImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.practicum.ewm.events.service.rating; - -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.experimental.FieldDefaults; -import org.springframework.lang.NonNull; -import org.springframework.stereotype.Service; -import ru.practicum.aggregation.dto.rating.come.update.RatingUpdateRequest; -import ru.practicum.aggregation.error.exception.bussines.cause.NotFoundException; -import ru.practicum.ewm.events.entity.Event; -import ru.practicum.ewm.events.repository.EventRepository; - -@Service -@RequiredArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) -public class EventRatingServiceImpl implements EventRatingService { - - EventRepository eventRepository; - - @Override - public void updateRating(@NonNull RatingUpdateRequest request) { - Event event = eventRepository.findById(request.eventId()).orElseThrow(() -> - new NotFoundException("Событие с id=%s не найдено".formatted(request.eventId()))); - event.setRate(request.rate()); - eventRepository.save(event); - } -} diff --git a/core/event-service/src/main/resources/application-test.yaml.bak b/core/event-service/src/main/resources/application-test.yaml.bak deleted file mode 100644 index b8c881d..0000000 --- a/core/event-service/src/main/resources/application-test.yaml.bak +++ /dev/null @@ -1,10 +0,0 @@ -spring: - jpa: - hibernate: - ddl-auto: none - sql: - init: - schema-locations: classpath:schema-h2.sql - datasource: - driver-class-name: org.h2.Driver - url: jdbc:h2:mem:ewm-main diff --git a/core/event-service/src/main/resources/schema-h2.sql.bak b/core/event-service/src/main/resources/schema-h2.sql.bak deleted file mode 100644 index 06d81b3..0000000 --- a/core/event-service/src/main/resources/schema-h2.sql.bak +++ /dev/null @@ -1,93 +0,0 @@ --- generated by gpt -CREATE TABLE IF NOT EXISTS users ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - email VARCHAR(255) NOT NULL, - name VARCHAR(255) NOT NULL -); -CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users (email); - -CREATE TABLE IF NOT EXISTS categories ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - name VARCHAR(50) NOT NULL -); -CREATE UNIQUE INDEX IF NOT EXISTS idx_categories_name ON categories (name); - -CREATE TABLE IF NOT EXISTS events ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - annotation VARCHAR(2000) NOT NULL, - created_on TIMESTAMP NOT NULL, - description VARCHAR(7000) NOT NULL, - event_date TIMESTAMP NOT NULL, - location CLOB, - paid BOOLEAN NOT NULL, - participant_limit INT NOT NULL, - published_on TIMESTAMP, - request_moderation BOOLEAN NOT NULL, - state VARCHAR(255) NOT NULL, - title VARCHAR(120) NOT NULL, - category_id BIGINT, - initiator_id BIGINT, - rate BIGINT NOT NULL DEFAULT 0, - - CONSTRAINT fk_events_users - FOREIGN KEY (initiator_id) - REFERENCES users(id), - - CONSTRAINT fk_events_categories - FOREIGN KEY (category_id) - REFERENCES categories(id), - - CONSTRAINT chk_events_state - CHECK (state IN ('PENDING','PUBLISHED','CANCELED')) -); - -CREATE TABLE IF NOT EXISTS requests ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - created TIMESTAMP, - status VARCHAR(255), - - event_id BIGINT, - requester_id BIGINT, - - CONSTRAINT fk_requests_users - FOREIGN KEY (requester_id) - REFERENCES users(id), - - CONSTRAINT fk_requests_events - FOREIGN KEY (event_id) - REFERENCES events(id), - - CONSTRAINT chk_requests_status - CHECK (status IN ('PENDING', 'CONFIRMED', 'REJECTED', 'CANCELED')) -); - -CREATE TABLE IF NOT EXISTS compilations ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - pinned BOOLEAN NOT NULL, - title VARCHAR(50) NOT NULL -); - -CREATE TABLE IF NOT EXISTS compilation_events ( - compilations_id BIGINT NOT NULL, - events_id BIGINT NOT NULL, - - CONSTRAINT fk_events_compilations - FOREIGN KEY (compilations_id) - REFERENCES compilations(id) - ON DELETE CASCADE, - - CONSTRAINT fk_compilations_events - FOREIGN KEY (events_id) - REFERENCES events(id) - ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS ratings ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - user_id BIGINT NOT NULL, - event_id BIGINT NOT NULL, - reaction VARCHAR(10) NOT NULL CHECK (reaction IN ('LIKE', 'DISLIKE')), - CONSTRAINT uq_ratings_user_event UNIQUE (user_id, event_id), - CONSTRAINT fk_ratings_users FOREIGN KEY (user_id) REFERENCES users(id), - CONSTRAINT fk_ratings_events FOREIGN KEY (event_id) REFERENCES events(id) -); \ No newline at end of file diff --git a/core/event-service/src/main/resources/schema-postgres.sql b/core/event-service/src/main/resources/schema-postgres.sql index 1345dd0..cbbce70 100644 --- a/core/event-service/src/main/resources/schema-postgres.sql +++ b/core/event-service/src/main/resources/schema-postgres.sql @@ -20,7 +20,6 @@ CREATE TABLE IF NOT EXISTS events ( title varchar(120) NOT NULL, category_id bigint, initiator_id bigint, - rate bigint NOT NULL DEFAULT 0, CONSTRAINT pk_events PRIMARY KEY (id), CONSTRAINT fk_events_categories FOREIGN KEY (category_id) REFERENCES categories (id) MATCH SIMPLE diff --git a/core/event-service/src/main/resources/schema-postgres.sql.bak b/core/event-service/src/main/resources/schema-postgres.sql.bak deleted file mode 100644 index eafdc8b..0000000 --- a/core/event-service/src/main/resources/schema-postgres.sql.bak +++ /dev/null @@ -1,93 +0,0 @@ -CREATE TABLE IF NOT EXISTS public.users ( - id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - email varchar(255) NOT NULL, - name varchar(255) NOT NULL, - CONSTRAINT pk_users PRIMARY KEY (id) -); -CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users (email); - -CREATE TABLE IF NOT EXISTS public.categories ( - id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - name varchar(50) NOT NULL, - CONSTRAINT pk_categories PRIMARY KEY (id) -); -CREATE UNIQUE INDEX IF NOT EXISTS idx_categories_name ON categories (name); - -CREATE TABLE IF NOT EXISTS public.events ( - id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - annotation varchar(2000) NOT NULL, - created_on timestamp(3) without time zone NOT NULL, - description varchar(7000) NOT NULL, - event_date timestamp(3) without time zone NOT NULL, - location jsonb, - paid boolean NOT NULL, - participant_limit integer NOT NULL, - published_on timestamp(3) without time zone, - request_moderation boolean NOT NULL, - state varchar(255) check (state in ('PENDING','PUBLISHED','CANCELED')) NOT NULL, - title varchar(120) NOT NULL, - category_id bigint, - initiator_id bigint, - rate bigint NOT NULL DEFAULT 0, - CONSTRAINT pk_events PRIMARY KEY (id), - CONSTRAINT fk_events_users FOREIGN KEY (initiator_id) - REFERENCES public.users (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE NO ACTION, - CONSTRAINT fk_events_categories FOREIGN KEY (category_id) - REFERENCES public.categories (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE NO ACTION -); - -CREATE TABLE IF NOT EXISTS public.requests ( - id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - created timestamp(3) without time zone, - status varchar(255) check (status in ('PENDING', 'CONFIRMED', 'REJECTED', 'CANCELED')), - event_id bigint, - requester_id bigint, - CONSTRAINT pk_requests PRIMARY KEY (id), - CONSTRAINT fk_requests_users FOREIGN KEY (requester_id) - REFERENCES public.users (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE NO ACTION, - CONSTRAINT fk_requests_events FOREIGN KEY (event_id) - REFERENCES public.events (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE NO ACTION -); - -CREATE TABLE IF NOT EXISTS public.compilations ( - id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - pinned boolean NOT NULL, - title varchar(50) NOT NULL, - CONSTRAINT pk_compilations PRIMARY KEY (id) -); - -CREATE TABLE IF NOT EXISTS public.compilation_events ( - compilations_id bigint NOT NULL, - events_id bigint NOT NULL, - CONSTRAINT fk_events_compilations FOREIGN KEY (compilations_id) - REFERENCES public.compilations (id) MATCH SIMPLE - ON DELETE CASCADE, - CONSTRAINT fk_compilations_events FOREIGN KEY (events_id) - REFERENCES public.events (id) MATCH SIMPLE - ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS public.ratings ( - id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - user_id bigint NOT NULL, - event_id bigint NOT NULL, - reaction varchar(10) NOT NULL CHECK (reaction IN ('LIKE', 'DISLIKE')), - CONSTRAINT pk_ratings PRIMARY KEY (id), - CONSTRAINT uq_ratings_user_event UNIQUE (user_id, event_id), - CONSTRAINT fk_ratings_users FOREIGN KEY (user_id) - REFERENCES public.users (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE NO ACTION, - CONSTRAINT fk_ratings_events FOREIGN KEY (event_id) - REFERENCES public.events (id) MATCH SIMPLE - ON UPDATE NO ACTION - ON DELETE NO ACTION -); diff --git a/core/pom.xml b/core/pom.xml index c91243d..2584ac9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -18,7 +18,6 @@ event-service request-service user-service - rating-service diff --git a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/RatingServiceApp.java b/core/rating-service/src/main/java/ru/practicum/ewm/ratings/RatingServiceApp.java deleted file mode 100644 index 64ea6eb..0000000 --- a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/RatingServiceApp.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.practicum.ewm.ratings; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.ConfigurationPropertiesScan; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.context.annotation.ComponentScan; -import ru.practicum.aggregation.client.event.EventClient; -import ru.practicum.aggregation.client.request.RequestClient; -import ru.practicum.aggregation.client.stats.StatsClient; -import ru.practicum.aggregation.client.user.UserClient; -import ru.practicum.aggregation.config.JacksonConfiguration; - -@SpringBootApplication -@EnableFeignClients(clients = { - UserClient.class, - EventClient.class, - RequestClient.class, - StatsClient.class -}) -@ComponentScan(value = { - "ru.practicum.ewm.ratings", - "ru.practicum.aggregation.config", - "ru.practicum.aggregation.client", - "ru.practicum.aggregation.error", - "ru.practicum.aggregation.repository" -}) -@ConfigurationPropertiesScan(basePackageClasses = JacksonConfiguration.class) -public class RatingServiceApp { - public static void main(String[] args) { - SpringApplication.run(RatingServiceApp.class, args); - } -} diff --git a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/controller/UserRatingController.java b/core/rating-service/src/main/java/ru/practicum/ewm/ratings/controller/UserRatingController.java deleted file mode 100644 index 95a662e..0000000 --- a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/controller/UserRatingController.java +++ /dev/null @@ -1,50 +0,0 @@ -package ru.practicum.ewm.ratings.controller; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.validation.Valid; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; -import ru.practicum.aggregation.dto.rating.come.create.RatingCreateRequest; -import ru.practicum.aggregation.dto.rating.output.RatingResponse; -import ru.practicum.ewm.ratings.service.RatingService; - -@Slf4j -@RestController -@RequestMapping("/users/{userId}/events/{eventId}/likes") -@RequiredArgsConstructor -public class UserRatingController { - - private final RatingService ratingService; - - @PostMapping - @ResponseStatus(HttpStatus.CREATED) - public RatingResponse addReaction(@PathVariable Long userId, - @PathVariable Long eventId, - @Valid @RequestBody RatingCreateRequest createRequest, - @NonNull HttpServletRequest request) { - - log.info(""" - ENDPOINT - Добавление новой реакции - {} {}""", request.getMethod(), request.getRequestURI()); - - return ratingService.addOrUpdateReaction(userId, eventId, createRequest); - } - - @DeleteMapping - @ResponseStatus(HttpStatus.NO_CONTENT) - public void removeReaction(@PathVariable Long userId, - @PathVariable Long eventId, - @NonNull HttpServletRequest request) { - log.info(""" - ENDPOINT - Удаление реакции - {} {}""", request.getMethod(), request.getRequestURI()); - - ratingService.removeReaction(userId, eventId); - } - -} \ No newline at end of file diff --git a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/entity/Rating.java b/core/rating-service/src/main/java/ru/practicum/ewm/ratings/entity/Rating.java deleted file mode 100644 index ad15357..0000000 --- a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/entity/Rating.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.practicum.ewm.ratings.entity; - -import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.FieldDefaults; -import lombok.experimental.SuperBuilder; -import ru.practicum.aggregation.enums.Reaction; -import ru.practicum.aggregation.model.entity.BaseEntity; - -@Getter -@Setter -@Entity -@Table(name = "ratings", uniqueConstraints = { - @UniqueConstraint(columnNames = {"user_id", "event_id"}) -}) -@SuperBuilder -@NoArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE) -public class Rating extends BaseEntity { - - @JoinColumn(name = "user_id", nullable = false) - Long userId; - - @JoinColumn(name = "event_id", nullable = false) - Long eventId; - - @Enumerated(EnumType.STRING) - @Column(nullable = false) - Reaction reaction; -} diff --git a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/mapper/RatingMapper.java b/core/rating-service/src/main/java/ru/practicum/ewm/ratings/mapper/RatingMapper.java deleted file mode 100644 index fc293e9..0000000 --- a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/mapper/RatingMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.practicum.ewm.ratings.mapper; - -import lombok.NonNull; -import lombok.experimental.UtilityClass; -import ru.practicum.aggregation.dto.rating.output.RatingResponse; -import ru.practicum.ewm.ratings.entity.Rating; - -@UtilityClass -public class RatingMapper { - - public RatingResponse mapToResponse(@NonNull Rating rating) { - return RatingResponse.builder() - .id(rating.getId()) - .userId(rating.getUserId()) - .eventId(rating.getEventId()) - .reaction(rating.getReaction()) - .build(); - } -} diff --git a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/repository/RatingRepository.java b/core/rating-service/src/main/java/ru/practicum/ewm/ratings/repository/RatingRepository.java deleted file mode 100644 index 91753f2..0000000 --- a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/repository/RatingRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.practicum.ewm.ratings.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import ru.practicum.aggregation.enums.Reaction; -import ru.practicum.ewm.ratings.entity.Rating; - -import java.util.Optional; - -public interface RatingRepository extends JpaRepository { - - Optional findByUserIdAndEventId(Long userId, Long eventId); - - long countByEventIdAndReaction(Long eventId, Reaction reaction); -} diff --git a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/service/RatingService.java b/core/rating-service/src/main/java/ru/practicum/ewm/ratings/service/RatingService.java deleted file mode 100644 index 2266e02..0000000 --- a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/service/RatingService.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.practicum.ewm.ratings.service; - -import org.springframework.transaction.annotation.Transactional; -import ru.practicum.aggregation.dto.rating.come.create.RatingCreateRequest; -import ru.practicum.aggregation.dto.rating.output.RatingResponse; - -@Transactional -public interface RatingService { - - RatingResponse addOrUpdateReaction(long userId, long eventId, RatingCreateRequest request); - - void removeReaction(long userId, long eventId); -} diff --git a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/service/RatingServiceImpl.java b/core/rating-service/src/main/java/ru/practicum/ewm/ratings/service/RatingServiceImpl.java deleted file mode 100644 index 7bd9d23..0000000 --- a/core/rating-service/src/main/java/ru/practicum/ewm/ratings/service/RatingServiceImpl.java +++ /dev/null @@ -1,101 +0,0 @@ -package ru.practicum.ewm.ratings.service; - -import jakarta.validation.ValidationException; -import lombok.AccessLevel; -import lombok.RequiredArgsConstructor; -import lombok.experimental.FieldDefaults; -import org.springframework.lang.NonNull; -import org.springframework.stereotype.Service; -import ru.practicum.aggregation.dto.rating.come.create.RatingCreateRequest; -import ru.practicum.aggregation.dto.rating.come.update.RatingUpdateRequest; -import ru.practicum.aggregation.dto.rating.output.RatingResponse; -import ru.practicum.aggregation.enums.Reaction; -import ru.practicum.aggregation.error.exception.bussines.cause.ConflictException; -import ru.practicum.aggregation.error.exception.bussines.cause.NotFoundException; -import ru.practicum.aggregation.repository.EventFeignRepository; -import ru.practicum.ewm.ratings.entity.Rating; -import ru.practicum.ewm.ratings.mapper.RatingMapper; -import ru.practicum.ewm.ratings.repository.RatingRepository; - -import java.util.Objects; - -@Service -@RequiredArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) -public class RatingServiceImpl implements RatingService { - - RatingRepository ratingRepository; - - EventFeignRepository eventFeignRepository; - - @Override - public RatingResponse addOrUpdateReaction(long userId, - long eventId, - @NonNull RatingCreateRequest request) { - - var initiatorId = eventFeignRepository.getInitiatorIfPublished(eventId); - - if (Objects.equals(userId, initiatorId)) { - throw new ValidationException("Нельзя ставить реакции своим событиям"); - } - - var rating = ratingRepository - .findByUserIdAndEventId(userId, eventId) - .orElse(null); - var requestReaction = request.reaction(); - - if (rating != null) { - if (rating.getReaction() == requestReaction) { - ratingRepository.delete(rating); - updateEventRate(eventId); - throw new ConflictException(""" - Реакция пользователя с id=%s событию с id=%s, удалена""" - .formatted(userId, eventId)); - } else { - rating.setReaction(requestReaction); - ratingRepository.save(rating); - updateEventRate(eventId); - return RatingMapper.mapToResponse(rating); - } - } else { - rating = Rating.builder() - .userId(userId) - .eventId(eventId) - .reaction(requestReaction) - .build(); - ratingRepository.save(rating); - updateEventRate(eventId); - return RatingMapper.mapToResponse(rating); - } - } - - @Override - public void removeReaction(long userId, long eventId) { - ratingRepository.findByUserIdAndEventId(userId, eventId) - .ifPresentOrElse(ratingRepository::delete, - () -> { - updateEventRate(eventId); - throw new NotFoundException( - "Реакция пользователя с id=%s событию с id=%s, не найдена" - .formatted(userId, eventId) - ); - } - ); - - updateEventRate(eventId); - } - - private void updateEventRate(long eventId) { - long likes = ratingRepository.countByEventIdAndReaction(eventId, Reaction.LIKE); - long dislikes = ratingRepository.countByEventIdAndReaction(eventId, Reaction.DISLIKE); - long rate = likes - dislikes; - - var request = RatingUpdateRequest.builder() - .eventId(eventId) - .rate(rate) - .build(); - - eventFeignRepository.updateRating(request); - } - -} diff --git a/core/rating-service/src/main/resources/schema-postgres.sql b/core/rating-service/src/main/resources/schema-postgres.sql deleted file mode 100644 index 83fc95d..0000000 --- a/core/rating-service/src/main/resources/schema-postgres.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE IF NOT EXISTS ratings ( - id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, - user_id bigint NOT NULL, - event_id bigint NOT NULL, - reaction varchar(10) NOT NULL CHECK (reaction IN ('LIKE', 'DISLIKE')), - CONSTRAINT pk_ratings PRIMARY KEY (id), - CONSTRAINT uq_ratings_user_event UNIQUE (user_id, event_id) -); diff --git a/core/request-service/pom.xml b/core/request-service/pom.xml index 589db77..da8cf1c 100644 --- a/core/request-service/pom.xml +++ b/core/request-service/pom.xml @@ -18,6 +18,11 @@ aggregation-api 0.0.1-SNAPSHOT + + ru.practicum + stat-client + 0.0.1-SNAPSHOT + org.springframework.boot @@ -102,6 +107,12 @@ org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j + + ru.practicum + stats-client + 0.0.1-SNAPSHOT + compile + diff --git a/core/request-service/src/main/java/ru/practicum/ewm/requests/RequestServiceApp.java b/core/request-service/src/main/java/ru/practicum/ewm/requests/RequestServiceApp.java index f5824cf..a09584d 100644 --- a/core/request-service/src/main/java/ru/practicum/ewm/requests/RequestServiceApp.java +++ b/core/request-service/src/main/java/ru/practicum/ewm/requests/RequestServiceApp.java @@ -7,7 +7,6 @@ import org.springframework.context.annotation.ComponentScan; import ru.practicum.aggregation.client.event.EventClient; import ru.practicum.aggregation.client.request.RequestClient; -import ru.practicum.aggregation.client.stats.StatsClient; import ru.practicum.aggregation.client.user.UserClient; import ru.practicum.aggregation.config.JacksonConfiguration; @@ -15,15 +14,15 @@ @EnableFeignClients(clients = { UserClient.class, EventClient.class, - RequestClient.class, - StatsClient.class + RequestClient.class }) @ComponentScan(value = { "ru.practicum.ewm.requests", "ru.practicum.aggregation.config", "ru.practicum.aggregation.client", "ru.practicum.aggregation.error", - "ru.practicum.aggregation.repository" + "ru.practicum.aggregation.repository", + "ru.practicum.stats.client.grpc" }) @ConfigurationPropertiesScan(basePackageClasses = JacksonConfiguration.class) public class RequestServiceApp { diff --git a/core/request-service/src/main/java/ru/practicum/ewm/requests/controller/UserRequestController.java b/core/request-service/src/main/java/ru/practicum/ewm/requests/controller/UserRequestController.java index 0e237cf..f570497 100644 --- a/core/request-service/src/main/java/ru/practicum/ewm/requests/controller/UserRequestController.java +++ b/core/request-service/src/main/java/ru/practicum/ewm/requests/controller/UserRequestController.java @@ -2,23 +2,31 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.constraints.Positive; +import lombok.AccessLevel; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import ru.practicum.aggregation.dto.participation.output.ParticipationRequestDto; import ru.practicum.ewm.requests.service.RequestService; +import ru.practicum.stats.client.dto.ActionType; +import ru.practicum.stats.client.dto.UserActionDto; +import ru.practicum.stats.client.grpc.CollectorClient; +import java.time.LocalDateTime; import java.util.List; @Slf4j @RestController @RequestMapping(path = "/users/{userId}/requests") @RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class UserRequestController { - private final RequestService requestService; + RequestService requestService; + CollectorClient collectorClient; /** * В случае, если по заданным фильтрам не найдено ни одной заявки, возвращает пустой список @@ -58,7 +66,18 @@ public ParticipationRequestDto addParticipationRequest(@PathVariable @Positive L Добавление запроса от текущего пользователя на участие в событии {} {}""", request.getMethod(), request.getRequestURI()); - return requestService.addParticipationRequest(userId, eventId); + var result = requestService.addParticipationRequest(userId, eventId); + + log.info("Регистрация на участие в событии {} пользователеля {}", eventId, userId); + collectorClient.collectUserAction( + UserActionDto.builder() + .userId(userId) + .eventId(eventId) + .actionType(ActionType.REGISTER) + .timestamp(LocalDateTime.now()) + .build()); + + return result; } @PatchMapping("/{requestId}/cancel") diff --git a/core/user-service/src/main/java/ru/practicum/ewm/users/UserServiceApp.java b/core/user-service/src/main/java/ru/practicum/ewm/users/UserServiceApp.java index 06801fa..7c7655a 100644 --- a/core/user-service/src/main/java/ru/practicum/ewm/users/UserServiceApp.java +++ b/core/user-service/src/main/java/ru/practicum/ewm/users/UserServiceApp.java @@ -7,7 +7,6 @@ import org.springframework.context.annotation.ComponentScan; import ru.practicum.aggregation.client.event.EventClient; import ru.practicum.aggregation.client.request.RequestClient; -import ru.practicum.aggregation.client.stats.StatsClient; import ru.practicum.aggregation.client.user.UserClient; import ru.practicum.aggregation.config.JacksonConfiguration; @@ -15,8 +14,7 @@ @EnableFeignClients(clients = { UserClient.class, EventClient.class, - RequestClient.class, - StatsClient.class + RequestClient.class }) @ComponentScan(value = { "ru.practicum.ewm.users", diff --git a/docker-compose.yml b/docker-compose.yml index 4a7e415..a0b5638 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,10 @@ volumes: postgres_main-db_data: postgres_stats-db_data: + kafka_data: + kafka_secrets: + kafka_init_data: + kafka_init_secrets: services: main-db: @@ -13,7 +17,7 @@ services: - POSTGRES_USER=dbuser - POSTGRES_PASSWORD=12345 volumes: - - ./docker-init.sql:/docker-entrypoint-initdb.d/docker-init.sql:ro + - ./docker-init-core.sql:/docker-entrypoint-initdb.d/docker-init-core.sql:ro - postgres_main-db_data:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready -U dbuser -d ewm-main" ] @@ -31,9 +35,43 @@ services: - POSTGRES_USER=dbuser - POSTGRES_PASSWORD=12345 volumes: + - ./docker-init-stats.sql:/docker-entrypoint-initdb.d/docker-init-stats.sql:ro - postgres_stats-db_data:/var/lib/postgresql/data healthcheck: test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER timeout: 5s interval: 5s retries: 10 + + kafka: + image: confluentinc/confluent-local:7.4.3 + hostname: kafka + container_name: kafka + volumes: + - kafka_data:/var/lib/kafka/data + - kafka_secrets:/etc/kafka/secrets + ports: + - "9092:9092" # for client connections + - "9101:9101" # JMX + restart: unless-stopped + environment: + KAFKA_NODE_ID: 1 + KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092' + KAFKA_JMX_PORT: 9101 + KAFKA_JMX_HOSTNAME: localhost + KAFKA_PROCESS_ROLES: 'broker,controller' + KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093' + KAFKA_LISTENERS: 'PLAINTEXT://kafka:29092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:9092' + CLUSTER_ID: 'K0EA9p0yEe6MkAAAAkKsEg' + + kafka-init-topics: + image: confluentinc/confluent-local:7.4.3 + container_name: kafka-init-topics + volumes: + - kafka_init_data:/var/lib/kafka/data + - kafka_init_secrets:/etc/kafka/secrets + - ./docker-init-topics.sh:/docker-init-topics.sh:ro + depends_on: + - kafka + command: ["bash", "/docker-init-topics.sh"] + init: true diff --git a/docker-init.sql b/docker-init-core.sql similarity index 100% rename from docker-init.sql rename to docker-init-core.sql diff --git a/docker-init-stats.sql b/docker-init-stats.sql new file mode 100644 index 0000000..3d62ad3 --- /dev/null +++ b/docker-init-stats.sql @@ -0,0 +1,6 @@ +CREATE DATABASE "ewm-analyzer"; + +\c "ewm-analyzer" +CREATE SCHEMA IF NOT EXISTS analyzer; +GRANT ALL PRIVILEGES ON SCHEMA analyzer TO dbuser; + diff --git a/docker-init-topics.sh b/docker-init-topics.sh new file mode 100644 index 0000000..935f554 --- /dev/null +++ b/docker-init-topics.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e + +while \ + ! kafka-topics --list --bootstrap-server kafka:29092 > /dev/null 2>&1; + do + sleep 2; +done + +kafka-topics --create --topic stats.user-actions.v1 \ + --partitions 1 --replication-factor 1 --if-not-exists \ + --bootstrap-server kafka:29092 && \ + +kafka-topics --create --topic stats.events-similarity.v1 \ + --partitions 1 --replication-factor 1 --if-not-exists \ + --bootstrap-server kafka:29092 diff --git a/infra/config-repo/core/event-service.yml b/infra/config-repo/core/event-service.yml index d9ff588..980d5c8 100644 --- a/infra/config-repo/core/event-service.yml +++ b/infra/config-repo/core/event-service.yml @@ -47,3 +47,18 @@ resilience4j: configs: default: timeout-duration: 3s + +grpc: + server: + port: 0 + client: + analyzer: + address: 'discovery:///analyzer' + enableKeepAlive: true + keepAliveWithoutCalls: true + negotiationType: plaintext + collector: + address: 'discovery:///collector' + enableKeepAlive: true + keepAliveWithoutCalls: true + negotiationType: plaintext diff --git a/infra/config-repo/core/rating-service.yml b/infra/config-repo/core/rating-service.yml deleted file mode 100644 index d1bc18a..0000000 --- a/infra/config-repo/core/rating-service.yml +++ /dev/null @@ -1,50 +0,0 @@ -spring: - sql.init: - mode: ALWAYS - schema-locations: classpath:schema-postgres.sql - jackson: - serialization.INDENT_OUTPUT: true - datasource: - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://localhost:6541/ewm-ratings?currentSchema=rating_service - username: dbuser - password: 12345 - jpa: - generate-ddl: false - hibernate.ddl-auto: validate - show-sql: false - properties: - hibernate: - format_sql: true - cloud: - openfeign: - okhttp: - enabled: true - client: - config: - default: - connectTimeout: 2000 - readTimeout: 3000 - loggerLevel: basic - circuitbreaker: - enabled: true - -resilience4j: - circuitbreaker: - configs: - default: - sliding-window-size: 5 - failure-rate-threshold: 50 - minimum-number-of-calls: 3 - slow-call-duration-threshold: 3s - slow-call-rate-threshold: 50 - wait-duration-in-open-state: 10s - permitted-number-of-calls-in-half-open-state: 3 - ignore-exceptions: - - ru.practicum.aggregation.error.exception.bussines.ServiceProcessingException - - jakarta.validation.ValidationException - timelimiter: - configs: - default: - timeout-duration: 3s - diff --git a/infra/config-repo/core/request-service.yml b/infra/config-repo/core/request-service.yml index 70d5efd..758d871 100644 --- a/infra/config-repo/core/request-service.yml +++ b/infra/config-repo/core/request-service.yml @@ -48,3 +48,12 @@ resilience4j: default: timeout-duration: 3s +grpc: + server: + port: 0 + client: + collector: + address: 'discovery:///collector' + enableKeepAlive: true + keepAliveWithoutCalls: true + negotiationType: plaintext diff --git a/infra/config-repo/stats/aggregator.yml b/infra/config-repo/stats/aggregator.yml new file mode 100644 index 0000000..c100fc9 --- /dev/null +++ b/infra/config-repo/stats/aggregator.yml @@ -0,0 +1,24 @@ +grpc: + server: + port: 0 + +kafka: + bootstrap-server: localhost:9092 + topics: + users-interaction: stats.user-actions.v1 + events-similarity: stats.events-similarity.v1 + + user-action-consumer-config: + "bootstrap.servers": ${kafka.bootstrap-server} + "group.id": "user-action.group" + "key.deserializer": "org.apache.kafka.common.serialization.LongDeserializer" + "value.deserializer": "ru.practicum.ewm.kafka.deserializer.UserActionsDeserializer" + "auto.offset.reset": "earliest" + "enable.auto.commit": false + "max.poll.records": 10 + "fetch.max.wait.ms": 1000 + + events-similarity-producer-config: + "bootstrap.servers": ${kafka.bootstrap-server} + "key.serializer": "org.apache.kafka.common.serialization.LongSerializer" + "value.serializer": "ru.practicum.ewm.kafka.serializer.GeneralAvroSerializer" diff --git a/infra/config-repo/stats/analyzer.yml b/infra/config-repo/stats/analyzer.yml new file mode 100644 index 0000000..7a92046 --- /dev/null +++ b/infra/config-repo/stats/analyzer.yml @@ -0,0 +1,51 @@ +grpc: + server: + port: 0 + +spring: + sql.init: + mode: ALWAYS + schema-locations: classpath:schema-postgres.sql + jackson: + serialization.INDENT_OUTPUT: true + datasource: + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://localhost:6542/ewm-analyzer?currentSchema=analyzer + username: dbuser + password: 12345 + jpa: + generate-ddl: false + hibernate.ddl-auto: validate + show-sql: false + properties: + hibernate: + format_sql: true + jdbc: + fetch_size: 100 + batch_size: 100 + +kafka: + bootstrap-server: localhost:9092 + topics: + users-interaction: stats.user-actions.v1 + events-similarity: stats.events-similarity.v1 + + users-interaction-consumer-config: + "bootstrap.servers": ${kafka.bootstrap-server} + "group.id": "users-interaction.group" + "key.deserializer": "org.apache.kafka.common.serialization.LongDeserializer" + "value.deserializer": "ru.practicum.ewm.kafka.deserializer.UserActionsDeserializer" + "auto.offset.reset": "earliest" + "enable.auto.commit": false + "max.poll.records": 10 + "fetch.max.wait.ms": 1000 + + events-similarity-consumer-config: + "bootstrap.servers": ${kafka.bootstrap-server} + "group.id": "events-similarity.group" + "key.deserializer": "org.apache.kafka.common.serialization.LongDeserializer" + "value.deserializer": "ru.practicum.ewm.kafka.deserializer.EventsSimilarityDeserializer" + "auto.offset.reset": "earliest" + "enable.auto.commit": false + "max.poll.records": 10 + "fetch.max.wait.ms": 1000 diff --git a/infra/config-repo/stats/collector.yml b/infra/config-repo/stats/collector.yml new file mode 100644 index 0000000..0efc46c --- /dev/null +++ b/infra/config-repo/stats/collector.yml @@ -0,0 +1,15 @@ +grpc: + server: + port: 0 + executor: + type: fixed + max-threads: 100 + core-pool-size: 100 + +kafka: + topics: + users-interaction: stats.user-actions.v1 + user-action-producer-config: + "bootstrap.servers": localhost:9092 + "key.serializer": "org.apache.kafka.common.serialization.LongSerializer" + "value.serializer": "ru.practicum.ewm.kafka.serializer.GeneralAvroSerializer" diff --git a/infra/config-repo/stats/stats-server.yml b/infra/config-repo/stats/stats-server.yml deleted file mode 100644 index 92bfb29..0000000 --- a/infra/config-repo/stats/stats-server.yml +++ /dev/null @@ -1,18 +0,0 @@ -spring: - sql.init: - mode: ALWAYS - schema-locations: classpath:schema-postgres.sql - jackson: - serialization.INDENT_OUTPUT: true - datasource: - driver-class-name: org.postgresql.Driver - url: jdbc:postgresql://localhost:6542/ewm-stats - username: dbuser - password: 12345 - jpa: - generate-ddl: false - hibernate.ddl-auto: validate - show-sql: false - properties: - hibernate: - format_sql: true diff --git a/pom.xml b/pom.xml index 73091ef..548fe23 100644 --- a/pom.xml +++ b/pom.xml @@ -12,9 +12,9 @@ Explore With Me - stats - infra - core + core + infra + stats ru.practicum @@ -24,10 +24,23 @@ 21 + 21 21 UTF-8 + + 2.6.0 + 2025.0.3 + + 1.63.0 + 3.1.0.RELEASE + + 3.9.1 + 1.12.0 + + 3.25.5 + 5.0.1 @@ -39,12 +52,65 @@ pom import + + + org.apache.avro + avro + ${avro.version} + + + org.apache.kafka + kafka-clients + ${kafka.version} + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc-openapi-starter.version} + + + + + net.devh + grpc-spring-boot-starter + ${grpc-spring-boot-starter.version} + + + net.devh + grpc-client-spring-boot-starter + ${grpc-spring-boot-starter.version} + + + net.devh + grpc-server-spring-boot-starter + ${grpc-spring-boot-starter.version} + + + io.grpc + grpc-stub + ${grpc.version} + + + io.grpc + grpc-protobuf + ${grpc.version} + + + org.apache.avro + avro-maven-plugin + ${avro.version} + + + io.github.ascopes + protobuf-maven-plugin + ${protobuf-plugin.version} + org.apache.maven.plugins maven-surefire-plugin diff --git a/stats/aggregator/pom.xml b/stats/aggregator/pom.xml new file mode 100644 index 0000000..3cef4da --- /dev/null +++ b/stats/aggregator/pom.xml @@ -0,0 +1,93 @@ + + + 4.0.0 + + + ru.practicum + stats + 0.0.1-SNAPSHOT + + + aggregator + + + + ru.practicum + avro-schemas + 0.0.1-SNAPSHOT + + + ru.practicum + proto-schemas + 0.0.1-SNAPSHOT + compile + + + ru.practicum + timestamp-utils + 0.0.1-SNAPSHOT + + + + net.devh + grpc-client-spring-boot-starter + + + net.devh + grpc-server-spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-validation + + + org.projectlombok + lombok + provided + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + + + org.springframework.cloud + spring-cloud-starter-config + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + com.github.ben-manes.caffeine + caffeine + + + + org.springframework.boot + spring-boot-starter-actuator + + + io.micrometer + micrometer-registry-prometheus + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/AggregatorApp.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/AggregatorApp.java new file mode 100644 index 0000000..e1daf47 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/AggregatorApp.java @@ -0,0 +1,16 @@ +package ru.practicum.ewm.stats.aggregator; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; + +@SpringBootApplication +public class AggregatorApp { + public static void main(String[] args) { + ConfigurableApplicationContext context = SpringApplication + .run(AggregatorApp.class, args); + + final AggregatorRunner runner = context.getBean(AggregatorRunner.class); + runner.run(args); + } +} diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/AggregatorRunner.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/AggregatorRunner.java new file mode 100644 index 0000000..2551dba --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/AggregatorRunner.java @@ -0,0 +1,30 @@ +package ru.practicum.ewm.stats.aggregator; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.aggregator.consumer.UserActionConsumer; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AggregatorRunner implements CommandLineRunner { + + private final UserActionConsumer userActionConsumer; + + private int cycleNumber = 0; + + @Override + public void run(String... args) { + log.info("Цикл запуска №{}", ++cycleNumber); + + if (!userActionConsumer.isRunning()) { + log.info("Запускаем UserActionConsumer в текущем потоке"); + userActionConsumer.run(); + } else { + log.info("EventsSimilarityClient уже запущен"); + } + } + +} diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/cofig/AggregatorConfig.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/cofig/AggregatorConfig.java new file mode 100644 index 0000000..9664cdf --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/cofig/AggregatorConfig.java @@ -0,0 +1,42 @@ +package ru.practicum.ewm.stats.aggregator.cofig; + +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.producer.KafkaProducer; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; + +import java.util.Properties; + +@Configuration +public class AggregatorConfig { + + @Bean + @ConfigurationProperties("kafka.user-action-consumer-config") + public Properties usersInteractionConsumerConfig() { + return new Properties(); + } + + @Bean + @ConfigurationProperties("kafka.events-similarity-producer-config") + public Properties eventsSimilarityProducerConfig() { + return new Properties(); + } + + @Bean(destroyMethod = "") + public KafkaConsumer usersInteractionKafkaConsumer( + @Qualifier("usersInteractionConsumerConfig") Properties config + ) { + return new KafkaConsumer<>(config); + } + + @Bean + public KafkaProducer eventsSimilarityKafkaProducer( + @Qualifier("eventsSimilarityProducerConfig") Properties config + ) { + return new KafkaProducer<>(config); + } +} diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/consumer/BaseKafkaProcessor.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/consumer/BaseKafkaProcessor.java new file mode 100644 index 0000000..d1af2e8 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/consumer/BaseKafkaProcessor.java @@ -0,0 +1,129 @@ +package ru.practicum.ewm.stats.aggregator.consumer; + +import jakarta.annotation.PreDestroy; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.consumer.OffsetAndMetadata; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.errors.WakeupException; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.telemetry.utils.TimestampUtils; + +import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +public abstract class BaseKafkaProcessor implements Runnable { + + final String topic; + + private final KafkaConsumer consumer; + + private final Map lastOffsets = new HashMap<>(); + + private static final Duration CONSUME_ATTEMPT_TIMEOUT = Duration.ofMillis(1000); + + @Getter + private volatile boolean running = false; + + public BaseKafkaProcessor(String topic, KafkaConsumer consumer) { + this.topic = topic; + this.consumer = consumer; + } + + @PreDestroy + public void shutdown() { + log.info("Получил сигнал остановки"); + running = false; + consumer.wakeup(); + } + + @Override + public void run() { + running = true; + + log.info("Подписка на топик: {}", topic); + consumer.subscribe(Collections.singleton(topic)); + + try { + pollLoop(); + + } catch (WakeupException ignored) { + log.info("Получил инструкцию wakeup"); + } catch (Exception e) { + log.error("Ошибка во время обработки событий от хаба", e); + } finally { + log.info("Остановка poll loop"); + running = false; + + try { + if (!lastOffsets.isEmpty()) { + log.info("Регистрация последнего смещения"); + consumer.commitSync(lastOffsets); + } + + } finally { + log.info("Остановка консьюмера"); + consumer.close(); + } + } + } + + private void pollLoop() { + int iteration = 1; + while (running) { + log.debug("Проверка источника событий хаба"); + ConsumerRecords records = consumer.poll(CONSUME_ATTEMPT_TIMEOUT); + + if (records.isEmpty()) { + log.debug("Источник событий хаба пуст"); + continue; + } + + log.info("Итерация {}. Батч из {} записей получен. Начинаем обработку.", + iteration++, records.count() + ); + + int recordNumber = 1; + for (ConsumerRecord record : records) { + + log.info(""" + Обработка действия пользователя №{}: + { + "topic": "{}", + "partition": "{}", + "offset": "{}", + "timestamp": "{}" + }""", + recordNumber++, + record.topic(), + record.partition(), + record.offset(), + TimestampUtils.toLocalDateTime(record.timestamp()) + ); + + try { + processRecord(record.value()); + + log.debug("Сохранение смещения локально"); + lastOffsets.put( + new TopicPartition(record.topic(), record.partition()), + new OffsetAndMetadata(record.offset() + 1) + ); + + } catch (Exception e) { + log.error("Ошибка обновления состояния:\n{}", record.value(), e); + throw e; + } + } + } + } + + protected abstract void processRecord(T record); +} \ No newline at end of file diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/consumer/UserActionConsumer.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/consumer/UserActionConsumer.java new file mode 100644 index 0000000..8229dc6 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/consumer/UserActionConsumer.java @@ -0,0 +1,27 @@ +package ru.practicum.ewm.stats.aggregator.consumer; + +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.aggregator.service.SimilarityService; +import ru.practicum.ewm.stats.avro.UserActionAvro; + +@Slf4j +@Component +public class UserActionConsumer extends BaseKafkaProcessor { + + private final SimilarityService service; + + public UserActionConsumer(@Value("${kafka.topics.users-interaction}") String topic, + KafkaConsumer consumer, + SimilarityService service) { + super(topic, consumer); + this.service = service; + } + + @Override + protected void processRecord(UserActionAvro record) { + service.collectSimilarity(record); + } +} diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/producer/EventsSimilarityProducer.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/producer/EventsSimilarityProducer.java new file mode 100644 index 0000000..0adb819 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/producer/EventsSimilarityProducer.java @@ -0,0 +1,45 @@ +package ru.practicum.ewm.stats.aggregator.producer; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; + +import javax.annotation.Nonnull; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@Component +@RequiredArgsConstructor +public class EventsSimilarityProducer { + + @Value("${kafka.topics.events-similarity}") + private String topic; + + private final Producer producer; + + public CompletableFuture sendMessage( + Long key, + @Nonnull T similarity + ) { + ProducerRecord record = new ProducerRecord<>( + topic, null, key, similarity); + + CompletableFuture future = new CompletableFuture<>(); + + producer.send(record, (metadata, exception) -> { + if (exception != null) { + future.completeExceptionally(exception); + } else { + future.complete(metadata); + } + }); + + return future; + } + +} diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/service/SimilarityService.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/service/SimilarityService.java new file mode 100644 index 0000000..5e8a83c --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/service/SimilarityService.java @@ -0,0 +1,8 @@ +package ru.practicum.ewm.stats.aggregator.service; + +import ru.practicum.ewm.stats.avro.UserActionAvro; + +public interface SimilarityService { + + void collectSimilarity(UserActionAvro record); +} diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/service/SimilarityServiceImpl.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/service/SimilarityServiceImpl.java new file mode 100644 index 0000000..8ee4bed --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/service/SimilarityServiceImpl.java @@ -0,0 +1,425 @@ +package ru.practicum.ewm.stats.aggregator.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.aggregator.producer.EventsSimilarityProducer; +import ru.practicum.ewm.stats.aggregator.util.TableRenderer; +import ru.practicum.ewm.stats.avro.ActionTypeAvro; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.yandex.practicum.telemetry.utils.TimestampUtils; + +import java.time.Instant; +import java.util.*; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SimilarityServiceImpl implements SimilarityService { + + private final EventsSimilarityProducer producer; + + /** + * Матрица ведущих весов
+ * {@code Map>}
+ * где {@code maxActionWeight} - максимальный вес + * из всех действий этого пользователя по этому мероприятию + */ + Map> leadingWeightMatrix = new HashMap<>(); + + /** + * Матрица числителей
+ * {@code Map>}
+ * где {@code SumOfMinWeightsFromMaxActionWeights} - сумма минимальных весов + * по всем ведущим весам всех действий пользоваелей, для этой пары мероприятий + */ + Map> sumOfMinWeightsMatrix = new HashMap<>(); + + /** + * Таблица знаминателей
+ * {@code Map}
+ * где {@code leadingWeightsSum} - сумма ведущих весов всех + * действий пользователей по этому мероприятию + */ + Map eventToLeadingWeightsSum = new HashMap<>(); + + /// Посчитать сходство и отправить в кафку + @Override + public void collectSimilarity(@NonNull UserActionAvro avro) { + + var userId = avro.getUserId(); + var eventId = avro.getEventId(); + var actionType = avro.getActionType(); + + // Получаем ведущий вес + double newLeadingWeight = calculateLeadingWeight(actionType); + + // Проходим верификацию + if (!verifyData(userId, eventId, newLeadingWeight)) { + printMatrix(); + return; + } + + // Считаем сходство + var similarities = calculateSimilarities(eventId, userId); + if (similarities.isEmpty()) { + log.info("Сходства не обнаружены"); + printMatrix(); + return; + } + + // Отправляем по одному + for (EventsSimilarityAvro similarity : similarities) { + sendSimilarity(eventId, similarity); + } + + printMatrix(); + } + + // ----------------------------------BUSSINES-LOGIC------------------------------------- + + private boolean verifyData(long userId, long eventId, double newLeadingWeight) { + + // Получаем или создаем карту для события + var usersToWeights = leadingWeightMatrix + .computeIfAbsent(eventId, k -> new HashMap<>()); + + // Получаем текущий вес пользователя + Double currentLeadingWeight = usersToWeights.get(userId); + + // Если пользователь еще не взаимодействовал с событием + if (currentLeadingWeight == null) { + currentLeadingWeight = 0.0; + } + + // Если веса одинаковые или новый меньше + if (newLeadingWeight <= currentLeadingWeight) { + log.info("Обновлять нечего"); + return false; + } + + log.info(""" + Обновление ведущего веса мероприятия + { + "userId": {}, + "eventId": {}, + "score": {} + }""", + userId, eventId, newLeadingWeight); + + // Заменяем старый ведущий вес на новый + usersToWeights.put(userId, newLeadingWeight); + + // Обновляем сумму весов для события по всем пользователям + updateSumOfLeadingWeights(eventId, currentLeadingWeight, newLeadingWeight); + + // Запускаем пересчет модели весов + recalculateData(eventId, userId, currentLeadingWeight, newLeadingWeight); + + return true; + } + + private void recalculateData(long eventA_Id, + long userId, + double oldLeadingWeight_A, + double leadingWeight_A) { + + leadingWeightMatrix.forEach((eventB_Id, userIdToLeadingWeight) -> { + + // Пропускаем строку с событием А + if (eventB_Id == eventA_Id) { + return; + } + + log.info("Пересчет модели весов для мероприятий {} и {}", eventA_Id, eventB_Id); + + // Получаем ведущий вес В из текущей строки + Double leadingWeight_B = userIdToLeadingWeight.get(userId); + if (leadingWeight_B == null) { + return; // пользователь не взаимодействовал с этим событием + } + + // Вычисляем старый минимальный вес среди ведущих + double oldMinWeight = Math.min(oldLeadingWeight_A, leadingWeight_B); + + // Вычисляем новый минимальный вес среди ведущих + double newMinWeight = Math.min(leadingWeight_A, leadingWeight_B); + + // Вычисляем старую сумму минимальных весов + double oldSumOfMinWeight = getSumOfMinWeight(eventA_Id, eventB_Id); + + // Новая сумма минимальных весов = (старая сумма - старый минимальный вес) + новый минимальный вес + double newSumOfMinWeight = (oldSumOfMinWeight - oldMinWeight) + newMinWeight; + + // Сетим новую сумму минимальных весов в матрицу вместо старой + putNewSumOfMinWeight(eventA_Id, eventB_Id, newSumOfMinWeight); + }); + + log.info("Пересчет данных завершен"); + } + + @NonNull + private List calculateSimilarities(long eventA_Id, long userId) { + + Map candidates = getCandidates(eventA_Id); + if (candidates.isEmpty()) { + log.info("В матрице сходства отсутствуют записи о событии {}", eventA_Id); + return Collections.emptyList(); + } + + List eventIds = new ArrayList<>(); + leadingWeightMatrix.forEach((event_Id, userIdToLeadingWeight) -> { + if (userIdToLeadingWeight.containsKey(userId)) { + eventIds.add(event_Id); + } + }); + + var similarities = new ArrayList(); + candidates.forEach((eventB_Id, sumOfMinWeight) -> { + + if (eventB_Id == eventA_Id) { + return; + } + if (!eventIds.contains(eventB_Id)) { + return; + } + + long eventA = Math.min(eventA_Id, eventB_Id); + long eventB = Math.max(eventA_Id, eventB_Id); + + log.info("Рассчет сходства мероприятий {} и {}", eventA, eventB); + + double leadingWeightsSumByEventA = eventToLeadingWeightsSum.get(eventA); + double leadingWeightsSumByEventB = eventToLeadingWeightsSum.get(eventB); + double norm1 = Math.sqrt(leadingWeightsSumByEventA); + double norm2 = Math.sqrt(leadingWeightsSumByEventB); + + double score = sumOfMinWeight / (norm1 * norm2); + + log.info(""" + Коэффициент подобия + для мероприятий [{}] и [{}] равен [{}] + (min=[{}], norm1=[{}], norm2=[{}]) + """, + eventA, eventB, + (double) Math.round(score * 100) / 100.0, + (double) Math.round(sumOfMinWeight * 100) / 100.0, + (double) Math.round(norm1 * 100) / 100.0, + (double) Math.round(norm2 * 100) / 100.0 + ); + + similarities.add( + EventsSimilarityAvro.newBuilder() + .setEventA(eventA) + .setEventB(eventB) + .setScore(score) + .setTimestamp(Instant.now()) + .build() + ); + }); + + log.info("Расчет сходства завершен"); + return similarities.stream().filter(sim -> sim.getScore() >= 0.005).toList(); + } + + private void sendSimilarity(long eventId, @NonNull EventsSimilarityAvro avro) { + + log.info(""" + Отправляю новое сходство + { + "eventA": {}, + "eventB": {}, + "score": {}, + "timestamp": {} + }""", + avro.getEventA(), + avro.getEventB(), + (double) Math.round(avro.getScore() * 100) / 100.0, + TimestampUtils.toLocalDateTime(avro.getTimestamp()) + ); + + CompletableFuture result = producer.sendMessage(eventId, avro); + + result.whenComplete((record, throwable) -> { + if (throwable != null) { + log.error("Ошибка отправки действия пользователя {}:\n {}", + avro, throwable.getMessage(), throwable); + } else { + log.info("Сходство отправлено по адресу:\n topic={}, key={}, partition={}, offset={}", + record.topic(), + avro.getEventA(), + record.partition(), + record.offset() + ); + } + }); + } + + // -------------------------------------UTILITY------------------------------------- + + private double calculateLeadingWeight(@NonNull ActionTypeAvro actionType) { + return switch (actionType) { + case VIEWS -> 0.4d; + case REGISTER -> 0.8d; + case LIKE -> 1.0d; + }; + } + + /// Пересчет суммы ведущих весов текущего события по всем пользователям + private void updateSumOfLeadingWeights(long eventId, double oldLeadingWeight, double newLeadingWeight) { + eventToLeadingWeightsSum.compute(eventId, (k, oldSum) -> { + + double weight = oldSum == null + ? newLeadingWeight : (oldSum - oldLeadingWeight) + newLeadingWeight; + + log.info(""" + Обновление суммы ведущих весов события по всем пользователям + { + "eventId": {}, + "leadingWeightsSum": {} + }""", + eventId, (double) Math.round(weight * 100) / 100.0 + ); + + return weight; + }); + } + + @NonNull + private Map getCandidates(long eventA_Id) { + Map candidates = new HashMap<>(); + + // Случай 1: eventA_Id — минимальный ключ (верхний треугольник) + Map upper = sumOfMinWeightsMatrix.get(eventA_Id); + if (upper != null) { + candidates.putAll(upper); + } + + // Случай 2: eventA_Id — максимальный ключ (нижний треугольник) + sumOfMinWeightsMatrix.forEach((first, row) -> { + Double v = row.get(eventA_Id); + if (v != null) { + candidates.put(first, v); + } + }); + + return candidates; + } + + private void putNewSumOfMinWeight(long eventA, long eventB, double sum) { + // Упорядочиваем идентификаторы чтобы не писать в симметричную половину + long first = Math.min(eventA, eventB); + long second = Math.max(eventA, eventB); + + sumOfMinWeightsMatrix + .computeIfAbsent(first, e -> new HashMap<>()) + .put(second, sum); + } + + private double getSumOfMinWeight(long eventA, long eventB) { + long first = Math.min(eventA, eventB); + long second = Math.max(eventA, eventB); + + return sumOfMinWeightsMatrix + .computeIfAbsent(first, e -> new HashMap<>()) + .getOrDefault(second, 0.0); + } + + // -------------------------------------LOGGING------------------------------------- + + private void printMatrix() { + log.info(buildLeadingWeightMatrixTable()); + log.info(buildSumOfMinWeightsMatrixTable()); + log.info(buildEventToLeadingWeightsSumTable()); + } + + /** + * GENERATED BY DEEPSEEK
+ */ + public String buildLeadingWeightMatrixTable() { + if (leadingWeightMatrix.isEmpty()) { + return TableRenderer.EMPTY_TABLE; + } + + var eventIds = new TreeSet<>(leadingWeightMatrix.keySet()); + var userIds = new TreeSet(); + leadingWeightMatrix.values().forEach(m -> userIds.addAll(m.keySet())); + + List columnNames = userIds.stream().map(id -> "u" + id).toList(); + List rowNames = eventIds.stream().map(id -> "e" + id).toList(); + + List> values = new ArrayList<>(); + for (Long eventId : eventIds) { + Map userWeights = leadingWeightMatrix.get(eventId); + List row = new ArrayList<>(); + for (Long userId : userIds) { + row.add(TableRenderer.formatValue(userWeights.get(userId))); + } + values.add(row); + } + + return TableRenderer.renderTable("Матрица ведущих весов:", columnNames, rowNames, values); + } + + /** + * GENERATED BY DEEPSEEK
+ */ + public String buildSumOfMinWeightsMatrixTable() { + if (sumOfMinWeightsMatrix.isEmpty()) { + return TableRenderer.EMPTY_TABLE; + } + + var eventIds = new TreeSet(); + sumOfMinWeightsMatrix.forEach((a, m) -> { + eventIds.add(a); + eventIds.addAll(m.keySet()); + }); + + List columnNames = eventIds.stream().map(id -> "e" + id).toList(); + List rowNames = new ArrayList<>(columnNames); + + List> values = new ArrayList<>(); + for (Long eventA : eventIds) { + Map candidates = getCandidates(eventA); + List row = new ArrayList<>(); + for (Long eventB : eventIds) { + if (eventA.equals(eventB)) { + row.add(""); + } else { + row.add(TableRenderer.formatValue(candidates.get(eventB))); + } + } + values.add(row); + } + + return TableRenderer.renderTable("Матрица числителей:", columnNames, rowNames, values); + } + + /** + * GENERATED BY DEEPSEEK
+ */ + public String buildEventToLeadingWeightsSumTable() { + if (eventToLeadingWeightsSum.isEmpty()) { + return TableRenderer.EMPTY_TABLE; + } + + var eventIds = new TreeSet<>(eventToLeadingWeightsSum.keySet()); + + List columnNames = eventIds.stream().map(id -> "e" + id).toList(); + List rowNames = List.of("Сумма"); + + List> values = new ArrayList<>(); + List row = new ArrayList<>(); + for (Long eventId : eventIds) { + row.add(TableRenderer.formatValue(eventToLeadingWeightsSum.get(eventId))); + } + values.add(row); + + return TableRenderer.renderTable("Таблица знаминателей:", columnNames, rowNames, values); + } + +} diff --git a/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/util/TableRenderer.java b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/util/TableRenderer.java new file mode 100644 index 0000000..ab0b438 --- /dev/null +++ b/stats/aggregator/src/main/java/ru/practicum/ewm/stats/aggregator/util/TableRenderer.java @@ -0,0 +1,139 @@ +package ru.practicum.ewm.stats.aggregator.util; + +import java.util.List; +import java.util.Locale; + +/** + * GENERATED BY DEEPSEEK
+ * Утилита для рендеринга матриц в виде Unicode-таблиц для логирования. + */ +@SuppressWarnings("StringRepeatCanBeUsed") +public final class TableRenderer { + + private TableRenderer() { + } + + /** + * Заглушка для пустой таблицы. + */ + public static final String EMPTY_TABLE = """ + ╔══════════╗ + ║ is empty ║ + ╚══════════╝ + """; + + /** + * Рендерит таблицу с Unicode-рамками. + * Угловая ячейка (левый верхний угол) всегда пустая. + * + * @param title заголовок таблицы (может быть null) + * @param columnNames заголовки столбцов (без левого служебного столбца) + * @param rowNames заголовки строк + * @param values значения: values.get(i).get(j) — ячейка для i-й строки и j-го столбца + * (null или отсутствие — пустая ячейка) + * @return готовая строка таблицы + */ + public static String renderTable(String title, + List columnNames, + List rowNames, + List> values) { + + // Если нет ни строк, ни столбцов — возвращаем заглушку + if (columnNames.isEmpty() && rowNames.isEmpty()) { + return EMPTY_TABLE; + } + + // Ширина левого служебного столбца — по максимальной длине имён строк + int rowColWidth = rowNames.stream() + .mapToInt(String::length) + .max() + .orElse(0); + + // Ширины столбцов + int[] colWidths = new int[columnNames.size()]; + for (int j = 0; j < columnNames.size(); j++) { + int headerLen = columnNames.get(j).length(); + int maxValueLen = 0; + for (List row : values) { + if (j < row.size()) { + String v = row.get(j); + if (v != null && v.length() > maxValueLen) { + maxValueLen = v.length(); + } + } + } + colWidths[j] = Math.max(headerLen, maxValueLen); + } + + StringBuilder sb = new StringBuilder(); + if (title != null && !title.isEmpty()) { + sb.append("\n").append(title).append("\n"); + } + + // Верхняя граница + sb.append("╔").append("═".repeat(rowColWidth + 2)).append("╦"); + for (int j = 0; j < columnNames.size(); j++) { + sb.append("═".repeat(colWidths[j] + 2)); + sb.append(j < columnNames.size() - 1 ? "╦" : "╗"); + } + sb.append("\n"); + + // Заголовок: угловая ячейка пустая + sb.append("║ ").append(padRight("", rowColWidth)).append(" ║"); + for (int j = 0; j < columnNames.size(); j++) { + sb.append(" ").append(padRight(columnNames.get(j), colWidths[j])).append(" ║"); + } + sb.append("\n"); + + // Разделитель + sb.append("╠").append("═".repeat(rowColWidth + 2)).append("╬"); + for (int j = 0; j < columnNames.size(); j++) { + sb.append("═".repeat(colWidths[j] + 2)); + sb.append(j < columnNames.size() - 1 ? "╬" : "╣"); + } + sb.append("\n"); + + // Строки данных + for (int i = 0; i < rowNames.size(); i++) { + sb.append("║ ").append(padRight(rowNames.get(i), rowColWidth)).append(" ║"); + List row = i < values.size() ? values.get(i) : List.of(); + for (int j = 0; j < columnNames.size(); j++) { + String v = j < row.size() ? row.get(j) : ""; + sb.append(" ").append(padRight(v, colWidths[j])).append(" ║"); + } + sb.append("\n"); + } + + // Нижняя граница + sb.append("╚").append("═".repeat(rowColWidth + 2)).append("╩"); + for (int j = 0; j < columnNames.size(); j++) { + sb.append("═".repeat(colWidths[j] + 2)); + sb.append(j < columnNames.size() - 1 ? "╩" : "╝"); + } + + return sb.toString(); + } + + /** + * Форматирует значение Double с двумя знаками после запятой (Locale.ROOT). + * null → пустая строка. + */ + public static String formatValue(Double value) { + return value == null ? "" : String.format(Locale.ROOT, "%.2f", value); + } + + /** + * Дополняет строку пробелами справа до указанной длины. + * + * @param s исходная строка (может быть null) + * @param len желаемая минимальная длина + * @return строка, дополненная пробелами справа + */ + private static String padRight(String s, int len) { + String str = s == null ? "" : s; + if (str.length() >= len) { + return str; + } + return str + " ".repeat(len - str.length()); + } +} \ No newline at end of file diff --git a/stats/stats-server/src/main/resources/application.yaml b/stats/aggregator/src/main/resources/application.yml similarity index 96% rename from stats/stats-server/src/main/resources/application.yaml rename to stats/aggregator/src/main/resources/application.yml index e4f93c2..41c7466 100644 --- a/stats/stats-server/src/main/resources/application.yaml +++ b/stats/aggregator/src/main/resources/application.yml @@ -3,7 +3,7 @@ server: spring: application: - name: stats-server + name: aggregator config: import: "optional:configserver:" cloud: @@ -29,3 +29,4 @@ eureka: instance-id: ${spring.application.name}:${random.value} lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 10 + diff --git a/core/rating-service/pom.xml b/stats/analyzer/pom.xml similarity index 70% rename from core/rating-service/pom.xml rename to stats/analyzer/pom.xml index 72e6f4a..1479ef5 100644 --- a/core/rating-service/pom.xml +++ b/stats/analyzer/pom.xml @@ -6,55 +6,62 @@ ru.practicum - core + stats 0.0.1-SNAPSHOT - rating-service + analyzer ru.practicum - aggregation-api + avro-schemas + 0.0.1-SNAPSHOT + + + ru.practicum + proto-schemas + 0.0.1-SNAPSHOT + compile + + + ru.practicum + timestamp-utils 0.0.1-SNAPSHOT - org.springframework.boot - spring-boot-starter-web + net.devh + grpc-client-spring-boot-starter - org.springframework.boot - spring-boot-starter-data-jpa + net.devh + grpc-server-spring-boot-starter + - org.springframework.boot - spring-boot-starter-validation + org.projectlombok + lombok + provided org.springframework.boot - spring-boot-starter-test - test + spring-boot-starter-data-jpa - - io.hypersistence - hypersistence-utils-hibernate-63 - 3.15.2 - compile + org.springframework.boot + spring-boot-starter-validation - org.postgresql postgresql runtime + - com.h2database - h2 - runtime + org.springframework.boot + spring-boot-starter-web - org.springframework.cloud spring-cloud-starter-netflix-eureka-client @@ -73,15 +80,6 @@ caffeine - - org.springframework.retry - spring-retry - - - org.springframework.boot - spring-boot-starter-aop - - org.springframework.boot spring-boot-starter-actuator @@ -91,16 +89,12 @@ micrometer-registry-prometheus - + - org.springframework.cloud - spring-cloud-starter-openfeign - - - - - org.springframework.cloud - spring-cloud-starter-circuitbreaker-resilience4j + org.apache.tomcat + annotations-api + 6.0.53 + provided diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/AnalyzerApp.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/AnalyzerApp.java new file mode 100644 index 0000000..ff4b58f --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/AnalyzerApp.java @@ -0,0 +1,19 @@ +package ru.practicum.ewm.stats.analyzer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.context.ConfigurableApplicationContext; + +@SpringBootApplication +@ConfigurationPropertiesScan +public class AnalyzerApp { + public static void main(String[] args) { + + ConfigurableApplicationContext context = SpringApplication + .run(AnalyzerApp.class, args); + + final AnalyzerRunner runner = context.getBean(AnalyzerRunner.class); + runner.run(args); + } +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/AnalyzerRunner.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/AnalyzerRunner.java new file mode 100644 index 0000000..03ddb97 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/AnalyzerRunner.java @@ -0,0 +1,53 @@ +package ru.practicum.ewm.stats.analyzer; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.analyzer.consumer.EventsSimilarityComsumer; +import ru.practicum.ewm.stats.analyzer.consumer.UsersInteractionConsumer; + +@Slf4j +@Component +@RequiredArgsConstructor +public class AnalyzerRunner implements CommandLineRunner { + + private final EventsSimilarityComsumer eventsSimilarityComsumer; + private final UsersInteractionConsumer usersInteractionConsumer; + + private int cycleNumber = 0; + + @Override + public void run(String... args) { + + log.info("Цикл запуска №{}", ++cycleNumber); + + if (!eventsSimilarityComsumer.isRunning()) { + Thread EventsSimilarityThread = new Thread(eventsSimilarityComsumer); + EventsSimilarityThread.setName("EventsSimilarityComsumerThread"); + + log.info("Запускаем EventsSimilarityComsumer в отдельном потоке"); + EventsSimilarityThread.start(); + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } else { + log.info("EventsSimilarityComsumer уже запущен"); + } + + if (!usersInteractionConsumer.isRunning()) { + + if (!eventsSimilarityComsumer.isRunning()) { + log.info("UsersInteractionConsumer не запущен"); + return; + } + log.info("Запускаем UsersInteractionConsumer в текущем потоке"); + usersInteractionConsumer.run(); + } else { + log.info("UsersInteractionConsumer уже запущен"); + } + } + +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/config/AnalyzerConfiguration.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/config/AnalyzerConfiguration.java new file mode 100644 index 0000000..4079c0b --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/config/AnalyzerConfiguration.java @@ -0,0 +1,41 @@ +package ru.practicum.ewm.stats.analyzer.config; + +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; + +import java.util.Properties; + +@Configuration +public class AnalyzerConfiguration { + + @Bean + @ConfigurationProperties("kafka.users-interaction-consumer-config") + public Properties usersInteractionConsumerConfig() { + return new Properties(); + } + + @Bean + @ConfigurationProperties("kafka.events-similarity-consumer-config") + public Properties eventsSimilarityConsumerConfig() { + return new Properties(); + } + + @Bean(destroyMethod = "") + public KafkaConsumer usersInteractionKafkaConsumer( + @Qualifier("usersInteractionConsumerConfig") Properties config + ) { + return new KafkaConsumer<>(config); + } + + @Bean(destroyMethod = "") + public KafkaConsumer eventsSimilarityKafkaConsumer( + @Qualifier("eventsSimilarityConsumerConfig") Properties config + ) { + return new KafkaConsumer<>(config); + } +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/BaseKafkaProcessor.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/BaseKafkaProcessor.java new file mode 100644 index 0000000..44af4af --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/BaseKafkaProcessor.java @@ -0,0 +1,128 @@ +package ru.practicum.ewm.stats.analyzer.consumer; + +import jakarta.annotation.PreDestroy; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.ConsumerRecords; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.apache.kafka.clients.consumer.OffsetAndMetadata; +import org.apache.kafka.common.TopicPartition; +import org.apache.kafka.common.errors.WakeupException; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.telemetry.utils.TimestampUtils; + +import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +public abstract class BaseKafkaProcessor implements Runnable { + + final String topic; + + private final KafkaConsumer consumer; + + private final Map lastOffsets = new HashMap<>(); + + private static final Duration CONSUME_ATTEMPT_TIMEOUT = Duration.ofMillis(1000); + + @Getter + private volatile boolean running = false; + + public BaseKafkaProcessor(String topic, KafkaConsumer consumer) { + this.topic = topic; + this.consumer = consumer; + } + + @PreDestroy + public void shutdown() { + log.info("Получил сигнал остановки"); + running = false; + consumer.wakeup(); + } + + @Override + public void run() { + running = true; + + log.info("Подписка на топик: {}", topic); + consumer.subscribe(Collections.singleton(topic)); + + try { + pollLoop(); + + } catch (WakeupException ignored) { + log.info("Получил инструкцию wakeup"); + } catch (Exception e) { + log.error("Ошибка во время обработки событий от хаба", e); + } finally { + log.info("Остановка poll loop"); + running = false; + + try { + if (!lastOffsets.isEmpty()) { + log.info("Регистрация последнего смещения"); + consumer.commitSync(lastOffsets); + } + + } finally { + log.info("Остановка консьюмера"); + consumer.close(); + } + } + } + + private void pollLoop() { + int iteration = 1; + while (running) { + log.debug("Проверка источника событий хаба"); + ConsumerRecords records = consumer.poll(CONSUME_ATTEMPT_TIMEOUT); + + if (records.isEmpty()) { + log.debug("Источник событий хаба пуст"); + continue; + } + + log.info("Итерация {}. Батч из {} записей получен. Начинаем обработку.", + iteration++, records.count()); + + int recordNumber = 1; + for (ConsumerRecord record : records) { + + log.info(""" + Обработка действия пользователя №{}: + { + "topic": "{}", + "partition": "{}", + "offset": "{}", + "timestamp": "{}" + }""", + recordNumber++, + record.topic(), + record.partition(), + record.offset(), + TimestampUtils.toLocalDateTime(record.timestamp()) + ); + + try { + processRecord(record.value()); + + log.debug("Сохранение смещения локально"); + lastOffsets.put( + new TopicPartition(record.topic(), record.partition()), + new OffsetAndMetadata(record.offset() + 1) + ); + + } catch (Exception e) { + log.error("Ошибка обновления состояния:\n{}", record.value(), e); + throw e; + } + } + } + } + + protected abstract void processRecord(T record); +} \ No newline at end of file diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/EventsSimilarityComsumer.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/EventsSimilarityComsumer.java new file mode 100644 index 0000000..2619d2e --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/EventsSimilarityComsumer.java @@ -0,0 +1,27 @@ +package ru.practicum.ewm.stats.analyzer.consumer; + +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.analyzer.service.SimilarityService; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; + +@Slf4j +@Component +public class EventsSimilarityComsumer extends BaseKafkaProcessor { + + private final SimilarityService service; + + public EventsSimilarityComsumer(@Value("${kafka.topics.events-similarity}") String topic, + KafkaConsumer consumer, + SimilarityService service) { + super(topic, consumer); + this.service = service; + } + + @Override + protected void processRecord(EventsSimilarityAvro record) { + service.addSimilarity(record); + } +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/UsersInteractionConsumer.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/UsersInteractionConsumer.java new file mode 100644 index 0000000..e5a637f --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/consumer/UsersInteractionConsumer.java @@ -0,0 +1,25 @@ +package ru.practicum.ewm.stats.analyzer.consumer; + +import org.apache.kafka.clients.consumer.KafkaConsumer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.analyzer.service.InteractionsService; +import ru.practicum.ewm.stats.avro.UserActionAvro; + +@Component +public class UsersInteractionConsumer extends BaseKafkaProcessor { + + private final InteractionsService service; + + public UsersInteractionConsumer(@Value("${kafka.topics.users-interaction}") String topic, + KafkaConsumer consumer, + InteractionsService service) { + super(topic, consumer); + this.service = service; + } + + @Override + protected void processRecord(UserActionAvro record) { + service.addInteraction(record); + } +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/controller/AnalyzerController.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/controller/AnalyzerController.java new file mode 100644 index 0000000..c178f3c --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/controller/AnalyzerController.java @@ -0,0 +1,96 @@ +package ru.practicum.ewm.stats.analyzer.controller; + +import io.grpc.Status; +import io.grpc.StatusRuntimeException; +import io.grpc.stub.StreamObserver; +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import net.devh.boot.grpc.server.service.GrpcService; +import org.springframework.lang.NonNull; +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.ewm.stats.analyzer.service.InteractionsService; +import ru.practicum.ewm.stats.analyzer.service.RecommendationService; +import ru.practicum.ewm.stats.analyzer.service.SimilarityService; +import ru.practicum.ewm.stats.proto.InteractionsCountRequestProto; +import ru.practicum.ewm.stats.proto.RecommendationsControllerGrpc.RecommendationsControllerImplBase; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.practicum.ewm.stats.proto.SimilarEventsRequestProto; +import ru.practicum.ewm.stats.proto.UserRecommendationsRequestProto; + +@Slf4j +@GrpcService +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class AnalyzerController extends RecommendationsControllerImplBase { + + SimilarityService similarityService; + InteractionsService interactionsService; + RecommendationService recommendationService; + + /** + * возвращает поток рекомендованных мероприятий для указанного пользователя + */ + @Transactional(readOnly = true) + @Override + public void getRecomendationsForUser(@NonNull UserRecommendationsRequestProto request, + StreamObserver responseObserver) { + log.info(""" + Получен gRPC запрос: Получить рекомендации для пользователя + {}""", request); + + try (var result = recommendationService.getRecomendationsForUser( + request.getUserId(), request.getMaxResults()) + ) { + result.forEach(responseObserver::onNext); + responseObserver.onCompleted(); + } catch (Exception e) { + log.error("Не удалось получить рекомендации для пользователя", e); + responseObserver.onError(new StatusRuntimeException(Status.fromThrowable(e))); + } + } + + /** + * возвращает поток мероприятий, с которыми не взаимодействовал этот пользователь, + * но которые максимально похожи на указанное мероприятие + */ + @Transactional(readOnly = true) + @Override + public void getSimilarEvents(@NonNull SimilarEventsRequestProto request, + StreamObserver responseObserver) { + log.info(""" + Получен gRPC запрос: Получить похожие по мероприятиям + {}""", request); + + try (var result = similarityService.getSimilarEvents(request)) { + result.forEach(responseObserver::onNext); + responseObserver.onCompleted(); + } catch (Exception e) { + log.error("Не удалось получить похожие по мероприятиям", e); + responseObserver.onError(new StatusRuntimeException(Status.fromThrowable(e))); + } + } + + /** + * получает идентификаторы мероприятий и возвращает их поток с суммой + * максимальных весов действий каждого пользователя с этими мероприятиями + */ + @Transactional(readOnly = true) + @Override + public void getInteractionsCount(@NonNull InteractionsCountRequestProto request, + StreamObserver responseObserver) { + log.info(""" + Получен gRPC запрос: Получить количество взаимодействий + {}""", request.getEventIdList()); + + try (var stream = interactionsService.getInteractionsByEventIds(request.getEventIdList())) { + stream.forEach(responseObserver::onNext); + responseObserver.onCompleted(); + } catch (Exception e) { + log.error("Не удалось получить количество взаимодействий", e); + responseObserver.onError(new StatusRuntimeException(Status.fromThrowable(e))); + } + } + +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/BaseEntity.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/BaseEntity.java new file mode 100644 index 0000000..bd781a3 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/BaseEntity.java @@ -0,0 +1,43 @@ +package ru.practicum.ewm.stats.analyzer.entity; + +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.MappedSuperclass; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Getter +@Setter +@SuperBuilder(toBuilder = true) +@MappedSuperclass +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public abstract class BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + protected Long id; + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (o == null) return false; + + if (org.hibernate.Hibernate.getClass(this) + != org.hibernate.Hibernate.getClass(o)) { + return false; + } + + BaseEntity other = (BaseEntity) o; + + return id != null && id.equals(other.id); + } + + @Override + public final int hashCode() { + return org.hibernate.Hibernate.getClass(this).hashCode(); + } +} \ No newline at end of file diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/Interaction.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/Interaction.java new file mode 100644 index 0000000..129e7ae --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/Interaction.java @@ -0,0 +1,32 @@ +package ru.practicum.ewm.stats.analyzer.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.math.BigDecimal; + +@Getter +@Entity +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder(toBuilder = true) +@Table(name = "interactions", uniqueConstraints = { + @UniqueConstraint(columnNames = {"userId", "eventId"}) +}) +public class Interaction extends BaseEntity { + + @Column(nullable = false) + Long userId; + + @Column(nullable = false) + Long eventId; + + @Column(nullable = false, precision = 3, scale = 2) + BigDecimal actionWeight; +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/Similarity.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/Similarity.java new file mode 100644 index 0000000..0c22885 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/entity/Similarity.java @@ -0,0 +1,32 @@ +package ru.practicum.ewm.stats.analyzer.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.math.BigDecimal; + +@Getter +@Entity +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder(toBuilder = true) +@Table(name = "similariries", uniqueConstraints = { + @UniqueConstraint(columnNames = {"eventA", "eventB"}) +}) +public class Similarity extends BaseEntity { + + @Column(name = "event_a", nullable = false) + Long eventA; + + @Column(name = "event_b", nullable = false) + Long eventB; + + @Column(nullable = false, precision = 3, scale = 2) + BigDecimal score; +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/mapper/InteractionMapper.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/mapper/InteractionMapper.java new file mode 100644 index 0000000..1db70e7 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/mapper/InteractionMapper.java @@ -0,0 +1,31 @@ +package ru.practicum.ewm.stats.analyzer.mapper; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import ru.practicum.ewm.stats.analyzer.entity.Interaction; +import ru.practicum.ewm.stats.avro.ActionTypeAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; + +import java.math.BigDecimal; + +@UtilityClass +public class InteractionMapper { + + public Interaction toEntity(@NonNull UserActionAvro avro) { + return Interaction.builder() + .userId(avro.getUserId()) + .eventId(avro.getEventId()) + .actionWeight(toActionWeight(avro.getActionType())) + .build(); + } + + @NonNull + private BigDecimal toActionWeight(@NonNull ActionTypeAvro avroType) { + return switch (avroType) { + case VIEWS -> BigDecimal.valueOf(0.4); + case REGISTER -> BigDecimal.valueOf(0.8); + case LIKE -> BigDecimal.ONE; + }; + } + +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/mapper/SimilarityMapper.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/mapper/SimilarityMapper.java new file mode 100644 index 0000000..32480db --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/mapper/SimilarityMapper.java @@ -0,0 +1,27 @@ +package ru.practicum.ewm.stats.analyzer.mapper; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import ru.practicum.ewm.stats.analyzer.entity.Similarity; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +@UtilityClass +public class SimilarityMapper { + + public Similarity toEntity(@NonNull EventsSimilarityAvro avro) { + return Similarity.builder() + .eventA(avro.getEventA()) + .eventB(avro.getEventB()) + .score(toBigDecimal(avro.getScore())) + .build(); + } + + @NonNull + private BigDecimal toBigDecimal(double value) { + return new BigDecimal(value).setScale(2, RoundingMode.HALF_UP); + } + +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventInteraction.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventInteraction.java new file mode 100644 index 0000000..9240cd4 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventInteraction.java @@ -0,0 +1,10 @@ +package ru.practicum.ewm.stats.analyzer.model; + +import java.math.BigDecimal; + +public record EventInteraction( + long userId, + long eventId, + BigDecimal actionWeight +) { +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventSimilarity.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventSimilarity.java new file mode 100644 index 0000000..63a4173 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventSimilarity.java @@ -0,0 +1,10 @@ +package ru.practicum.ewm.stats.analyzer.model; + +import java.math.BigDecimal; + +public record EventSimilarity( + long eventA, + long eventB, + BigDecimal score +) { +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventWeightSum.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventWeightSum.java new file mode 100644 index 0000000..3ebffd9 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/model/EventWeightSum.java @@ -0,0 +1,9 @@ +package ru.practicum.ewm.stats.analyzer.model; + +import java.math.BigDecimal; + +public record EventWeightSum( + long eventId, + BigDecimal score +) { +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/repository/InteractionsRepository.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/repository/InteractionsRepository.java new file mode 100644 index 0000000..b1e3e0b --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/repository/InteractionsRepository.java @@ -0,0 +1,56 @@ +package ru.practicum.ewm.stats.analyzer.repository; + +import org.hibernate.query.spi.Limit; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import ru.practicum.ewm.stats.analyzer.entity.Interaction; +import ru.practicum.ewm.stats.analyzer.model.EventInteraction; +import ru.practicum.ewm.stats.analyzer.model.EventWeightSum; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Stream; + +public interface InteractionsRepository extends JpaRepository { + + @Query(""" + select new ru.practicum.ewm.stats.analyzer.model.EventWeightSum( + ir.eventId, + coalesce(sum(ir.actionWeight), 0) + ) + from Interaction ir + where ir.eventId in :eventIds + group by ir.eventId + """) + Stream aggregateActionWeightsByEvent(Collection eventIds); + + @Query(""" + select new ru.practicum.ewm.stats.analyzer.model.EventInteraction( + ir.userId, + ir.eventId, + ir.actionWeight + ) + from Interaction ir + where ir.eventId in :eventIds + and ir.userId = :userId + """) + Set aggregateActionWeightByEventAndByUser(Collection eventIds, Long userId); + + @Query(""" + SELECT DISTINCT i.eventId FROM Interaction i + WHERE i.userId = :userId + """) + Set findInteractedEventIds(long userId); + + Optional findByUserIdAndEventId(long userId, long eventId); + + @Query(""" + select ir.eventId + from Interaction ir + where ir.userId = :userId + order by ir.id desc + """) + List findRecentlyInteractions(long userId, Limit limit); +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/repository/SimilarityRepository.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/repository/SimilarityRepository.java new file mode 100644 index 0000000..afa31f8 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/repository/SimilarityRepository.java @@ -0,0 +1,32 @@ +package ru.practicum.ewm.stats.analyzer.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import ru.practicum.ewm.stats.analyzer.entity.Similarity; +import ru.practicum.ewm.stats.analyzer.model.EventSimilarity; + +import java.util.List; +import java.util.Optional; + +public interface SimilarityRepository extends JpaRepository { + + Optional findByEventAAndEventB(Long eventA, Long eventB); + + @Query(""" + SELECT new ru.practicum.ewm.stats.analyzer.model.EventSimilarity( + s.eventA, s.eventB, s.score + ) + FROM Similarity s + WHERE s.eventA = :eventId OR s.eventB = :eventId + """) + List findSimilaritiesByEventId(long eventId); + + @Query(""" + SELECT DISTINCT new ru.practicum.ewm.stats.analyzer.model.EventSimilarity( + s.eventA, s.eventB, s.score + ) + FROM Similarity s + WHERE s.eventA IN :eventIds OR s.eventB IN :eventIds + """) + List findSimilaritiesByManyEventIds(List eventIds); +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/InteractionsService.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/InteractionsService.java new file mode 100644 index 0000000..ef75dc9 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/InteractionsService.java @@ -0,0 +1,16 @@ +package ru.practicum.ewm.stats.analyzer.service; + +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; + +import java.util.Collection; +import java.util.stream.Stream; + +public interface InteractionsService { + + @Transactional + void addInteraction(UserActionAvro record); + + Stream getInteractionsByEventIds(Collection eventIds); +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/InteractionsServiceImpl.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/InteractionsServiceImpl.java new file mode 100644 index 0000000..c459516 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/InteractionsServiceImpl.java @@ -0,0 +1,74 @@ +package ru.practicum.ewm.stats.analyzer.service; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.analyzer.mapper.InteractionMapper; +import ru.practicum.ewm.stats.analyzer.repository.InteractionsRepository; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.yandex.practicum.telemetry.utils.TimestampUtils; + +import java.util.Collection; +import java.util.HashSet; +import java.util.stream.Stream; + +@Slf4j +@Service +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class InteractionsServiceImpl implements InteractionsService { + + InteractionsRepository repository; + + @Override + public void addInteraction(UserActionAvro avro) { + + var interaction = InteractionMapper.toEntity(avro); + + long userId = avro.getUserId(); + long eventId = avro.getEventId(); + var actionType = avro.getActionType(); + + log.info(""" + Сохраняю новое действие пользователя: + { + "userId": {}, + "eventId": {}, + "actionType": {}, + "timestamp": {} + } + """, + userId, + eventId, + actionType, + TimestampUtils.toLocalDateTime(avro.getTimestamp()) + ); + + repository.findByUserIdAndEventId(userId, eventId) + .ifPresentOrElse(inter -> { + interaction.setId(inter.getId()); + + // Сетим максимальное + var updated = interaction.toBuilder() + .actionWeight(interaction.getActionWeight().max(inter.getActionWeight())) + .build(); + + repository.save(updated); + }, + () -> repository.save(interaction) + ); + } + + @Override + public Stream getInteractionsByEventIds(Collection eventIds) { + return repository.aggregateActionWeightsByEvent(new HashSet<>(eventIds)) + .map(eventWeightSum -> RecommendedEventProto.newBuilder() + .setEventId(eventWeightSum.eventId()) + .setScore(eventWeightSum.score().doubleValue()) + .build()); + } + +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/RecommendationService.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/RecommendationService.java new file mode 100644 index 0000000..79f3643 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/RecommendationService.java @@ -0,0 +1,10 @@ +package ru.practicum.ewm.stats.analyzer.service; + +import ru.practicum.ewm.stats.proto.RecommendedEventProto; + +import java.util.stream.Stream; + +public interface RecommendationService { + + Stream getRecomendationsForUser(long userId, int maxResults); +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/RecommendationServiceImpl.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/RecommendationServiceImpl.java new file mode 100644 index 0000000..7c59a86 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/RecommendationServiceImpl.java @@ -0,0 +1,223 @@ +package ru.practicum.ewm.stats.analyzer.service; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.query.spi.Limit; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.analyzer.model.EventInteraction; +import ru.practicum.ewm.stats.analyzer.model.EventSimilarity; +import ru.practicum.ewm.stats.analyzer.repository.InteractionsRepository; +import ru.practicum.ewm.stats.analyzer.repository.SimilarityRepository; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Slf4j +@Service +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class RecommendationServiceImpl implements RecommendationService { + + InteractionsRepository interactionsRepository; + SimilarityRepository similarityRepository; + + /** + * Сформировать персональные рекомендации для пользователя. + */ + @Override + public Stream getRecomendationsForUser(long userId, int maxResults) { + + // Выгрузить мероприятия, с которыми пользователь уже взаимодействовал + Set userInteractedEvents = interactionsRepository + .findInteractedEventIds(userId); + + // ЭТАП 1: Подбор мероприятий, с которыми пользователь ещё не взаимодействовал + List candidates = findCandidates(userId, userInteractedEvents, maxResults); + if (candidates.isEmpty()) { + log.info("Нет новых мероприятий для пользователя с id={}", userId); + return Stream.empty(); + } + + // ЭТАП 2: Вычисление предсказанной оценки для каждого нового мероприятия + Map predictedScores = predictScores( + userId, candidates, userInteractedEvents, maxResults); + if (predictedScores.isEmpty()) { + log.info("Не удалось предсказать оценки для пользователя с id={}", userId); + return Stream.empty(); + } + + /* + * Отсортировать найденные мероприятия по предсказанной оценке + * от большего к меньшему и выбрать первые N мероприятий. + */ + return predictedScores.entrySet().stream() + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(maxResults) + .map(entry -> RecommendedEventProto.newBuilder() + .setEventId(entry.getKey()) + .setScore(entry.getValue()) + .build()); + } + + /** + * ЭТАП 1. Подбор мероприятий, с которыми пользователь ещё не взаимодействовал. + */ + @NonNull + private List findCandidates(long userId, + @NonNull Set userInteractedEvents, + int maxResults) { + + /* + * Получить недавно просмотренные. Выгрузить мероприятия, с которыми + * пользователь уже взаимодействовал, отсортировать по дате взаимодействия + * от новых к старым и ограничить N взаимодействиями. + */ + List recently = interactionsRepository + .findRecentlyInteractions(userId, new Limit(0, maxResults)); + + /* + * Если пользователь ещё не взаимодействовал ни с одним мероприятием, + * то рекомендовать нечего — возвращается пустой список. + */ + if (recently.isEmpty()) { + log.info("Нет недавних взаимодействий у пользователя с id={}", userId); + return List.of(); + } + + // Найти похожие новые мероприятия, исключая уже взаимодействованные + return findNewCandidates(recently, userInteractedEvents, maxResults); + } + + /** + * ЭТАП 2. Вычисление предсказанной оценки для каждого нового мероприятия. + */ + @NonNull + private Map predictScores(long userId, + @NonNull List candidates, + @NonNull Set userInteractedEvents, + int maxResults) { + + Map predictedScores = new HashMap<>(); + + for (Long candidateId : candidates) { + + /* + * Найти K ближайших соседей — просмотренных мероприятий, максимально + * похожих на предсказываемое. На основе их оценок будет предсказана новая. + */ + List nearbouses = findNearbouses(candidateId, userInteractedEvents, maxResults); + if (nearbouses.isEmpty()) { + continue; + } + + // Получить оценки пользователя за ближайших соседей + Set interactions = interactionsRepository + .aggregateActionWeightByEventAndByUser(nearbouses, userId); + if (interactions.isEmpty()) { + continue; + } + + // Получить коэффициенты подобия между кандидатом и его соседями + Map similarityByNearbour = similarityRepository + .findSimilaritiesByEventId(candidateId).stream() + .filter(sim -> { + long other = sim.eventA() == candidateId + ? sim.eventB() : sim.eventA(); + return nearbouses.contains(other); + }) + .collect(Collectors.toMap( + sim -> sim.eventA() == candidateId + ? sim.eventB() : sim.eventA(), + sim -> sim.score().doubleValue(), + (a, b) -> a + )); + + /* + * Вычислить сумму взвешенных оценок: перемножить оценки мероприятий + * с их коэффициентами подобия и сложить все произведения. + * + * Вычислить сумму коэффициентов подобия: сложить все коэффициенты. + */ + double weightedSum = 0.0; + double scoreSum = 0.0; + + for (EventInteraction interaction : interactions) { + Double score = similarityByNearbour.get(interaction.eventId()); + if (score == null) { + continue; + } + double weight = interaction.actionWeight().doubleValue(); + weightedSum += score * weight; + scoreSum += score; + } + + // если сумма коэффициентов равна нулю — пропустить + if (scoreSum == 0.0) { + continue; + } + + // Вычислить оценку нового мероприятия + predictedScores.put(candidateId, weightedSum / scoreSum); + } + + return predictedScores; + } + + /** + * Найти мероприятия, похожие на недавно просмотренные, с которыми пользователь + * ещё не взаимодействовал. Отсортировать по коэффициенту подобия от большего + * к меньшему и выбрать первые N мероприятий. + */ + @NonNull + private List findNewCandidates(@NonNull List recently, + @NonNull Set userInteractedEvents, + int maxResults) { + return similarityRepository.findSimilaritiesByManyEventIds(recently).stream() + + // Определить, какое из двух мероприятий пары является новым + .map(sim -> recently.contains(sim.eventA()) + ? sim.eventB() : sim.eventA()) + + // Исключить мероприятия, с которыми пользователь уже взаимодействовал + .filter(candidate -> !userInteractedEvents.contains(candidate)) + + .distinct() + .limit(maxResults) + .toList(); + } + + /** + * Найти K ближайших соседей — просмотренных мероприятий, максимально похожих + * на предсказываемое. Важно найти именно максимально похожие мероприятия, + * с которыми пользователь уже взаимодействовал. + */ + @NonNull + private List findNearbouses(long candidateId, + @NonNull Set userInteractedEvents, + int maxResults) { + return similarityRepository.findSimilaritiesByEventId(candidateId).stream() + + // Отсортировать по коэффициенту подобия от большего к меньшему + .sorted(Comparator.comparingDouble( + (EventSimilarity sim) -> sim.score().doubleValue()).reversed()) + + // Для каждой пары определить "соседа" — мероприятие, отличное от предсказываемого + .map(sim -> sim.eventA() == candidateId + ? sim.eventB() : sim.eventA()) + + // Исключить само предсказываемое мероприятие + .filter(id -> !id.equals(candidateId)) + + // Оставить только те мероприятия, с которыми пользователь уже взаимодействовал + .filter(userInteractedEvents::contains) + .distinct() + .limit(maxResults) + .toList(); + } + +} \ No newline at end of file diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/SimilarityService.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/SimilarityService.java new file mode 100644 index 0000000..0de9605 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/SimilarityService.java @@ -0,0 +1,16 @@ +package ru.practicum.ewm.stats.analyzer.service; + +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.practicum.ewm.stats.proto.SimilarEventsRequestProto; + +import java.util.stream.Stream; + +public interface SimilarityService { + + @Transactional + void addSimilarity(EventsSimilarityAvro record); + + Stream getSimilarEvents(SimilarEventsRequestProto request); +} diff --git a/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/SimilarityServiceImpl.java b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/SimilarityServiceImpl.java new file mode 100644 index 0000000..ad60555 --- /dev/null +++ b/stats/analyzer/src/main/java/ru/practicum/ewm/stats/analyzer/service/SimilarityServiceImpl.java @@ -0,0 +1,81 @@ +package ru.practicum.ewm.stats.analyzer.service; + +import lombok.AccessLevel; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.analyzer.mapper.SimilarityMapper; +import ru.practicum.ewm.stats.analyzer.model.EventSimilarity; +import ru.practicum.ewm.stats.analyzer.repository.InteractionsRepository; +import ru.practicum.ewm.stats.analyzer.repository.SimilarityRepository; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.practicum.ewm.stats.proto.SimilarEventsRequestProto; +import ru.yandex.practicum.telemetry.utils.TimestampUtils; + +import java.util.Comparator; +import java.util.List; +import java.util.Set; +import java.util.stream.Stream; + +@Slf4j +@Service +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class SimilarityServiceImpl implements SimilarityService { + + SimilarityRepository repository; + InteractionsRepository interactionsRepository; + + @Override + public void addSimilarity(EventsSimilarityAvro record) { + + var similarity = SimilarityMapper.toEntity(record); + + log.info(""" + Сохраняю новое сходство событий: + { + "eventA": {}, + "eventB": {}, + "score": {}, + "timestamp": {} + } + """, + similarity.getEventA(), + similarity.getEventB(), + similarity.getScore(), + TimestampUtils.toLocalDateTime(record.getTimestamp()) + ); + + repository.findByEventAAndEventB(similarity.getEventA(), similarity.getEventB()) + .ifPresentOrElse(sim -> { + similarity.setId(sim.getId()); + repository.save(similarity); + }, + () -> repository.save(similarity) + ); + } + + @Override + public Stream getSimilarEvents(@NonNull SimilarEventsRequestProto request) { + + long eventId = request.getEventId(); + Set badInteractions = interactionsRepository + .findInteractedEventIds(request.getUserId()); + + return repository.findSimilaritiesByEventId(eventId).stream() + .filter(sim -> !badInteractions + .containsAll(List.of(sim.eventA(), sim.eventB()))) + .sorted(Comparator.comparingDouble( + (EventSimilarity sim) -> sim.score().doubleValue()).reversed()) + .limit(request.getMaxResults()) + .map(sim -> RecommendedEventProto.newBuilder() + .setEventId(sim.eventA() == eventId + ? sim.eventB() : sim.eventA()) + .setScore(sim.score().doubleValue()) + .build()); + } + +} diff --git a/core/rating-service/src/main/resources/application.yml b/stats/analyzer/src/main/resources/application.yml similarity index 96% rename from core/rating-service/src/main/resources/application.yml rename to stats/analyzer/src/main/resources/application.yml index 338ad89..d419e05 100644 --- a/core/rating-service/src/main/resources/application.yml +++ b/stats/analyzer/src/main/resources/application.yml @@ -3,7 +3,7 @@ server: spring: application: - name: rating-service + name: analyzer config: import: "optional:configserver:" cloud: @@ -29,3 +29,4 @@ eureka: instance-id: ${spring.application.name}:${random.value} lease-renewal-interval-in-seconds: 5 lease-expiration-duration-in-seconds: 10 + diff --git a/stats/analyzer/src/main/resources/schema-postgres.sql b/stats/analyzer/src/main/resources/schema-postgres.sql new file mode 100644 index 0000000..ed9c740 --- /dev/null +++ b/stats/analyzer/src/main/resources/schema-postgres.sql @@ -0,0 +1,15 @@ +CREATE TABLE IF NOT EXISTS interactions( + id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY, + user_id BIGINT NOT NULL, + event_id BIGINT NOT NULL, + action_weight NUMERIC(3, 2) NOT NULL CHECK (action_weight BETWEEN 0.0 AND 1.0), + UNIQUE (event_id, user_id) +); + +CREATE TABLE IF NOT EXISTS similariries( + id BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY, + event_a BIGINT NOT NULL, + event_b BIGINT NOT NULL, + score NUMERIC(3, 2) NOT NULL CHECK (score BETWEEN 0.0 AND 1.0), + UNIQUE (event_a, event_b) +); diff --git a/stats/stats-server/pom.xml b/stats/collector/pom.xml similarity index 80% rename from stats/stats-server/pom.xml rename to stats/collector/pom.xml index 4f59218..b3961f6 100644 --- a/stats/stats-server/pom.xml +++ b/stats/collector/pom.xml @@ -3,52 +3,50 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + ru.practicum stats 0.0.1-SNAPSHOT - stats-server - jar + collector ru.practicum - stat-dto + avro-schemas 0.0.1-SNAPSHOT - org.projectlombok - lombok - provided + ru.practicum + proto-schemas + 0.0.1-SNAPSHOT + compile - org.springframework.boot - spring-boot-starter-web + ru.practicum + timestamp-utils + 0.0.1-SNAPSHOT + - org.springframework.boot - spring-boot-starter-data-jpa + net.devh + grpc-server-spring-boot-starter + org.springframework.boot - spring-boot-starter-test - test + spring-boot-starter-web org.springframework.boot spring-boot-starter-validation - org.postgresql - postgresql - runtime - - - com.h2database - h2 - runtime + org.projectlombok + lombok + provided diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/StatsServerApp.java b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/CollectorApp.java similarity index 61% rename from stats/stats-server/src/main/java/ru/practicum/stat/server/StatsServerApp.java rename to stats/collector/src/main/java/ru/practicum/ewm/stats/collector/CollectorApp.java index 31068cb..f10b0da 100644 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/StatsServerApp.java +++ b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/CollectorApp.java @@ -1,11 +1,11 @@ -package ru.practicum.stat.server; +package ru.practicum.ewm.stats.collector; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class StatsServerApp { +public class CollectorApp { public static void main(String[] args) { - SpringApplication.run(StatsServerApp.class, args); + SpringApplication.run(CollectorApp.class, args); } } diff --git a/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/config/CollectorConfiguration.java b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/config/CollectorConfiguration.java new file mode 100644 index 0000000..4e1b01e --- /dev/null +++ b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/config/CollectorConfiguration.java @@ -0,0 +1,28 @@ +package ru.practicum.ewm.stats.collector.config; + +import org.apache.kafka.clients.producer.KafkaProducer; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.practicum.ewm.stats.avro.UserActionAvro; + +import java.util.Properties; + +@Configuration +public class CollectorConfiguration { + + @Bean + @ConfigurationProperties("kafka.user-action-producer-config") + public Properties userActionProducerConfig() { + return new Properties(); + } + + @Bean + public KafkaProducer userActionKafkaProducer( + @Qualifier("userActionProducerConfig") Properties config + ) { + return new KafkaProducer<>(config); + } + +} diff --git a/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/controller/CollectorController.java b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/controller/CollectorController.java new file mode 100644 index 0000000..f0f9acc --- /dev/null +++ b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/controller/CollectorController.java @@ -0,0 +1,53 @@ +package ru.practicum.ewm.stats.collector.controller; + +import com.google.protobuf.Empty; +import io.grpc.Status; +import io.grpc.StatusRuntimeException; +import io.grpc.stub.StreamObserver; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import net.devh.boot.grpc.server.service.GrpcService; +import org.springframework.lang.NonNull; +import ru.practicum.ewm.stats.collector.service.UserActionService; +import ru.practicum.ewm.stats.proto.UserActionControllerGrpc.UserActionControllerImplBase; +import ru.practicum.ewm.stats.proto.UserActionProto; +import ru.yandex.practicum.telemetry.utils.TimestampUtils; + +@Slf4j +@GrpcService +@RequiredArgsConstructor +public class CollectorController extends UserActionControllerImplBase { + + private final UserActionService userActionService; + + @Override + public void collectUserAction(@NonNull UserActionProto request, + StreamObserver responseObserver) { + log.info(""" + Получен gRPC запрос: + collectUserAction(UserActionProto request) + { + "user_id": "{}" + "event_id": "{}", + "action_type": "{}", + "timestamp": "{}" + }""", + request.getUserId(), + request.getEventId(), + request.getActionType().name(), + TimestampUtils.toLocalDateTime(request.getTimestamp()) + ); + + try { + userActionService.collectUserAction(request); + responseObserver.onNext(Empty.getDefaultInstance()); + responseObserver.onCompleted(); + + } catch (Exception e) { + responseObserver.onError( + new StatusRuntimeException(Status.fromThrowable(e)) + ); + } + } + +} diff --git a/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/mapper/UserActionMapper.java b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/mapper/UserActionMapper.java new file mode 100644 index 0000000..75cceaf --- /dev/null +++ b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/mapper/UserActionMapper.java @@ -0,0 +1,32 @@ +package ru.practicum.ewm.stats.collector.mapper; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import ru.practicum.ewm.stats.avro.ActionTypeAvro; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.practicum.ewm.stats.proto.ActionTypeProto; +import ru.practicum.ewm.stats.proto.UserActionProto; +import ru.yandex.practicum.telemetry.utils.TimestampUtils; + +@UtilityClass +public class UserActionMapper { + + public UserActionAvro toAvro(@NonNull UserActionProto proto) { + return UserActionAvro.newBuilder() + .setUserId(proto.getUserId()) + .setEventId(proto.getEventId()) + .setActionType(UserActionMapper.toAvroActionType(proto.getActionType())) + .setTimestamp(TimestampUtils.toInstant(proto.getTimestamp())) + .build(); + } + + private ActionTypeAvro toAvroActionType(@NonNull ActionTypeProto protoType) { + return switch (protoType) { + case ACTION_VIEW -> ActionTypeAvro.VIEWS; + case ACTION_LIKE -> ActionTypeAvro.LIKE; + case ACTION_REGISTER -> ActionTypeAvro.REGISTER; + default -> throw new IllegalArgumentException("Unknown action type: " + protoType); + }; + } + +} diff --git a/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/producer/UserActionProducer.java b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/producer/UserActionProducer.java new file mode 100644 index 0000000..82d5b72 --- /dev/null +++ b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/producer/UserActionProducer.java @@ -0,0 +1,44 @@ +package ru.practicum.ewm.stats.collector.producer; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.producer.Producer; +import org.apache.kafka.clients.producer.ProducerRecord; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.avro.UserActionAvro; + +import javax.annotation.Nonnull; +import java.util.concurrent.CompletableFuture; + +@Slf4j +@Component +@RequiredArgsConstructor +public class UserActionProducer { + + @Value("${kafka.topics.users-interaction}") + private String topic; + + private final Producer producer; + + public CompletableFuture sendMessage(Long key, + @Nonnull T userAction) { + ProducerRecord record = new ProducerRecord<>( + topic, null, key, userAction); + + CompletableFuture future = new CompletableFuture<>(); + + log.info("Отправляю сообщение:\n{}", record.value()); + producer.send(record, (metadata, exception) -> { + if (exception != null) { + future.completeExceptionally(exception); + } else { + future.complete(metadata); + } + }); + + return future; + } + +} diff --git a/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/service/UserActionService.java b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/service/UserActionService.java new file mode 100644 index 0000000..fb3f3e8 --- /dev/null +++ b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/service/UserActionService.java @@ -0,0 +1,8 @@ +package ru.practicum.ewm.stats.collector.service; + +import ru.practicum.ewm.stats.proto.UserActionProto; + +public interface UserActionService { + + void collectUserAction(UserActionProto userAction); +} diff --git a/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/service/UserActionServiceImpl.java b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/service/UserActionServiceImpl.java new file mode 100644 index 0000000..e665ce1 --- /dev/null +++ b/stats/collector/src/main/java/ru/practicum/ewm/stats/collector/service/UserActionServiceImpl.java @@ -0,0 +1,42 @@ +package ru.practicum.ewm.stats.collector.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.kafka.clients.producer.RecordMetadata; +import org.springframework.stereotype.Service; +import ru.practicum.ewm.stats.avro.UserActionAvro; +import ru.practicum.ewm.stats.collector.producer.UserActionProducer; +import ru.practicum.ewm.stats.collector.mapper.UserActionMapper; +import ru.practicum.ewm.stats.proto.UserActionProto; + +import java.util.concurrent.CompletableFuture; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserActionServiceImpl implements UserActionService { + + private final UserActionProducer client; + + @Override + public void collectUserAction(UserActionProto proto) { + UserActionAvro avro = UserActionMapper.toAvro(proto); + + CompletableFuture result = client.sendMessage(avro.getEventId(), avro); + result.whenComplete((record, throwable) -> { + if (throwable != null) { + log.error("Ошибка отправки действия пользователя {}:\n {}", + avro.getActionType(), throwable.getMessage(), throwable); + } else { + log.info("{} отправлен по адресу:\n topic={}, key={}, partition={}, offset={}", + avro.getActionType(), + record.topic(), + avro.getEventId(), + record.partition(), + record.offset() + ); + } + }); + } + +} diff --git a/stats/collector/src/main/resources/application.yml b/stats/collector/src/main/resources/application.yml new file mode 100644 index 0000000..4122d52 --- /dev/null +++ b/stats/collector/src/main/resources/application.yml @@ -0,0 +1,31 @@ +server: + port: 0 + +spring: + application: + name: collector + config: + import: "optional:configserver:" + cloud: + config: + discovery: + enabled: true + service-id: config-server + fail-fast: true + retry: + initial-interval: 1000 + max-interval: 10000 + multiplier: 2.0 + max-attempts: 20 + +eureka: + client: + serviceUrl: + defaultZone: http://localhost:8761/eureka/ + register-with-eureka: true + fetch-registry: true + instance: + prefer-ip-address: true + instance-id: ${spring.application.name}:${random.value} + lease-renewal-interval-in-seconds: 5 + lease-expiration-duration-in-seconds: 10 diff --git a/stats/pom.xml b/stats/pom.xml index 494a796..08490ff 100644 --- a/stats/pom.xml +++ b/stats/pom.xml @@ -14,8 +14,11 @@ pom - stat-dto - stats-server + stats-client + aggregator + analyzer + collector + serialization \ No newline at end of file diff --git a/stats/serialization/avro-schemas/pom.xml b/stats/serialization/avro-schemas/pom.xml new file mode 100644 index 0000000..db05527 --- /dev/null +++ b/stats/serialization/avro-schemas/pom.xml @@ -0,0 +1,88 @@ + + + 4.0.0 + + + ru.practicum + serialization + 0.0.1-SNAPSHOT + + + avro-schemas + jar + + + + org.projectlombok + lombok + provided + + + org.springframework.boot + spring-boot-starter-validation + + + + org.apache.avro + avro + + + org.apache.kafka + kafka-clients + + + com.google.code.findbugs + jsr305 + 3.0.2 + compile + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.avro + avro-maven-plugin + + + schemas + generate-sources + + idl-protocol + + + ${project.basedir}/src/main/avro/ + ${project.build.directory}/generated-sources + String + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources + + + + + + + + + \ No newline at end of file diff --git a/stats/serialization/avro-schemas/src/main/avro/stats/Event.avdl b/stats/serialization/avro-schemas/src/main/avro/stats/Event.avdl new file mode 100644 index 0000000..28bfce1 --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/avro/stats/Event.avdl @@ -0,0 +1,12 @@ +@namespace("ru.practicum.ewm.stats.avro") +protocol EventProtocol { + + /** + * Информация о мероприятии + */ + record EventAvro { + long id; + long categoryId; + } + +} diff --git a/stats/serialization/avro-schemas/src/main/avro/stats/EventsSimilarity.avdl b/stats/serialization/avro-schemas/src/main/avro/stats/EventsSimilarity.avdl new file mode 100644 index 0000000..ec26e31 --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/avro/stats/EventsSimilarity.avdl @@ -0,0 +1,17 @@ +@namespace("ru.practicum.ewm.stats.avro") + +protocol EventsSimilarityProtocol { + + import idl "Event.avdl"; + + /** + * Сходство мероприятий + */ + record EventsSimilarityAvro { + long eventA; + long eventB; + double score; + timestamp_ms timestamp; + } + +} diff --git a/stats/serialization/avro-schemas/src/main/avro/stats/UserAction.avdl b/stats/serialization/avro-schemas/src/main/avro/stats/UserAction.avdl new file mode 100644 index 0000000..6eed764 --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/avro/stats/UserAction.avdl @@ -0,0 +1,17 @@ +@namespace("ru.practicum.ewm.stats.avro") +protocol UserActionProtocol { + + record UserActionAvro { + long userId; + long eventId; + ActionTypeAvro actionType; + timestamp_ms timestamp; + } + + enum ActionTypeAvro { + VIEWS, // Просмотр + REGISTER, // Регистрация + LIKE // Лайк + } + +} diff --git a/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/EventsSimilarityDeserializer.java b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/EventsSimilarityDeserializer.java new file mode 100644 index 0000000..5a5243a --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/EventsSimilarityDeserializer.java @@ -0,0 +1,12 @@ +package ru.practicum.ewm.kafka.deserializer; + +import ru.practicum.ewm.kafka.deserializer.base.BaseAvroDeserializer; +import ru.practicum.ewm.stats.avro.EventsSimilarityAvro; + +@SuppressWarnings("unused") +public class EventsSimilarityDeserializer extends BaseAvroDeserializer { + + public EventsSimilarityDeserializer() { + super(EventsSimilarityAvro.getClassSchema()); + } +} diff --git a/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/UserActionsDeserializer.java b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/UserActionsDeserializer.java new file mode 100644 index 0000000..5af867f --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/UserActionsDeserializer.java @@ -0,0 +1,12 @@ +package ru.practicum.ewm.kafka.deserializer; + +import ru.practicum.ewm.kafka.deserializer.base.BaseAvroDeserializer; +import ru.practicum.ewm.stats.avro.UserActionAvro; + +@SuppressWarnings("unused") +public class UserActionsDeserializer extends BaseAvroDeserializer { + + public UserActionsDeserializer() { + super(UserActionAvro.getClassSchema()); + } +} diff --git a/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/base/BaseAvroDeserializer.java b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/base/BaseAvroDeserializer.java new file mode 100644 index 0000000..463a0b0 --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/base/BaseAvroDeserializer.java @@ -0,0 +1,37 @@ +package ru.practicum.ewm.kafka.deserializer.base; + +import org.apache.avro.Schema; +import org.apache.avro.io.BinaryDecoder; +import org.apache.avro.io.DatumReader; +import org.apache.avro.io.DecoderFactory; +import org.apache.avro.specific.SpecificDatumReader; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.common.serialization.Deserializer; + +import javax.annotation.Nonnull; + +public class BaseAvroDeserializer implements Deserializer { + + private final DecoderFactory decoderFactory; + private final DatumReader reader; + + public BaseAvroDeserializer(Schema schema) { + this(DecoderFactory.get(), schema); + } + + public BaseAvroDeserializer(DecoderFactory decoderFactory, Schema schema) { + this.decoderFactory = decoderFactory; + this.reader = new SpecificDatumReader<>(schema); + } + + @Override + public T deserialize(String topic, @Nonnull byte[] data) { + try { + BinaryDecoder decoder = decoderFactory.binaryDecoder(data, null); + return reader.read(null, decoder); + + } catch (Exception e) { + throw new DeserializationException("Ошибка десериализации данных из топика [" + topic + "]", e); + } + } +} \ No newline at end of file diff --git a/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/base/DeserializationException.java b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/base/DeserializationException.java new file mode 100644 index 0000000..8094078 --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/deserializer/base/DeserializationException.java @@ -0,0 +1,9 @@ +package ru.practicum.ewm.kafka.deserializer.base; + +public class DeserializationException extends RuntimeException { + + @SuppressWarnings("unused") + public DeserializationException(String message, Exception e) { + super(message); + } +} diff --git a/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/serializer/GeneralAvroSerializer.java b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/serializer/GeneralAvroSerializer.java new file mode 100644 index 0000000..cd00192 --- /dev/null +++ b/stats/serialization/avro-schemas/src/main/java/ru/practicum/ewm/kafka/serializer/GeneralAvroSerializer.java @@ -0,0 +1,42 @@ +package ru.practicum.ewm.kafka.serializer; + +import org.apache.avro.io.BinaryEncoder; +import org.apache.avro.io.DatumWriter; +import org.apache.avro.io.EncoderFactory; +import org.apache.avro.specific.SpecificDatumWriter; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.common.errors.SerializationException; +import org.apache.kafka.common.serialization.Serializer; + +import java.io.ByteArrayOutputStream; + +@SuppressWarnings("unused") +public class GeneralAvroSerializer implements Serializer { + + private final EncoderFactory encoderFactory = EncoderFactory.get(); + + @Override + public byte[] serialize(String topic, SpecificRecordBase data) { + if (data == null) { + return null; + } + + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + BinaryEncoder encoder = encoderFactory.binaryEncoder(outputStream, null); + DatumWriter datumWriter = new SpecificDatumWriter<>(data.getSchema()); + + datumWriter.setSchema(data.getSchema()); + datumWriter.write(data, encoder); + encoder.flush(); + + return outputStream.toByteArray(); + + } catch (Exception e) { + throw new SerializationException("Ошибка сереализации данных в топик [" + topic + "]", e); + } finally { + close(); + } + } + +} diff --git a/stats/serialization/pom.xml b/stats/serialization/pom.xml new file mode 100644 index 0000000..3387202 --- /dev/null +++ b/stats/serialization/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + + ru.practicum + stats + 0.0.1-SNAPSHOT + + + serialization + pom + + + avro-schemas + proto-schemas + timestamp-utils + + + \ No newline at end of file diff --git a/stats/serialization/proto-schemas/pom.xml b/stats/serialization/proto-schemas/pom.xml new file mode 100644 index 0000000..a2d7b52 --- /dev/null +++ b/stats/serialization/proto-schemas/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + + ru.practicum + serialization + 0.0.1-SNAPSHOT + + + proto-schemas + jar + + + + io.grpc + grpc-stub + + + io.grpc + grpc-protobuf + + + + + org.apache.tomcat + annotations-api + 6.0.53 + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + io.github.ascopes + protobuf-maven-plugin + + + ${protobuf.version} + + + + io.grpc + protoc-gen-grpc-java + ${grpc.version} + + + + + + + + generate + + + + + + + + \ No newline at end of file diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/interactions_count_request.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/interactions_count_request.proto new file mode 100644 index 0000000..5fda228 --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/interactions_count_request.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package stats.messages.analyzer; + +option java_package = "ru.practicum.ewm.stats.proto"; +option java_multiple_files = true; + +// Запрос на получение рекомендуемых мероприятий +message InteractionsCountRequestProto { + + /** + * Идентификаторы мероприятий для которых + * нужно вернуть количество взаимодействий + */ + repeated int64 event_id = 1; +} diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/similar_events_request.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/similar_events_request.proto new file mode 100644 index 0000000..4012f02 --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/similar_events_request.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package stats.messages.analyzer; + +option java_package = "ru.practicum.ewm.stats.proto"; +option java_multiple_files = true; + +// Запрос на получение похожих мероприятий +message SimilarEventsRequestProto { + int64 user_id = 1; + int64 event_id = 2; + int32 max_results = 3; // Ограничение на количество возвращаемых мероприятий +} diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/user_predictions_request.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/user_predictions_request.proto new file mode 100644 index 0000000..1c4ffbe --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/request/user_predictions_request.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +package stats.messages.analyzer; + +option java_package = "ru.practicum.ewm.stats.proto"; +option java_multiple_files = true; + +// Запрос на получение рекомендуемых мероприятий +message UserRecommendationsRequestProto { + int64 user_id = 1; + int32 max_results = 2; // Ограничение на количество возвращаемых мероприятий +} diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/response/recommended_event.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/response/recommended_event.proto new file mode 100644 index 0000000..0429623 --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/analyzer/response/recommended_event.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +package stats.messages.analyzer; + +option java_package = "ru.practicum.ewm.stats.proto"; +option java_multiple_files = true; + +// Рекомендуемое мероприятие +message RecommendedEventProto { + int64 event_id = 1; + double score = 2; // Коэффициент похожести +} diff --git a/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/collector/user_action.proto b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/collector/user_action.proto new file mode 100644 index 0000000..fb2392d --- /dev/null +++ b/stats/serialization/proto-schemas/src/main/protobuf/stats/messages/collector/user_action.proto @@ -0,0 +1,22 @@ +syntax = "proto3"; + +package stats.messages.collector; + +import "google/protobuf/timestamp.proto"; + +option java_package = "ru.practicum.ewm.stats.proto"; +option java_multiple_files = true; + +message UserActionProto { + int64 user_id = 1; + int64 event_id = 2; + ActionTypeProto action_type = 3; + google.protobuf.Timestamp timestamp = 4; +} + +// тип действия +enum ActionTypeProto { + ACTION_VIEW = 0; // просмотр страницы мероприятия + ACTION_REGISTER = 1; // заявка на участие в мероприятии + ACTION_LIKE = 2; // лайк мероприятию +} diff --git "a/stats/serialization/proto-schemas/src/main/protobuf/stats/servi\321\201e/analyzer/recommendations_controller.proto" "b/stats/serialization/proto-schemas/src/main/protobuf/stats/servi\321\201e/analyzer/recommendations_controller.proto" new file mode 100644 index 0000000..b00c8af --- /dev/null +++ "b/stats/serialization/proto-schemas/src/main/protobuf/stats/servi\321\201e/analyzer/recommendations_controller.proto" @@ -0,0 +1,26 @@ +syntax = "proto3"; + +package stats.service.dashboard; + +import "stats/messages/analyzer/request/similar_events_request.proto"; +import "stats/messages/analyzer/request/user_predictions_request.proto"; +import "stats/messages/analyzer/request/interactions_count_request.proto"; + +import "stats/messages/analyzer/response/recommended_event.proto"; + +option java_package = "ru.practicum.ewm.stats.proto"; + +service RecommendationsController { + + // Получить рекомендации для пользователя + rpc GetRecomendationsForUser (stats.messages.analyzer.UserRecommendationsRequestProto) + returns (stream stats.messages.analyzer.RecommendedEventProto); + + // Получить похожие по мероприятиям + rpc GetSimilarEvents (stats.messages.analyzer.SimilarEventsRequestProto) + returns (stream stats.messages.analyzer.RecommendedEventProto); + + // Получить количество взаимодействий + rpc GetInteractionsCount (stats.messages.analyzer.InteractionsCountRequestProto) + returns (stream stats.messages.analyzer.RecommendedEventProto); +} diff --git "a/stats/serialization/proto-schemas/src/main/protobuf/stats/servi\321\201e/collector/user_action_controller.proto" "b/stats/serialization/proto-schemas/src/main/protobuf/stats/servi\321\201e/collector/user_action_controller.proto" new file mode 100644 index 0000000..9682c1f --- /dev/null +++ "b/stats/serialization/proto-schemas/src/main/protobuf/stats/servi\321\201e/collector/user_action_controller.proto" @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package stats.service.collector; + +import "stats/messages/collector/user_action.proto"; +import "google/protobuf/empty.proto"; + +option java_package = "ru.practicum.ewm.stats.proto"; + +service UserActionController { + + // Сохранить действие пользователя + rpc CollectUserAction (stats.messages.collector.UserActionProto) + returns (google.protobuf.Empty); +} diff --git a/stats/serialization/timestamp-utils/pom.xml b/stats/serialization/timestamp-utils/pom.xml new file mode 100644 index 0000000..d47e615 --- /dev/null +++ b/stats/serialization/timestamp-utils/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + + + ru.practicum + serialization + 0.0.1-SNAPSHOT + + + timestamp-utils + jar + + + + org.projectlombok + lombok + provided + + + com.google.protobuf + protobuf-java + ${protobuf.version} + compile + + + + \ No newline at end of file diff --git a/stats/serialization/timestamp-utils/src/main/java/ru/yandex/practicum/telemetry/utils/TimestampUtils.java b/stats/serialization/timestamp-utils/src/main/java/ru/yandex/practicum/telemetry/utils/TimestampUtils.java new file mode 100644 index 0000000..e7295bf --- /dev/null +++ b/stats/serialization/timestamp-utils/src/main/java/ru/yandex/practicum/telemetry/utils/TimestampUtils.java @@ -0,0 +1,64 @@ +package ru.yandex.practicum.telemetry.utils; + +import com.google.protobuf.Timestamp; +import lombok.NonNull; +import lombok.experimental.UtilityClass; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +@UtilityClass +@SuppressWarnings("unused") +public class TimestampUtils { + + private final ZoneId zoneId = ZoneId.systemDefault(); + + public final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + + public Timestamp toTimestamp(@NonNull Instant instant) { + return Timestamp.newBuilder() + .setSeconds(instant.getEpochSecond()) + .setNanos(instant.getNano()) + .build(); + } + + public Timestamp toTimestamp(@NonNull LocalDateTime localDateTime) { + return toTimestamp(localDateTime.atZone(zoneId).toInstant()); + } + + public Instant toInstant(@NonNull Timestamp timestamp) { + return Instant.ofEpochSecond( + timestamp.getSeconds(), + timestamp.getNanos() + ); + } + + public Instant toInstant(@NonNull LocalDateTime localDateTime) { + return toInstant(toTimestamp(localDateTime)); + } + + public LocalDateTime toLocalDateTime(@NonNull Timestamp timestamp) { + return LocalDateTime.ofInstant(TimestampUtils.toInstant(timestamp), zoneId) + .truncatedTo(ChronoUnit.MILLIS); + } + + public LocalDateTime toLocalDateTime(long timestamp) { + return toLocalDateTime(TimestampUtils.toTimestamp(Instant.ofEpochSecond(timestamp))) + .truncatedTo(ChronoUnit.MILLIS); + } + + public LocalDateTime toLocalDateTime(@NonNull Instant instant) { + return toLocalDateTime(TimestampUtils.toTimestamp(instant)); + } + + public String toString(@NonNull Timestamp timestamp) { + return formatter.format(toLocalDateTime(timestamp)); + } + + public String toString(long longTimestamp) { + return toString(toTimestamp(Instant.ofEpochSecond(longTimestamp).atZone(zoneId).toInstant())); + } +} diff --git a/stats/stat-dto/pom.xml b/stats/stat-dto/pom.xml deleted file mode 100644 index 3a9f1c0..0000000 --- a/stats/stat-dto/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - - ru.practicum - stats - 0.0.1-SNAPSHOT - - - stat-dto - jar - - - - org.projectlombok - lombok - true - - - com.fasterxml.jackson.core - jackson-annotations - - - jakarta.validation - jakarta.validation-api - 3.0.2 - compile - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.projectlombok - lombok - ${lombok.version} - - - - - - - - \ No newline at end of file diff --git a/stats/stat-dto/src/main/java/ru/practicum/stat/dto/EndpointHitDto.java b/stats/stat-dto/src/main/java/ru/practicum/stat/dto/EndpointHitDto.java deleted file mode 100644 index 4883b3a..0000000 --- a/stats/stat-dto/src/main/java/ru/practicum/stat/dto/EndpointHitDto.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.practicum.stat.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class EndpointHitDto { - - @NotBlank(message = "Название приложения не может быть пустым") - @Size(max = 255, message = "APP слишком длинный (макс. 255 символов)") - private String app; - - @NotBlank(message = "URI не может быть пустым") - @Size(max = 512, message = "URI слишком длинный (макс. 512 символов)") - private String uri; - - @NotBlank(message = "IP-адрес не может быть пустым") - @Size(max = 45, message = "IP слишком длинный (макс. 45 символов)") - private String ip; - - @NotNull(message = "TIMESTAMP является обязательным") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime timestamp; - - @Builder.Default - private String actionType = "VIEW"; // VIEW, LIKE, DISLIKE для рейтингов -} diff --git a/stats/stat-dto/src/main/java/ru/practicum/stat/dto/ViewStatsDto.java b/stats/stat-dto/src/main/java/ru/practicum/stat/dto/ViewStatsDto.java deleted file mode 100644 index 75e35e9..0000000 --- a/stats/stat-dto/src/main/java/ru/practicum/stat/dto/ViewStatsDto.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.practicum.stat.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ViewStatsDto { - private String app; - private String uri; - private Long hits; -} diff --git a/stats/stats-client/pom.xml b/stats/stats-client/pom.xml new file mode 100644 index 0000000..afb9f20 --- /dev/null +++ b/stats/stats-client/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + + ru.practicum + stats + 0.0.1-SNAPSHOT + + + stats-client + jar + + + + ru.practicum + proto-schemas + 0.0.1-SNAPSHOT + compile + + + ru.practicum + timestamp-utils + 0.0.1-SNAPSHOT + + + + org.projectlombok + lombok + provided + + + + net.devh + grpc-client-spring-boot-starter + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + + \ No newline at end of file diff --git a/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/ActionType.java b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/ActionType.java new file mode 100644 index 0000000..515de7d --- /dev/null +++ b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/ActionType.java @@ -0,0 +1,7 @@ +package ru.practicum.stats.client.dto; + +public enum ActionType { + VIEWS, // Просмотр + REGISTER, // Регистрация + LIKE // Лайк +} diff --git a/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/ActionsWeightsSum.java b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/ActionsWeightsSum.java new file mode 100644 index 0000000..3143943 --- /dev/null +++ b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/ActionsWeightsSum.java @@ -0,0 +1,10 @@ +package ru.practicum.stats.client.dto; + +import lombok.Builder; + +@Builder +public record ActionsWeightsSum( + long eventId, + double score +) { +} diff --git a/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/PredictedScore.java b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/PredictedScore.java new file mode 100644 index 0000000..d67bf4b --- /dev/null +++ b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/PredictedScore.java @@ -0,0 +1,13 @@ +package ru.practicum.stats.client.dto; + +import lombok.Builder; + +/** + * Предсказание о возможном понравившемся событии + */ +@Builder +public record PredictedScore( + long eventId, + double score +) { +} diff --git a/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/SimilarityCoefficient.java b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/SimilarityCoefficient.java new file mode 100644 index 0000000..65e3950 --- /dev/null +++ b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/SimilarityCoefficient.java @@ -0,0 +1,10 @@ +package ru.practicum.stats.client.dto; + +import lombok.Builder; + +@Builder +public record SimilarityCoefficient( + long eventId, + double score +) { +} diff --git a/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/UserActionDto.java b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/UserActionDto.java new file mode 100644 index 0000000..315d3cf --- /dev/null +++ b/stats/stats-client/src/main/java/ru/practicum/stats/client/dto/UserActionDto.java @@ -0,0 +1,14 @@ +package ru.practicum.stats.client.dto; + +import lombok.Builder; + +import java.time.LocalDateTime; + +@Builder +public record UserActionDto( + long userId, + long eventId, + ActionType actionType, + LocalDateTime timestamp +) { +} diff --git a/stats/stats-client/src/main/java/ru/practicum/stats/client/grpc/AnalyzerClient.java b/stats/stats-client/src/main/java/ru/practicum/stats/client/grpc/AnalyzerClient.java new file mode 100644 index 0000000..beeda3f --- /dev/null +++ b/stats/stats-client/src/main/java/ru/practicum/stats/client/grpc/AnalyzerClient.java @@ -0,0 +1,92 @@ +package ru.practicum.stats.client.grpc; + +import lombok.extern.slf4j.Slf4j; +import net.devh.boot.grpc.client.inject.GrpcClient; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.proto.InteractionsCountRequestProto; +import ru.practicum.ewm.stats.proto.RecommendationsControllerGrpc.RecommendationsControllerBlockingStub; +import ru.practicum.ewm.stats.proto.RecommendedEventProto; +import ru.practicum.ewm.stats.proto.SimilarEventsRequestProto; +import ru.practicum.ewm.stats.proto.UserRecommendationsRequestProto; +import ru.practicum.stats.client.dto.ActionsWeightsSum; +import ru.practicum.stats.client.dto.PredictedScore; +import ru.practicum.stats.client.dto.SimilarityCoefficient; + +import java.util.Iterator; +import java.util.List; +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +@SuppressWarnings("unused") +@Slf4j +@Component +public class AnalyzerClient { + + @SuppressWarnings("unused") + @GrpcClient("analyzer") + private RecommendationsControllerBlockingStub client; + + // коэффициент сходства + public List getSimilarEvents(long eventId, long userId, int maxResults) { + SimilarEventsRequestProto request = SimilarEventsRequestProto.newBuilder() + .setEventId(eventId) + .setUserId(userId) + .setMaxResults(maxResults) + .build(); + + Iterator iterator = client.getSimilarEvents(request); + + return asStream(iterator).map(proto -> + SimilarityCoefficient.builder() + .eventId(proto.getEventId()) + .score(proto.getScore()) + .build() + ) + .toList(); + } + + // предсказанная оценка + public List getRecomendationsForUser(long userId, int maxResults) { + var request = UserRecommendationsRequestProto.newBuilder() + .setUserId(userId) + .setMaxResults(maxResults) + .build(); + Iterator iterator = client.getRecomendationsForUser(request); + return asStream(iterator).map(recommendedEventProto -> + PredictedScore.builder() + .eventId(recommendedEventProto.getEventId()) + .score(recommendedEventProto.getScore()) + .build() + ) + .toList(); + } + + // сумма весов действий с указанным мероприятием + public List getInteractionsCount(List eventIds) { + InteractionsCountRequestProto request = InteractionsCountRequestProto.newBuilder() + .addAllEventId(eventIds) + .build(); + + Iterator iterator = client.getInteractionsCount(request); + + return asStream(iterator).map(proto -> + ActionsWeightsSum.builder() + .eventId(proto.getEventId()) + .score(proto.getScore()) + .build() + ) + .toList(); + } + + @NonNull + private Stream asStream(Iterator iterator) { + return StreamSupport.stream( + Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), + false + ); + } + +} \ No newline at end of file diff --git a/stats/stats-client/src/main/java/ru/practicum/stats/client/grpc/CollectorClient.java b/stats/stats-client/src/main/java/ru/practicum/stats/client/grpc/CollectorClient.java new file mode 100644 index 0000000..8799a34 --- /dev/null +++ b/stats/stats-client/src/main/java/ru/practicum/stats/client/grpc/CollectorClient.java @@ -0,0 +1,47 @@ +package ru.practicum.stats.client.grpc; + +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.MoreExecutors; +import com.google.protobuf.Empty; +import lombok.extern.slf4j.Slf4j; +import net.devh.boot.grpc.client.inject.GrpcClient; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; +import ru.practicum.ewm.stats.proto.UserActionControllerGrpc.UserActionControllerFutureStub; +import ru.practicum.ewm.stats.proto.UserActionProto; +import ru.practicum.stats.client.dto.UserActionDto; +import ru.practicum.stats.client.mapper.ActionTypeMapper; +import ru.yandex.practicum.telemetry.utils.TimestampUtils; + +import java.util.concurrent.CompletableFuture; + +@SuppressWarnings("unused") +@Slf4j +@Component +public class CollectorClient { + + @GrpcClient("collector") + private UserActionControllerFutureStub futureStub; + + public void collectUserAction(@NonNull UserActionDto dto) { + var request = UserActionProto.newBuilder() + .setUserId(dto.userId()) + .setEventId(dto.eventId()) + .setActionType(ActionTypeMapper.toProto(dto.actionType())) + .setTimestamp(TimestampUtils.toTimestamp(dto.timestamp())) + .build(); + + ListenableFuture listenableFuture = futureStub.collectUserAction(request); + + CompletableFuture completableFuture = new CompletableFuture<>(); + + listenableFuture.addListener(() -> { + try { + completableFuture.complete(listenableFuture.get()); + } catch (Exception e) { + completableFuture.completeExceptionally(e); + } + }, MoreExecutors.directExecutor()); + } + +} diff --git a/stats/stats-client/src/main/java/ru/practicum/stats/client/mapper/ActionTypeMapper.java b/stats/stats-client/src/main/java/ru/practicum/stats/client/mapper/ActionTypeMapper.java new file mode 100644 index 0000000..5d2107b --- /dev/null +++ b/stats/stats-client/src/main/java/ru/practicum/stats/client/mapper/ActionTypeMapper.java @@ -0,0 +1,27 @@ +package ru.practicum.stats.client.mapper; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import ru.practicum.ewm.stats.proto.ActionTypeProto; +import ru.practicum.stats.client.dto.ActionType; + +@UtilityClass +public class ActionTypeMapper { + + public ActionType toActionType(@NonNull ActionTypeProto proto) { + return switch (proto) { + case ACTION_VIEW -> ActionType.VIEWS; + case ACTION_REGISTER -> ActionType.REGISTER; + case ACTION_LIKE -> ActionType.LIKE; + case UNRECOGNIZED -> throw new IllegalArgumentException("Action type is UNRECOGNIZED"); + }; + } + + public ActionTypeProto toProto(@NonNull ActionType actionType) { + return switch (actionType) { + case VIEWS -> ActionTypeProto.ACTION_VIEW; + case REGISTER -> ActionTypeProto.ACTION_REGISTER; + case LIKE -> ActionTypeProto.ACTION_LIKE; + }; + } +} diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/config/JacksonConfiguration.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/config/JacksonConfiguration.java deleted file mode 100644 index dec31a4..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/config/JacksonConfiguration.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.practicum.stat.server.config; - -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; -import org.springframework.context.annotation.Bean; - -import java.time.format.DateTimeFormatter; - -@SpringBootConfiguration -public class JacksonConfiguration { - - @Bean - public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { - String pattern = "yyyy-MM-dd HH:mm:ss"; - return builder -> { - builder.simpleDateFormat(pattern); - builder.serializers(new LocalDateTimeSerializer( - DateTimeFormatter.ofPattern(pattern) - )); - builder.deserializers(new LocalDateTimeDeserializer( - DateTimeFormatter.ofPattern(pattern) - )); - }; - } - -} \ No newline at end of file diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/config/WebConfig.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/config/WebConfig.java deleted file mode 100644 index 61bd1da..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/config/WebConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package ru.practicum.stat.server.config; - -import org.jspecify.annotations.NonNull; -import org.springframework.context.annotation.Configuration; -import org.springframework.format.FormatterRegistry; -import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import java.time.format.DateTimeFormatter; - -@Configuration -public class WebConfig implements WebMvcConfigurer { - - @Override - public void addFormatters(@NonNull FormatterRegistry registry) { - DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); - registrar.setUseIsoFormat(false); - registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - registrar.registerFormatters(registry); - } -} \ No newline at end of file diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/controller/StatController.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/controller/StatController.java deleted file mode 100644 index 8434216..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/controller/StatController.java +++ /dev/null @@ -1,48 +0,0 @@ -package ru.practicum.stat.server.controller; - -import jakarta.validation.Valid; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.format.annotation.DateTimeFormat; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; -import ru.practicum.stat.dto.EndpointHitDto; -import ru.practicum.stat.dto.ViewStatsDto; -import ru.practicum.stat.server.service.StatService; - -import java.time.LocalDateTime; -import java.util.List; - -@Slf4j -@RestController -@RequiredArgsConstructor -public class StatController { - - private final StatService statService; - - @PostMapping("/hit") - @ResponseStatus(HttpStatus.CREATED) - public void hit(@NonNull @Valid @RequestBody EndpointHitDto endpointHitDto) { - log.info("Сохранение статистики: сервис={}, uri={}, ip={}", - endpointHitDto.getApp(), endpointHitDto.getUri(), endpointHitDto.getIp()); - statService.saveHit(endpointHitDto); - } - - @GetMapping("/stats") - public List getStats( - @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime start, - @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime end, - @RequestParam(required = false) List uris, - @RequestParam(defaultValue = "false") boolean unique - ) { - log.info("Запрос статистики: start={}, end={}, uris={}, unique={}", start, end, uris, unique); - - if (start.isAfter(end)) { - log.warn("Некорректный диапазон дат: start={} позже end={}", start, end); - throw new IllegalArgumentException("Дата окончания не может быть раньше даты начала"); - } - - return statService.getStats(start, end, uris, unique); - } -} diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/entity/EndpointHit.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/entity/EndpointHit.java deleted file mode 100644 index 120b5cb..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/entity/EndpointHit.java +++ /dev/null @@ -1,44 +0,0 @@ -package ru.practicum.stat.server.entity; - -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; - -@Entity -@Table(name = "stats") -@Getter -@Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class EndpointHit { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String app; - - @Column(nullable = false, length = 512) - private String uri; - - @Column(nullable = false, length = 45) - private String ip; - - @Column(name = "hit_timestamp", nullable = false) - private LocalDateTime timestamp; - - @Override - public String toString() { - return """ - { - "id": "%s", - "app": "%s", - "uri": "%s", - "ip": "%s", - "timestamp": "%s" - }""".formatted(id, app, uri, ip, timestamp); - } -} diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/error/ApiError.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/error/ApiError.java deleted file mode 100644 index 389e94d..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/error/ApiError.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.practicum.stat.server.error; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.experimental.FieldDefaults; -import org.springframework.http.HttpStatus; -import java.time.LocalDateTime; - -@Getter -@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) -public class ApiError { - private HttpStatus status; - private String reason; - private String message; - private String errors; - private LocalDateTime timestamp = LocalDateTime.now(); - - public ApiError(HttpStatus status, String reason, String message, String stackTrace) { - this.status = status; - this.reason = reason; - this.message = message; - this.errors = stackTrace; - } -} - diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/error/StatErrorHandler.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/error/StatErrorHandler.java deleted file mode 100644 index 73c0155..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/error/StatErrorHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.practicum.stat.server.error; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.lang.NonNull; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.MissingServletRequestParameterException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; - -import java.io.PrintWriter; -import java.io.StringWriter; - -@Slf4j -@RestControllerAdvice -public class StatErrorHandler { - - @ExceptionHandler({ - MethodArgumentNotValidException.class, - IllegalArgumentException.class, - MissingServletRequestParameterException.class, - MethodArgumentTypeMismatchException.class - }) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ApiError handleBadRequest(@NonNull final Exception e) { - log.error("400 Bad Request: {}", e.getMessage()); - return new ApiError( - HttpStatus.BAD_REQUEST, - "Bad Request", - e.getMessage(), - getStackTrace(e) - ); - } - - private String getStackTrace(@NonNull Exception e) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - return sw.toString(); - } - - @ExceptionHandler - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public ApiError handleException(Exception e) { - log.info("500 {}", e.getMessage(), e); - String stackTrace = getStackTrace(e); - return new ApiError(HttpStatus.INTERNAL_SERVER_ERROR, - "Error ....", e.getMessage(), stackTrace); - } -} diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/mapper/EndpointHitMapper.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/mapper/EndpointHitMapper.java deleted file mode 100644 index dfe0e33..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/mapper/EndpointHitMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.practicum.stat.server.mapper; - -import org.springframework.lang.NonNull; -import ru.practicum.stat.dto.EndpointHitDto; -import ru.practicum.stat.server.entity.EndpointHit; - -import java.time.temporal.ChronoUnit; - -public class EndpointHitMapper { - - public static EndpointHit toEntity(@NonNull EndpointHitDto dto) { - return EndpointHit.builder() - .app(dto.getApp()) - .uri(dto.getUri()) - .ip(dto.getIp()) - .timestamp(dto.getTimestamp().truncatedTo(ChronoUnit.SECONDS)) - .build(); - } -} diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/repository/StatRepository.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/repository/StatRepository.java deleted file mode 100644 index 18b4294..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/repository/StatRepository.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.practicum.stat.server.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import ru.practicum.stat.dto.ViewStatsDto; -import ru.practicum.stat.server.entity.EndpointHit; - -import java.time.LocalDateTime; -import java.util.List; - -public interface StatRepository extends JpaRepository { - - @Query("SELECT new ru.practicum.stat.dto.ViewStatsDto(e.app, e.uri, COUNT(e.ip)) " + - "FROM EndpointHit e " + - "WHERE e.timestamp BETWEEN :start AND :end " + - "AND (:uris IS NULL OR e.uri IN :uris) " + - "GROUP BY e.app, e.uri " + - "ORDER BY COUNT(e.ip) DESC") - List getStats(@Param("start") LocalDateTime start, - @Param("end") LocalDateTime end, - @Param("uris") List uris); - - @Query("SELECT new ru.practicum.stat.dto.ViewStatsDto(e.app, e.uri, COUNT(DISTINCT e.ip)) " + - "FROM EndpointHit e " + - "WHERE e.timestamp BETWEEN :start AND :end " + - "AND (:uris IS NULL OR e.uri IN :uris) " + - "GROUP BY e.app, e.uri " + - "ORDER BY COUNT(DISTINCT e.ip) DESC") - List getStatsUnique(@Param("start") LocalDateTime start, - @Param("end") LocalDateTime end, - @Param("uris") List uris); -} diff --git a/stats/stats-server/src/main/java/ru/practicum/stat/server/service/StatService.java b/stats/stats-server/src/main/java/ru/practicum/stat/server/service/StatService.java deleted file mode 100644 index 48bd30f..0000000 --- a/stats/stats-server/src/main/java/ru/practicum/stat/server/service/StatService.java +++ /dev/null @@ -1,42 +0,0 @@ -package ru.practicum.stat.server.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.lang.NonNull; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import ru.practicum.stat.dto.EndpointHitDto; -import ru.practicum.stat.dto.ViewStatsDto; -import ru.practicum.stat.server.mapper.EndpointHitMapper; -import ru.practicum.stat.server.repository.StatRepository; - -import java.time.LocalDateTime; -import java.util.List; - -@Slf4j -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class StatService { - - private final StatRepository statRepository; - - @Transactional - public void saveHit(@NonNull EndpointHitDto endpointHitDto) { - log.debug("Сохранение записи о просмотре для URI: {}", endpointHitDto.getUri()); - statRepository.save(EndpointHitMapper.toEntity(endpointHitDto)); - } - - public List getStats(LocalDateTime start, - LocalDateTime end, - List uris, - boolean unique) { - if (unique) { - log.debug("Получение статистики (уникальные IP) для URI: {}", uris); - return statRepository.getStatsUnique(start, end, uris); - } - - log.debug("Получение общей статистики для URI: {}", uris); - return statRepository.getStats(start, end, uris); - } -} diff --git a/stats/stats-server/src/main/resources/application-test.yaml.bak b/stats/stats-server/src/main/resources/application-test.yaml.bak deleted file mode 100644 index 0a6d29e..0000000 --- a/stats/stats-server/src/main/resources/application-test.yaml.bak +++ /dev/null @@ -1,12 +0,0 @@ -spring: - datasource: - driver-class-name: org.h2.Driver - url: jdbc:h2:mem:ewm-stats - jpa: - hibernate: - ddl-auto: none - show-sql: true - -logging: - level: - org.springframework.cloud: DEBUG \ No newline at end of file diff --git a/stats/stats-server/src/main/resources/schema-postgres.sql b/stats/stats-server/src/main/resources/schema-postgres.sql deleted file mode 100644 index 37cf885..0000000 --- a/stats/stats-server/src/main/resources/schema-postgres.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE TABLE IF NOT EXISTS stats ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - app VARCHAR(255) NOT NULL, - uri VARCHAR(512) NOT NULL, - ip VARCHAR(45) NOT NULL, - hit_timestamp TIMESTAMP WITHOUT TIME ZONE NOT NULL - ); - -CREATE INDEX IF NOT EXISTS idx_endpoint_hits_stats ON stats(hit_timestamp, uri, ip); \ No newline at end of file From cffd6b45977cee929040fca72c707ad0f9f5ce10 Mon Sep 17 00:00:00 2001 From: AleksOBM Date: Sun, 13 Sep 2026 05:49:19 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=203.=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- --- .test/Readme.md | 57 -------------------------------------- core/event-service/pom.xml | 13 +-------- pom.xml | 2 +- 3 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 .test/Readme.md diff --git a/.test/Readme.md b/.test/Readme.md deleted file mode 100644 index db5acb9..0000000 --- a/.test/Readme.md +++ /dev/null @@ -1,57 +0,0 @@ -# Тестер -## Скачать: [tester-0.0.1.jar](.github/workflows/stuff/tester-0.0.1.jar) - -## Пример запуска тестируем только коллектор, сохраняем отчёт в другой файл -`java -jar tester.jar --tester.execution.mode=COLLECTION --tester.execution.output.file-path=./report.txt` - -# Настройки генерации данных - -### Случайное количество уникальных пользователей, которое будет сгенерировано в указанном диапазоне. -tester.generation.user-count: 5 - 15 - -### Случайное количество различных мероприятий, которые будут сгенерированы в указанном диапазоне. -tester.generation.event-count: 10 - 20 - -### Лимит суммарного количества действий с мероприятиями то есть верхний лимит генерации действий для выбранного, с помощью настроек выше, случайного количества пользователей и мероприятий -tester.generation.actions-limit: 50 - 100 - -### Параметры временных меток генерируемых данных - -### Насколько «назад» во времени смещается первая метка (от текущего момента). -### Значение парсится в Duration так, что можно использовать разные обозначения -tester.generation.timestamp-settings.back: 3d - -### Минимальный интервал между последовательными метками. -tester.generation.timestamp-settings.increment-start: 1m - -### Максимальный интервал между последовательными метками. -tester.generation.timestamp-settings.increment-end: 10m - - -# Настройки выполнения тестов # - -### Режим проверки: -### - COLLECTION – только collector -### - AGGREGATION – collector + aggregator -### - ANALYZE – collector + aggregator + analyzer -tester.execution.mode: ANALYZE - -### Логировать сразу в консоль (т.е. помимо сохранения в отчет, который выводится только в конце работы) -tester.execution.immediate-logging.enabled: false - -## Настройки вывода результатов - -### Печатать сообщения уровня info (если false, то будут выводиться только ошибки). -tester.execution.output.info-enabled: true - -### Печатать TRACE‑сообщения. -tester.execution.output.trace-enabled: true - -### Выводить отчёт в консоль. -tester.execution.output.print: true - -### Сохранять отчёт в файл. -tester.execution.output.file: true - -### Путь к файлу отчёта. -tester.execution.output.file-path: "./execution-report.txt" \ No newline at end of file diff --git a/core/event-service/pom.xml b/core/event-service/pom.xml index 961b10f..a42f875 100644 --- a/core/event-service/pom.xml +++ b/core/event-service/pom.xml @@ -14,11 +14,6 @@ jar - - ru.practicum - stat-dto - 0.0.1-SNAPSHOT - ru.practicum aggregation-api @@ -26,7 +21,7 @@ ru.practicum - stat-client + stats-client 0.0.1-SNAPSHOT @@ -113,12 +108,6 @@ org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j - - ru.practicum - stats-client - 0.0.1-SNAPSHOT - compile - diff --git a/pom.xml b/pom.xml index 548fe23..86af283 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 1.12.0 3.25.5 - 5.0.1 + 5.1.2 From faa66123ca059a04e699183f7036c932e4029d5b Mon Sep 17 00:00:00 2001 From: AleksOBM Date: Sun, 13 Sep 2026 05:53:22 +0300 Subject: [PATCH 3/5] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=203.=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- --- core/request-service/pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/core/request-service/pom.xml b/core/request-service/pom.xml index da8cf1c..ffe50b7 100644 --- a/core/request-service/pom.xml +++ b/core/request-service/pom.xml @@ -20,7 +20,7 @@ ru.practicum - stat-client + stats-client 0.0.1-SNAPSHOT @@ -107,12 +107,6 @@ org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j - - ru.practicum - stats-client - 0.0.1-SNAPSHOT - compile - From b00e77a2bc1efda247398f96da2603de72296e70 Mon Sep 17 00:00:00 2001 From: AleksOBM Date: Sun, 13 Sep 2026 06:48:52 +0300 Subject: [PATCH 4/5] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=203.=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bugfix --- .../ewm/events/controller/user/UserEventController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserEventController.java b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserEventController.java index 94d07b3..c0e6665 100644 --- a/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserEventController.java +++ b/core/event-service/src/main/java/ru/practicum/ewm/events/controller/user/UserEventController.java @@ -60,8 +60,8 @@ public List findEventsByUserId( return eventService.findByUserId(userId, from, size); } - @GetMapping(value = "/{eventId}", headers = "X-EWM-USER-ID") - public EventFullDto findEventById(@RequestHeader("X-EWM-USER-ID") @Positive Long userId, + @GetMapping(value = "/{eventId}") + public EventFullDto findEventById(@PathVariable @Positive Long userId, @PathVariable @Positive Long eventId, @NonNull HttpServletRequest request) { log.info(""" From d91ebd1abc2cb7ce2d4a329ba723cee2ece9f521 Mon Sep 17 00:00:00 2001 From: AleksOBM Date: Mon, 14 Sep 2026 03:04:06 +0300 Subject: [PATCH 5/5] =?UTF-8?q?=D0=AD=D1=82=D0=B0=D0=BF=203.=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit readme --- .img/ewm-main-event-service.png | Bin 98100 -> 0 bytes .img/ewm-main-rating-service.png | Bin 19539 -> 0 bytes .img/ewm-main-request-service.png | Bin 25897 -> 0 bytes .img/ewm-main-user-service.png | Bin 19251 -> 0 bytes .img/ewm-stats-stats-server.png | Bin 25775 -> 0 bytes .img/external-api-2.png | Bin 88111 -> 0 bytes .img/external-api.png | Bin 139674 -> 0 bytes .img/internal-api.png | Bin 79652 -> 0 bytes .img/microservices.png | Bin 61731 -> 0 bytes .img/microservices.svg | 4 + .img/similarity.png | Bin 0 -> 236735 bytes .postman/ewm-main-service.json | 363 +++++----- .postman/ewm-rating-service.json | 1057 ----------------------------- .postman/ewm-stat-service.json | 1027 ---------------------------- readme.md | 203 +++++- 15 files changed, 351 insertions(+), 2303 deletions(-) delete mode 100644 .img/ewm-main-event-service.png delete mode 100644 .img/ewm-main-rating-service.png delete mode 100644 .img/ewm-main-request-service.png delete mode 100644 .img/ewm-main-user-service.png delete mode 100644 .img/ewm-stats-stats-server.png delete mode 100644 .img/external-api-2.png delete mode 100644 .img/external-api.png delete mode 100644 .img/internal-api.png delete mode 100644 .img/microservices.png create mode 100644 .img/microservices.svg create mode 100644 .img/similarity.png delete mode 100644 .postman/ewm-rating-service.json delete mode 100644 .postman/ewm-stat-service.json diff --git a/.img/ewm-main-event-service.png b/.img/ewm-main-event-service.png deleted file mode 100644 index a600c6f158f299b2d513fc40cfeca5dbbf49f58c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98100 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�E890eb5h6>Dn3MF8Ef@sslfQ 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 diff --git a/.img/ewm-main-rating-service.png b/.img/ewm-main-rating-service.png deleted file mode 100644 index f889525165df6d1b670bf2c8d77907bdae1ba0f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19539 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 Igmk_CAH&-1P5=M^ diff --git a/.img/ewm-main-request-service.png b/.img/ewm-main-request-service.png deleted file mode 100644 index d35f401c1bf77ad1375baffe5557d59ed69481f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25897 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

DnPb_4X3^oRgbj@6gr~ z?p4V7g&HMAqtXZNUpd=atvh~=aGCCVw1aN`AB(^yyY8qz?k;b;yQ{Q9(DAvYEDReTs?0v3~>V#(;_d diff --git a/.img/ewm-main-user-service.png b/.img/ewm-main-user-service.png deleted file mode 100644 index 2c4e1cd9aadfd7bb13ad20e276f4548746d6e220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19251 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 diff --git a/.img/external-api-2.png b/.img/external-api-2.png deleted file mode 100644 index 1c13636276bcdd8fbd855b52dbc205b171541732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88111 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 z 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 diff --git a/.img/internal-api.png b/.img/internal-api.png deleted file mode 100644 index 32ab3b5f10805dab3b81956b30707f7a35b7ef76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79652 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 diff --git a/.img/microservices.png b/.img/microservices.png deleted file mode 100644 index 7db5bf50c39ae7904a1742029f2b8c319f2a5323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61731 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

^%t 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 M+$C(OxyMic0p-P~U;qFB diff --git a/.img/microservices.svg b/.img/microservices.svg new file mode 100644 index 0000000..a7bd477 --- /dev/null +++ b/.img/microservices.svg @@ -0,0 +1,4 @@ +Kafkastats.user-actions.v1stats.events-similarity.v1AggregatorCollectorAnalyzerStatsPROTOBUFAVROCoreevent-serviceuser-serviceRESTgRPCgRPCgRPC AVROExploreWithMeewm-eventsewm-analyzerJDBCJDBCewm-requestsewm-usersREST FEIGNJDBCgateway-serverInfraconfig-serverdiscovery-serverrequest-serviceRESTREST ASYNCJDBCdockerewm-stats-dbewm-main-dbUserAPIgRPCPROTOBUFgRPCAVROgRPCAVROFrame \ No newline at end of file diff --git a/.img/similarity.png b/.img/similarity.png new file mode 100644 index 0000000000000000000000000000000000000000..7078c888ab714d72b38da3cc525659f129e28da2 GIT binary patch literal 236735 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 {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try {\r", - " const user = await api.addUser(rnd.getUser());\r", - " const category = await api.addCategory(rnd.getCategory());\r", - " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", - " event = await api.publishEvent(event.id);\r", - " await api.findEvent(event.id)\r", - " await api.findEvent(event.id)\r", - " pm.collectionVariables.set(\"eid\", event.id)\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " // выполняем наш скрипт\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", - " pm.response.to.be.ok; \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "\r", - "const target = pm.response.json();\r", - "\r", - "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, views, confirmedRequests, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r", - "pm.expect(target).to.have.property('id');\r", - "pm.expect(target).to.have.property('title');\r", - "pm.expect(target).to.have.property('annotation');\r", - "pm.expect(target).to.have.property('category');\r", - "pm.expect(target).to.have.property('paid');\r", - "pm.expect(target).to.have.property('eventDate');\r", - "pm.expect(target).to.have.property('initiator');\r", - "pm.expect(target).to.have.property('views');\r", - "pm.expect(target).to.have.property('confirmedRequests');\r", - "pm.expect(target).to.have.property('description');\r", - "pm.expect(target).to.have.property('participantLimit');\r", - "pm.expect(target).to.have.property('state');\r", - "pm.expect(target).to.have.property('createdOn');\r", - "pm.expect(target).to.have.property('publishedOn');\r", - "pm.expect(target).to.have.property('location');\r", - "pm.expect(target).to.have.property('requestModeration');\r", - "});\r", - "\r", - "pm.test(\"Значение поля views должно увеличится на 1 после выполнения GET запроса с уникального IP к событию\", function () {\r", - " pm.expect(target.views).equal(1);\r", - " \r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/events/:id", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "events", - ":id" - ], - "variable": [ - { - "key": "id", - "value": "{{eid}}", - "description": "(Required) id события" - } - ] - }, - "description": "Обратите внимание:\n- событие должно быть опубликовано\n- информация о событии должна включать в себя количество просмотров и количество подтвержденных запросов\n- информацию о том, что по этому эндпоинту был осуществлен и обработан запрос, нужно сохранить в сервисе статистики" - }, - "response": [] - }, { "name": "Добавление запроса на участие при participantLimit == 0", "event": [ @@ -6711,7 +6602,7 @@ " let user;\r", " try {\r", " user = rnd.getUser();\r", - " user.email = rnd.getWord(1) + '@a.ru';\r", + " user.email = rnd.getWord(15) + '@a.ru';\r", " } catch(err) {\r", " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", " }\r", @@ -6738,7 +6629,8 @@ " 100 \r", ");" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } }, { @@ -6752,7 +6644,8 @@ "});\r", "" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } } ], @@ -10856,7 +10749,7 @@ " pm.request.body.update({\r", " mode: 'raw',\r", " raw: JSON.stringify({\r", - " eventDate : rnd.getFutureDateTime(6)\r", + " eventDate : \"2124-10-11 23:10:05\"\r", " }),\r", " options: { raw: { language: 'json' } }\r", " });\r", @@ -11297,6 +11190,42 @@ { "name": "Получение категорий", "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", + " pm.response.to.be.ok; \r", + " pm.response.to.be.withBody;\r", + " pm.response.to.be.json;\r", + "});\r", + "\r", + "const source = pm.collectionVariables.get('response');\r", + "const target = pm.response.json();\r", + "let founded;\r", + "target.forEach(function(element){\r", + " if (element.id == source.id) founded = element\r", + "});\r", + "\r", + "pm.test(\"Категория должна содержать поля: id, name\", function () {\r", + " pm.expect(target[0]).to.have.property('id');\r", + " pm.expect(target[0]).to.have.property('name');\r", + "});\r", + "\r", + "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", + " if (founded) {\r", + " pm.expect(source.id).equal(founded.id, 'Идентификатор категории должен соответствовать идентификатору категории добавленной ранее');\r", + " pm.expect(source.name).equal(founded.name, 'Название категории должно соответствовать названию категории добавленной ранее');\r", + " } else {\r", + " pm.expect.fail(\"No matching category found in the response\");\r", + " }\r", + "});\r", + "" + ], + "type": "text/javascript", + "packages": {} + } + }, { "listen": "prerequest", "script": { @@ -11328,35 +11257,8 @@ " 100 \r", ");" ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", - " pm.response.to.be.ok; \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const source = pm.collectionVariables.get('response');\r", - "const target = pm.response.json();\r", - "let founded;\r", - "target.forEach(function(element){if (element.id == source.id) founded = element});\r", - "\r", - "pm.test(\"Категория должна содержать поля: id, name\", function () {\r", - "pm.expect(target[0]).to.have.property('id');\r", - "pm.expect(target[0]).to.have.property('name');\r", - "});\r", - "\r", - "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", - " pm.expect(source.id).equal(founded.id, 'Идентификатор категории должен соответствовать идентификатору категории добавленной ранее');\r", - " pm.expect(source.name).equal(founded.name, 'Название категории должно соответствовать названию категории добавленной ранее');\r", - "});" - ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } } ], @@ -12317,7 +12219,7 @@ "const source = pm.collectionVariables.get('response');\r", "const target = pm.response.json()[0];\r", "\r", - "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, views, confirmedRequests, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r", + "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, confirmedRequests, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r", "pm.expect(target).to.have.property('id');\r", "pm.expect(target).to.have.property('title');\r", "pm.expect(target).to.have.property('annotation');\r", @@ -12325,7 +12227,6 @@ "pm.expect(target).to.have.property('paid');\r", "pm.expect(target).to.have.property('eventDate');\r", "pm.expect(target).to.have.property('initiator');\r", - "pm.expect(target).to.have.property('views');\r", "pm.expect(target).to.have.property('confirmedRequests');\r", "pm.expect(target).to.have.property('description');\r", "pm.expect(target).to.have.property('participantLimit');\r", @@ -12569,7 +12470,7 @@ "const source = pm.collectionVariables.get('response');\r", "const target = pm.response.json()[0];\r", "\r", - "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, views, confirmedRequests\", function () {\r", + "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, confirmedRequests\", function () {\r", "pm.expect(target).to.have.property('id');\r", "pm.expect(target).to.have.property('title');\r", "pm.expect(target).to.have.property('annotation');\r", @@ -12577,7 +12478,6 @@ "pm.expect(target).to.have.property('paid');\r", "pm.expect(target).to.have.property('eventDate');\r", "pm.expect(target).to.have.property('initiator');\r", - "pm.expect(target).to.have.property('views');\r", "pm.expect(target).to.have.property('confirmedRequests');\r", "});\r", "\r", @@ -12677,6 +12577,7 @@ " const category = await api.addCategory(rnd.getCategory());\r", " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", " event = await api.publishEvent(event.id);\r", + " pm.collectionVariables.set(\"userId\", user.id);\r", " pm.collectionVariables.set(\"eid\", event.id)\r", " pm.collectionVariables.set('response', event);\r", " } catch(err) {\r", @@ -12716,7 +12617,7 @@ "const source = pm.collectionVariables.get('response');\r", "const target = pm.response.json();\r", "\r", - "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, views, confirmedRequests, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r", + "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, initiator, confirmedRequests, description, participantLimit, state, createdOn, publishedOn, location, requestModeration\", function () {\r", "pm.expect(target).to.have.property('id');\r", "pm.expect(target).to.have.property('title');\r", "pm.expect(target).to.have.property('annotation');\r", @@ -12724,7 +12625,6 @@ "pm.expect(target).to.have.property('paid');\r", "pm.expect(target).to.have.property('eventDate');\r", "pm.expect(target).to.have.property('initiator');\r", - "pm.expect(target).to.have.property('views');\r", "pm.expect(target).to.have.property('confirmedRequests');\r", "pm.expect(target).to.have.property('description');\r", "pm.expect(target).to.have.property('participantLimit');\r", @@ -12752,6 +12652,11 @@ "request": { "method": "GET", "header": [ + { + "key": "X-EWM-USER-ID", + "value": "{{userId}}", + "type": "text" + }, { "key": "Accept", "value": "application/json" @@ -12933,7 +12838,8 @@ " 100 \r", ");" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } }, { @@ -12958,13 +12864,18 @@ "});\r", "\r", "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", + " const sourceCreated = new Date(source.created);\r", + " const targetCreated = new Date(target.created);\r", " pm.expect(source.id).equal(target.id, 'Идентификатор запроса на участие в событии должен соответствовать идентификатору запроса, созданного ранее');\r", " pm.expect(source.requester).equal(target.requester, 'Пользователя, запрашивающий доступ на участие в событии, должен соответствовать указанному пользователю');\r", " pm.expect(source.event).equal(target.event, 'Событие, доступ к которому запрашивает пользователь, должно соответствовать событию, доступ к которому пользователь запрашивал доступ ранее');\r", - " pm.expect(source.created).equal(target.created, 'Время создания запроса на участие в событии должно соответствовать времени создания запроса, созданного ранее указанным пользователем');\r", + " pm.test('Время создания запроса на участие в событии должно соответствовать времени создания запроса, созданного ранее указанным пользователем', function () {\r", + " pm.expect(sourceCreated.getTime()).to.equal(targetCreated.getTime(), 'Времена не совпадают');\r", + "});\r", "});" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } } ], @@ -13042,7 +12953,8 @@ " 100 \r", ");" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } }, { @@ -13067,13 +12979,18 @@ "});\r", "\r", "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", + " const sourceCreated = new Date(source.created);\r", + " const targetCreated = new Date(target.created);\r", " pm.expect(source.id).equal(target.id, 'Идентификатор запроса на участие в событии должен соответствовать идентификатору запроса на участие в событии указанного пользователя');\r", " pm.expect(source.requester).equal(target.requester, 'Автор запроса на участие в событии должен соответствовать указанному пользователю');\r", " pm.expect(source.event).equal(target.event, 'Событие в ответе должно соответствовать событию с запросом на участие от указанного пользователя');\r", - " pm.expect(source.created).equal(target.created, 'Время создания запроса на участие в событии должно соответствовать времени создания запроса на участие в событии указанного пользователя');\r", + " pm.test('Время создания запроса на участие в событии должно соответствовать времени создания запроса на участие в событии указанного пользователя', function () {\r", + " pm.expect(sourceCreated.getTime()).to.equal(targetCreated.getTime(), 'Времена не совпадают');\r", + "});\r", "});" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } } ], @@ -13430,7 +13347,8 @@ " 100 \r", ");" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } }, { @@ -13460,13 +13378,18 @@ "});\r", "\r", "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", + " const sourceCreated = new Date(source.created);\r", + " const targetCreated = new Date(target.created);\r", " pm.expect(source.id).equal(target.id, 'Идентификатор отменённого запроса на участие в событии должен соответствовать идентификатору запроса до отмены');\r", " pm.expect(source.requester).equal(target.requester, 'Пользователь, отменяющий запрос на участие в событии, должен соответствовать текущему пользователю');\r", " pm.expect(source.event).equal(target.event, 'Событие отменённого запроса на участие должно соответствовать запросу на участие в событии до отмены');\r", - " pm.expect(source.created).equal(target.created, 'Дата создания отменённого запроса на участие в событии должна соответствовать дате создания запроса до отмены');\r", + " pm.test('Дата создания отменённого запроса на участие в событии должна соответствовать дате создания запроса до отмены', function () {\r", + " pm.expect(sourceCreated.getTime()).to.equal(targetCreated.getTime(), 'Время не совпадает');\r", + "});\r", "});" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } } ], @@ -13556,7 +13479,8 @@ " 100 \r", ");" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } }, { @@ -13581,10 +13505,14 @@ "});\r", "\r", "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", + " const sourceCreated = new Date(source.created);\r", + " const targetCreated = new Date(target.created);\r", " pm.expect(source.id).equal(target.id, 'Идентификатор запроса на участие в событии должен соответствовать идентификатору запроса на участие в событии указанного пользователя');\r", " pm.expect(source.requester).equal(target.requester, 'Пользователь, запрашивающий доступ на участие в событии должен пользователю, отправившему запрос на участие в событии указанного пользователя ранее');\r", " pm.expect(source.event).equal(target.event, 'Событие, запрос на участие в котором надо подтвердить, должно соответствовать событию указанного пользователя');\r", - " pm.expect(source.created).equal(target.created, 'Время создания запроса на участие в событии после подтверждения должно соответствовать времени создания запроса на участие в событии указанного пользователя до подтверждения');\r", + " pm.test('Время создания запроса на участие в событии после подтверждения должно соответствовать времени создания запроса на участие в событии указанного пользователя до подтверждения', function () {\r", + " pm.expect(sourceCreated.getTime()).to.equal(targetCreated.getTime(), 'Время не совпадают');\r", + "});\r", "});\r", "\r", "pm.test(\"Запрос на участие должен иметь статус PENDING при создании и статус REJECTED после выполнения запроса\", function () {\r", @@ -13592,7 +13520,8 @@ " pm.expect(target.status).equal(\"REJECTED\");\r", "});" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } } ], @@ -13696,7 +13625,8 @@ " 100 \r", ");" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } }, { @@ -13721,10 +13651,14 @@ "});\r", "\r", "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", + " const sourceCreated = new Date(source.created);\r", + " const targetCreated = new Date(target.created);\r", " pm.expect(source.id).equal(target.id, 'Идентификатор запроса на участие в событии должен соответствовать идентификатору запроса на участие в событии указанного пользователя');\r", " pm.expect(source.requester).equal(target.requester, 'Пользователь, запрашивающий доступ на участие в событии должен пользователю, отправившему запрос на участие в событии указанного пользователя ранее');\r", " pm.expect(source.event).equal(target.event, 'Событие, запрос на участие в котором надо подтвердить, должно соответствовать событию указанного пользователя');\r", - " pm.expect(source.created).equal(target.created, 'Время создания запроса на участие в событии после подтверждения должно соответствовать времени создания запроса на участие в событии указанного пользователя до подтверждения');\r", + " pm.test('Время создания запроса на участие в событии после подтверждения должно соответствовать времени создания запроса на участие в событии указанного пользователя до подтверждения', function () {\r", + " pm.expect(sourceCreated.getTime()).to.equal(targetCreated.getTime(), 'Времена не совпадают');\r", + "});\r", "});\r", "\r", "pm.test(\"Запрос на участие должен иметь статус PENDING при создании и статус CONFIRMED после выполнения запроса\", function () {\r", @@ -13732,7 +13666,8 @@ " pm.expect(target.status).equal(\"CONFIRMED\");\r", "});" ], - "type": "text/javascript" + "type": "text/javascript", + "packages": {} } } ], @@ -14351,79 +14286,99 @@ " }", "", " async addUser(user, verbose=null) {", - " return this.post(\"/admin/users\", user, \"Ошибка при добавлении нового пользователя: \", verbose);", + " return this.post(\"/admin/users\", user, 0, \"Ошибка при добавлении нового пользователя: \", verbose);", " }", "", " async addCategory(category, verbose=null) {", - " return this.post(\"/admin/categories\", category, \"Ошибка при добавлении новой категории: \", verbose);", + " return this.post(\"/admin/categories\", category, 0, \"Ошибка при добавлении новой категории: \", verbose);", " }", "", " async addEvent(userId, event, verbose=null) {", - " return this.post(\"/users/\" + userId + \"/events\", event, \"Ошибка при добавлении нового события: \", verbose);", + " return this.post(\"/users/\" + userId + \"/events\", event, 0, \"Ошибка при добавлении нового события: \", verbose);", " }", "", " async addCompilation(compilation, verbose=null) {", - " return this.post(\"/admin/compilations\", compilation, \"Ошибка при добавлении новой подборки: \", verbose);", + " return this.post(\"/admin/compilations\", compilation, 0, \"Ошибка при добавлении новой подборки: \", verbose);", " }", "", " async publishParticipationRequest(eventId, userId, verbose=null) {", - " return this.post('/users/' + userId + '/requests?eventId=' + eventId, null, \"Ошибка при добавлении нового запроса на участие в событии\", verbose);", + " return this.post('/users/' + userId + '/requests?eventId=' + eventId, null, 0, \"Ошибка при добавлении нового запроса на участие в событии\", verbose);", " }", "", " async publishEvent(eventId, verbose=null) {", - " return this.patch('/admin/events/' + eventId, {stateAction: \"PUBLISH_EVENT\"}, \"Ошибка при публикации события\", verbose);", + " return this.patch('/admin/events/' + eventId, {stateAction: \"PUBLISH_EVENT\"}, 0, \"Ошибка при публикации события\", verbose);", " }", " ", " async rejectEvent(eventId, verbose=null) {", - " return this.patch('/admin/events/' + eventId, {stateAction: \"REJECT_EVENT\"}, \"Ошибка при отмене события\", verbose);", + " return this.patch('/admin/events/' + eventId, {stateAction: \"REJECT_EVENT\"}, 0, \"Ошибка при отмене события\", verbose);", " }", "", " async acceptParticipationRequest(eventId, userId, reqId, verbose=null) {", - " return this.patch('/users/' + userId + '/events/' + eventId + '/requests', {requestIds:[reqId], status: \"CONFIRMED\"}, \"Ошибка при принятии заявки на участие в событии\", verbose);", + " return this.patch('/users/' + userId + '/events/' + eventId + '/requests', {requestIds:[reqId], status: \"CONFIRMED\"}, 0, \"Ошибка при принятии заявки на участие в событии\", verbose);", " }", "", " async findCategory(catId, verbose=null) {", - " return this.get('/categories/' + catId, null, \"Ошибка при поиске категории по id\", verbose);", + " return this.get('/categories/' + catId, null, 0, \"Ошибка при поиске категории по id\", verbose);", " }", "", " async findCompilation(compId, verbose=null) {", - " return this.get('/compilations/' + compId, null, \"Ошибка при поиске подборки по id\", verbose);", + " return this.get('/compilations/' + compId, null, 0, \"Ошибка при поиске подборки по id\", verbose);", " }", "", - " async findEvent(eventId, verbose=null) {", - " return this.get('/events/' + eventId, null, \"Ошибка при поиске события по id\", verbose);", + " async findEvent(eventId, id=0, verbose=null) {", + " return this.get('/events/' + eventId, null, id, \"Ошибка при поиске события по id\", verbose);", " }", "", " async findUser(userId, verbose=null) {", - " return this.get('/admin/users?ids=' + userId, null, \"Ошибка при поиске пользователя по id\", verbose);", + " return this.get('/admin/users?ids=' + userId, null, 0, \"Ошибка при поиске пользователя по id\", verbose);", " }", "", - " async post(path, body, errorText = \"Ошибка при выполнении post-запроса: \", verbose=null) {", - " return this.sendRequest(\"POST\", path, body, errorText, verbose);", + " async post(path, body, id=0, errorText = \"Ошибка при выполнении post-запроса: \", verbose=null) {", + " return this.sendRequest(\"POST\", path, body, id, errorText, verbose);", " }", "", - " async patch(path, body = null, errorText = \"Ошибка при выполнении patch-запроса: \", verbose=null) {", - " return this.sendRequest(\"PATCH\", path, body, errorText, verbose);", + " async patch(path, body = null, id=0, errorText = \"Ошибка при выполнении patch-запроса: \", verbose=null) {", + " return this.sendRequest(\"PATCH\", path, body, id, errorText, verbose);", " }", "", - " async get(path, body = null, errorText = \"Ошибка при выполнении get-запроса: \", verbose=null) {", - " return this.sendRequest(\"GET\", path, body, errorText, verbose);", + " async get(path, body = null, id=0, errorText = \"Ошибка при выполнении get-запроса: \", verbose=null) {", + " return this.sendRequest(\"GET\", path, body, id, errorText, verbose);", " }", - " async sendRequest(method, path, body=null, errorText = \"Ошибка при выполнении запроса: \", verbose=null) {", + " async sendRequest(method, path, body=null, id=0, errorText = \"Ошибка при выполнении запроса: \", verbose=null) {", " return new Promise((resolve, reject) => {", " verbose = verbose == null ? this._verbose : verbose;", - " const request = {", - " url: this.baseUrl + path,", - " method: method,", - " body: body == null ? \"\" : JSON.stringify(body),", - " header: { \"Content-Type\": \"application/json\" },", - " };", + " var req = {};", + " if (id == 0){", + " req = {", + " url: this.baseUrl + path,", + " method: method,", + " body: body == null ? \"\" : JSON.stringify(body),", + " header: { \"Content-Type\": \"application/json\"},", + " };", + " }else{", + " req = {", + " url: this.baseUrl + path,", + " method: method,", + " body: body == null ? \"\" : JSON.stringify(body),", + " header: [{", + " \"key\": \"X-Sharer-User-Id\",", + " \"value\": id,", + " \"type\": \"text\",", + " },", + " {", + " \"key\": \"Content-Type\",", + " \"name\": \"Content-Type\",", + " \"value\": \"application/json\",", + " \"type\": \"text\"", + " }]", + " };", + " }", " if(verbose) {", - " console.log(\"Отправляю запрос: \", request);", + " console.log(\"Отправляю запрос: \", req);", " }", "", " try {", - " this.pm.sendRequest(request, (error, response) => {", + " this.pm.sendRequest(req, (error, response) => {", " if(error || (response.code >= 400 && response.code <= 599)) {", " let err = error ? error : JSON.stringify(response.json());", " console.error(\"При выполнении запроса к серверу возникла ошика.\\n\", err,", @@ -14625,6 +14580,10 @@ { "key": "source", "value": "" + }, + { + "key": "userId", + "value": "" } ] -} +} \ No newline at end of file diff --git a/.postman/ewm-rating-service.json b/.postman/ewm-rating-service.json deleted file mode 100644 index 459a353..0000000 --- a/.postman/ewm-rating-service.json +++ /dev/null @@ -1,1057 +0,0 @@ -{ - "info": { - "_postman_id": "3f1bf201-4169-477e-89f3-801890a0f950", - "name": "feature_rating_events", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "50204807", - "_collection_link": "https://aleksobm-7059599.postman.co/workspace/Team's-Workspace~91ebb0d8-1476-4e40-85ec-9b22813a2ce5/collection/50204807-3f1bf201-4169-477e-89f3-801890a0f950?action=share&source=collection_link&creator=50204807" - }, - "item": [ - { - "name": "Поставить лайк событию", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try {\r", - " const initiator = await api.addUser(rnd.getUser());\r", - "\r", - " const category = await api.addCategory(rnd.getCategory());\r", - "\r", - " let event = await api.addEvent(initiator.id, rnd.getEvent(category.id));\r", - " pm.collectionVariables.set(\"eid\", event.id);\r", - "\r", - " event = await api.publishEvent(event.id);\r", - "\r", - " const user = await api.addUser(rnd.getUser());\r", - " pm.collectionVariables.set(\"uid\", user.id);\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r", - " pm.response.to.have.status(201); \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const source = JSON.parse(pm.request.body.raw);\r", - "const target = pm.response.json();\r", - "\r", - "pm.test(\"Ответ должен содержать поля: id, userId, eventId, reaction\", function () {\r", - " pm.expect(target).to.have.property('id');\r", - " pm.expect(target).to.have.property('userId');\r", - " pm.expect(target).to.have.property('eventId');\r", - " pm.expect(target).to.have.property('reaction');\r", - "});\r", - "\r", - "pm.test(\"Проверка данных в полях ответа\", function () {\r", - " pm.expect(target.id).to.not.be.null;\r", - " pm.expect(target.userId).to.equal(pm.collectionVariables.get('uid'));\r", - " pm.expect(target.eventId).to.equal(pm.collectionVariables.get('eid'));\r", - " pm.expect(target.reaction).to.equal('LIKE');\r", - "});" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Accept", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"reaction\" : \"LIKE\"\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/users/:userId/events/:eventId/likes", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "users", - ":userId", - "events", - ":eventId", - "likes" - ], - "variable": [ - { - "key": "userId", - "value": "{{uid}}", - "description": "(Required) id текущего пользователя" - }, - { - "key": "eventId", - "value": "{{eid}}", - "description": "(Required) id текущего события" - } - ] - }, - "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента" - }, - "response": [] - }, - { - "name": "Поставить дизлайк событию", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try {\r", - " const initiator = await api.addUser(rnd.getUser());\r", - "\r", - " const category = await api.addCategory(rnd.getCategory());\r", - "\r", - " let event = await api.addEvent(initiator.id, rnd.getEvent(category.id));\r", - " pm.collectionVariables.set(\"eid\", event.id);\r", - "\r", - " event = await api.publishEvent(event.id);\r", - "\r", - " const user = await api.addUser(rnd.getUser());\r", - " pm.collectionVariables.set(\"uid\", user.id);\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r", - " pm.response.to.have.status(201); \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const source = JSON.parse(pm.request.body.raw);\r", - "const target = pm.response.json();\r", - "\r", - "pm.test(\"Ответ должен содержать поля: id, userId, eventId, reaction\", function () {\r", - " pm.expect(target).to.have.property('id');\r", - " pm.expect(target).to.have.property('userId');\r", - " pm.expect(target).to.have.property('eventId');\r", - " pm.expect(target).to.have.property('reaction');\r", - "});\r", - "\r", - "pm.test(\"Проверка данных в полях ответа\", function () {\r", - " pm.expect(target.id).to.not.be.null;\r", - " pm.expect(target.userId).to.equal(pm.collectionVariables.get('uid'));\r", - " pm.expect(target.eventId).to.equal(pm.collectionVariables.get('eid'));\r", - " pm.expect(target.reaction).to.equal('DISLIKE');\r", - "});" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Accept", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"reaction\" : \"DISLIKE\"\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/users/:userId/events/:eventId/likes", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "users", - ":userId", - "events", - ":eventId", - "likes" - ], - "variable": [ - { - "key": "userId", - "value": "{{uid}}", - "description": "(Required) id текущего пользователя" - }, - { - "key": "eventId", - "value": "{{eid}}", - "description": "(Required) id текущего события" - } - ] - }, - "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента" - }, - "response": [] - }, - { - "name": "Получение события после добавления лайка", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try {\r", - " const initiator = await api.addUser(rnd.getUser());\r", - " pm.collectionVariables.set(\"uid\", initiator.id)\r", - "\r", - " const category = await api.addCategory(rnd.getCategory());\r", - "\r", - " let event = await api.addEvent(initiator.id, rnd.getEvent(category.id));\r", - " pm.collectionVariables.set(\"eid\", event.id);\r", - "\r", - " event = await api.publishEvent(event.id);\r", - " \r", - " const user = await api.addUser(rnd.getUser());\r", - " const like = await api.addLike(user.id, event.id);\r", - "\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", - " pm.response.to.be.ok; \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const target = pm.response.json();\r", - "\r", - "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, 'initiator', 'location', 'confirmedRequests', 'requestModeration', 'publishedOn', 'state', 'views', 'rate'\", function () {\r", - " pm.expect(target).to.contain.keys('id', 'title', 'annotation', 'category', 'paid', 'eventDate', 'initiator', 'location', 'confirmedRequests', 'requestModeration', 'publishedOn', 'state', 'views', 'rate');\r", - "});\r", - "\r", - "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", - " pm.expect(target.id).to.not.be.null;\r", - "});\r", - "\r", - "pm.test(\"Поле rate должно быть равно 1\", function () {\r", - " pm.expect(target.rate).to.equal(1);\r", - "});" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/users/:userId/events/:eventId", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "users", - ":userId", - "events", - ":eventId" - ], - "variable": [ - { - "key": "userId", - "value": "{{uid}}", - "description": "(Required) id текущего пользователя" - }, - { - "key": "eventId", - "value": "{{eid}}", - "description": "(Required) id текущего события" - } - ] - } - }, - "response": [] - }, - { - "name": "Получение события после добавления дизлайка", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try {\r", - " const initiator = await api.addUser(rnd.getUser());\r", - " pm.collectionVariables.set(\"uid\", initiator.id)\r", - "\r", - " const category = await api.addCategory(rnd.getCategory());\r", - "\r", - " let event = await api.addEvent(initiator.id, rnd.getEvent(category.id));\r", - " pm.collectionVariables.set(\"eid\", event.id);\r", - "\r", - " event = await api.publishEvent(event.id);\r", - " \r", - " const user = await api.addUser(rnd.getUser());\r", - " const dislike = await api.addDislike(user.id, event.id);\r", - "\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", - " pm.response.to.be.ok; \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const target = pm.response.json();\r", - "\r", - "pm.test(\"Событие должно содержать поля: id, title, annotation, category, paid, eventDate, 'initiator', 'location', 'confirmedRequests', 'requestModeration', 'publishedOn', 'state', 'views', 'rate'\", function () {\r", - " pm.expect(target).to.contain.keys('id', 'title', 'annotation', 'category', 'paid', 'eventDate', 'initiator', 'location', 'confirmedRequests', 'requestModeration', 'publishedOn', 'state', 'views', 'rate');\r", - "});\r", - "\r", - "pm.test(\"Данные в ответе должны соответствовать данным в запросе\", function () {\r", - " pm.expect(target.id).to.not.be.null;\r", - "});\r", - "\r", - "pm.test(\"Поле rate должно быть равно -1\", function () {\r", - " pm.expect(target.rate).to.equal(-1);\r", - "});" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/users/:userId/events/:eventId", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "users", - ":userId", - "events", - ":eventId" - ], - "variable": [ - { - "key": "userId", - "value": "{{uid}}", - "description": "(Required) id текущего пользователя" - }, - { - "key": "eventId", - "value": "{{eid}}", - "description": "(Required) id текущего события" - } - ] - } - }, - "response": [] - }, - { - "name": "Удаление лайка", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try {\r", - " const initiator = await api.addUser(rnd.getUser());\r", - "\r", - " const category = await api.addCategory(rnd.getCategory());\r", - "\r", - " let event = await api.addEvent(initiator.id, rnd.getEvent(category.id));\r", - " pm.collectionVariables.set(\"eid\", event.id);\r", - "\r", - " event = await api.publishEvent(event.id);\r", - "\r", - " const user = await api.addUser(rnd.getUser());\r", - " pm.collectionVariables.set('uid', user.id);\r", - "\r", - " await api.addLike(user.id, event.id);\r", - " const likedEvent = await api.findEvent(event.id);\r", - " if (likedEvent.rate !== 1) {\r", - " throw \"Ошибка: Ожидается, что лайк увеличит рейтинг события до 1, но фактически рейтинг не изменился.\"\r", - " }\r", - "\r", - " } catch (err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => { }, 1000);\r", - "\r", - "setTimeout(async () => {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - "},\r", - " 100\r", - ");" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", - " pm.response.to.be.success;\r", - "});\r", - "\r", - "\r", - "\r", - "\r", - "" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - } - ], - "request": { - "method": "DELETE", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/users/:userId/events/:eventId/likes", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "users", - ":userId", - "events", - ":eventId", - "likes" - ], - "variable": [ - { - "key": "userId", - "value": "{{uid}}", - "description": "(Required) id текущего пользователя" - }, - { - "key": "eventId", - "value": "{{eid}}", - "description": "(Required) id текущего события" - } - ] - } - }, - "response": [] - }, - { - "name": "Попытка поставить лайк своему событию", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try {\r", - " const initiator = await api.addUser(rnd.getUser());\r", - " pm.collectionVariables.set(\"uid\", initiator.id);\r", - "\r", - " const category = await api.addCategory(rnd.getCategory());\r", - "\r", - " let event = await api.addEvent(initiator.id, rnd.getEvent(category.id));\r", - " pm.collectionVariables.set(\"eid\", event.id);\r", - "\r", - " event = await api.publishEvent(event.id);\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 409 и данные в формате json\", function () {\r", - " pm.response.to.have.status(400);\r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Accept", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"reaction\" : \"LIKE\"\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/users/:userId/events/:eventId/likes", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "users", - ":userId", - "events", - ":eventId", - "likes" - ], - "variable": [ - { - "key": "userId", - "value": "{{uid}}", - "description": "(Required) id текущего пользователя" - }, - { - "key": "eventId", - "value": "{{eid}}", - "description": "(Required) id текущего события" - } - ] - }, - "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента" - }, - "response": [] - }, - { - "name": "Попытка поставить лайк не опубликованному событию", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try {\r", - " const initiator = await api.addUser(rnd.getUser());\r", - "\r", - " const category = await api.addCategory(rnd.getCategory());\r", - "\r", - " let event = await api.addEvent(initiator.id, rnd.getEvent(category.id));\r", - " pm.collectionVariables.set(\"eid\", event.id);\r", - "\r", - " const user = await api.addUser(rnd.getUser());\r", - " pm.collectionVariables.set(\"uid\", user.id);\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 404 и данные в формате json\", function () {\r", - " pm.response.to.have.status(404);\r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});" - ], - "type": "text/javascript", - "packages": {}, - "requests": {} - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - }, - { - "key": "Accept", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "{\n \"reaction\" : \"LIKE\"\n}", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/users/:userId/events/:eventId/likes", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "users", - ":userId", - "events", - ":eventId", - "likes" - ], - "variable": [ - { - "key": "userId", - "value": "{{uid}}", - "description": "(Required) id текущего пользователя" - }, - { - "key": "eventId", - "value": "{{eid}}", - "description": "(Required) id текущего события" - } - ] - }, - "description": "Обратите внимание: дата и время на которые намечено событие не может быть раньше, чем через два часа от текущего момента" - }, - "response": [] - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "packages": {}, - "requests": {}, - "exec": [ - "API = class {", - " constructor(postman, verbose = false, baseUrl = \"http://localhost:8080\") {", - " this.baseUrl = baseUrl;", - " this.pm = postman;", - " this._verbose = verbose;", - " }", - "", - " async addLike(userId, eventId, verbose=null) {", - " let reaction = {\"reaction\" : \"LIKE\"};", - " return this.post(\"/users/\" + userId + \"/events/\" + eventId + \"/likes\", reaction, \"Ошибка при добавлении лайка: \", verbose)", - " }", - "", - " async addDislike(userId, eventId, verbose=null) {", - " let reaction = {\"reaction\" : \"DISLIKE\"};", - " return this.post(\"/users/\" + userId + \"/events/\" + eventId + \"/likes\", reaction, \"Ошибка при добавлении лайка: \", verbose)", - " }", - "", - " async addUser(user, verbose=null) {", - " return this.post(\"/admin/users\", user, \"Ошибка при добавлении нового пользователя: \", verbose);", - " }", - "", - " async addCategory(category, verbose=null) {", - " return this.post(\"/admin/categories\", category, \"Ошибка при добавлении новой категории: \", verbose);", - " }", - "", - " async addEvent(userId, event, verbose=null) {", - " return this.post(\"/users/\" + userId + \"/events\", event, \"Ошибка при добавлении нового события: \", verbose);", - " }", - "", - " async addCompilation(compilation, verbose=null) {", - " return this.post(\"/admin/compilations\", compilation, \"Ошибка при добавлении новой подборки: \", verbose);", - " }", - "", - " async publishParticipationRequest(eventId, userId, verbose=null) {", - " return this.post('/users/' + userId + '/requests?eventId=' + eventId, null, \"Ошибка при добавлении нового запроса на участие в событии\", verbose);", - " }", - "", - " async publishEvent(eventId, verbose=null) {", - " return this.patch('/admin/events/' + eventId, {stateAction: \"PUBLISH_EVENT\"}, \"Ошибка при публикации события\", verbose);", - " }", - " ", - " async rejectEvent(eventId, verbose=null) {", - " return this.patch('/admin/events/' + eventId, {stateAction: \"REJECT_EVENT\"}, \"Ошибка при отмене события\", verbose);", - " }", - "", - " async acceptParticipationRequest(eventId, userId, reqId, verbose=null) {", - " return this.patch('/users/' + userId + '/events/' + eventId + '/requests', {requestIds:[reqId], status: \"CONFIRMED\"}, \"Ошибка при принятии заявки на участие в событии\", verbose);", - " }", - "", - " async findCategory(catId, verbose=null) {", - " return this.get('/categories/' + catId, null, \"Ошибка при поиске категории по id\", verbose);", - " }", - "", - " async findCompilation(compId, verbose=null) {", - " return this.get('/compilations/' + compId, null, \"Ошибка при поиске подборки по id\", verbose);", - " }", - "", - " async findEvent(eventId, verbose=null) {", - " return this.get('/events/' + eventId, null, \"Ошибка при поиске события по id\", verbose);", - " }", - "", - " async findUser(userId, verbose=null) {", - " return this.get('/admin/users?ids=' + userId, null, \"Ошибка при поиске пользователя по id\", verbose);", - " }", - "", - " async post(path, body, errorText = \"Ошибка при выполнении post-запроса: \", verbose=null) {", - " return this.sendRequest(\"POST\", path, body, errorText, verbose);", - " }", - "", - " async patch(path, body = null, errorText = \"Ошибка при выполнении patch-запроса: \", verbose=null) {", - " return this.sendRequest(\"PATCH\", path, body, errorText, verbose);", - " }", - "", - " async get(path, body = null, errorText = \"Ошибка при выполнении get-запроса: \", verbose=null) {", - " return this.sendRequest(\"GET\", path, body, errorText, verbose);", - " }", - " async sendRequest(method, path, body=null, errorText = \"Ошибка при выполнении запроса: \", verbose=null) {", - " return new Promise((resolve, reject) => {", - " verbose = verbose == null ? this._verbose : verbose;", - " const request = {", - " url: this.baseUrl + path,", - " method: method,", - " body: body == null ? \"\" : JSON.stringify(body),", - " header: { \"Content-Type\": \"application/json\" },", - " };", - " if(verbose) {", - " console.log(\"Отправляю запрос: \", request);", - " }", - "", - " try {", - " this.pm.sendRequest(request, (error, response) => {", - " if(error || (response.code >= 400 && response.code <= 599)) {", - " let err = error ? error : JSON.stringify(response.json());", - " console.error(\"При выполнении запроса к серверу возникла ошика.\\n\", err,", - " \"\\nДля отладки проблемы повторите такой же запрос к вашей программе \" + ", - " \"на локальном компьютере. Данные запроса:\\n\", JSON.stringify(request));", - "", - " reject(new Error(errorText + err));", - " }", - " if(verbose) {", - " console.log(\"Результат обработки запроса: код состояния - \", response.code, \", тело: \", response.json());", - " }", - " if (response.stream.length === 0){", - " reject(new Error('Отправлено пустое тело ответа'))", - " }else{", - " resolve(response.json());", - " }", - " });", - " ", - " } catch(err) {", - " if(verbose) {", - " console.error(errorText, err);", - " }", - " return Promise.reject(err);", - " }", - " });", - " }", - "};", - "", - "RandomUtils = class {", - " constructor() {}", - "", - " getUser() {", - " return {", - " name: pm.variables.replaceIn('{{$randomFullName}}'),", - " email: pm.variables.replaceIn('{{$randomEmail}}')", - " };", - " }", - "", - " getCategory() {", - " return {", - " name: pm.variables.replaceIn('{{$randomWord}}') + Math.floor(Math.random() * 10000 * Math.random()).toString()", - " };", - " }", - "", - " getEvent(categoryId) {", - " return {", - " annotation: pm.variables.replaceIn('{{$randomLoremParagraph}}'),", - " category: categoryId,", - " description: pm.variables.replaceIn('{{$randomLoremParagraphs}}'),", - " eventDate: this.getFutureDateTime(),", - " location: {", - " lat: parseFloat(pm.variables.replaceIn('{{$randomLatitude}}')),", - " lon: parseFloat(pm.variables.replaceIn('{{$randomLongitude}}')),", - " },", - " paid: pm.variables.replaceIn('{{$randomBoolean}}'),", - " participantLimit: pm.variables.replaceIn('{{$randomInt}}'),", - " requestModeration: pm.variables.replaceIn('{{$randomBoolean}}'),", - " title: pm.variables.replaceIn('{{$randomLoremSentence}}'),", - " }", - " }", - "", - " getCompilation(...eventIds) {", - " return {", - " title: pm.variables.replaceIn('{{$randomLoremSentence}}').slice(0, 50),", - " pinned: pm.variables.replaceIn('{{$randomBoolean}}'),", - " events: eventIds", - " };", - " }", - "", - "", - " getFutureDateTime(hourShift = 5, minuteShift=0, yearShift=0) {", - " let moment = require('moment');", - "", - " let m = moment();", - " m.add(hourShift, 'hour');", - " m.add(minuteShift, 'minute');", - " m.add(yearShift, 'year');", - "", - " return m.format('YYYY-MM-DD HH:mm:ss');", - " }", - "", - " getWord(length = 1) {", - " let result = '';", - " const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';", - " const charactersLength = characters.length;", - " let counter = 0;", - " while (counter < length) {", - " result += characters.charAt(Math.floor(Math.random() * charactersLength));", - " counter += 1;", - " }", - " return result;", - " }", - "}" - ] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "packages": {}, - "requests": {}, - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "key": "baseUrl", - "value": "" - }, - { - "key": "uid", - "value": "" - }, - { - "key": "eid", - "value": "" - } - ] -} \ No newline at end of file diff --git a/.postman/ewm-stat-service.json b/.postman/ewm-stat-service.json deleted file mode 100644 index ba35432..0000000 --- a/.postman/ewm-stat-service.json +++ /dev/null @@ -1,1027 +0,0 @@ -{ - "info": { - "_postman_id": "1b12f39d-a514-42d9-99a1-2d2f4026b8e8", - "name": "\"Explore with me\" API статистика", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", - "_exporter_id": "23073145", - "_collection_link": "https://universal-shadow-295426.postman.co/workspace/My-Workspace~4200f6aa-0504-44b1-8a1d-707d0dcbd5ce/collection/23073145-1b12f39d-a514-42d9-99a1-2d2f4026b8e8?action=share&creator=23073145&source=collection_link" - }, - "item": [ - { - "name": "Сохранение информации о том, что к эндпоинту был запрос", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " let post;\r", - " try {\r", - " post = rnd.getPost();\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "\r", - " pm.request.body.update({\r", - " mode: 'raw',\r", - " raw: JSON.stringify(post),\r", - " options: { raw: { language: 'json' } }\r", - " });\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 201 и данные в формате json\", function () {\r", - " pm.response.to.have.status(201);\r", - "});\r", - "" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json" - } - ], - "body": { - "mode": "raw", - "raw": "", - "options": { - "raw": { - "language": "json" - } - } - }, - "url": { - "raw": "{{baseUrl}}/hit", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "hit" - ] - }, - "description": "Сохранение информации о том, что на uri конкретного сервиса был отправлен запрос пользователем. Название сервиса, uri и ip пользователя указаны в теле запроса." - }, - "response": [] - }, - { - "name": "Получение статистики по посещениям. Обратите внимание: значение даты и времени нужно закодировать (например используя java.net.URLEncoder.encode)(Тест на /events/{id})", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try { \r", - " const user = await api.addUser(rnd.getUser());\r", - " const category = await api.addCategory(rnd.getCategory());\r", - " let event = await api.addEvent(user.id, rnd.getEvent(category.id));\r", - " event = await api.publishEvent(event.id);\r", - " pm.collectionVariables.set(\"uri\", '/events/' + event.id);\r", - "\r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events/\" + event.id,\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " pm.sendRequest({\r", - " url : \"http://localhost:9090/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris=/events/\" + event.id.toString() + \"&unique=false\",\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " pm.collectionVariables.set('source', response.json());\r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events/\" + event.id,\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " });\r", - " });\r", - " });\r", - " \r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", - " pm.response.to.be.ok; \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const target = pm.response.json()[0];\r", - "\r", - "pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r", - " pm.expect(target).to.have.all.keys('app', 'uri', 'hits');\r", - "});\r", - "\r", - "const source = pm.collectionVariables.get(\"source\")[0];\r", - "\r", - "\r", - "pm.test(\"После выполнения запроса GET /events/{id} должно увеличиться количество хитов.\", function(){\r", - " pm.expect(source.hits + 1).equal(target.hits, 'Количество хитов после выполнения запроса GET /events/{id} должно быть больше на 1.');\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris={{uri}}&unique=false", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2020-05-05 00:00:00", - "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "end", - "value": "2035-05-05 00:00:00", - "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "uris", - "value": "{{uri}}", - "description": "Список uri для которых нужно выгрузить статистику" - }, - { - "key": "unique", - "value": "false", - "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)" - } - ] - } - }, - "response": [] - }, - { - "name": "Тест взаимодействия сервисов", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try { \r", - " const user = await api.addUser(rnd.getUser());\r", - " const category = await api.addCategory(rnd.getCategory());\r", - " let event1 = await api.addEvent(user.id, rnd.getEvent(category.id));\r", - " event1 = await api.publishEvent(event1.id);\r", - " let event2 = await api.addEvent(user.id, rnd.getEvent(category.id));\r", - " event2 = await api.publishEvent(event2.id);\r", - " pm.collectionVariables.set(\"uri\", '/events/' + event1.id + '&uris=/events/' + event2.id);\r", - "\r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events/\" + event1.id,\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events/\" + event2.id,\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events/\" + event2.id,\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " });\r", - " });\r", - " });\r", - " \r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", - " pm.response.to.be.ok; \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const target = pm.response.json();\r", - "\r", - "pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r", - " pm.expect(target[0]).to.have.all.keys('app', 'uri', 'hits');\r", - " pm.expect(target[1]).to.have.all.keys('app', 'uri', 'hits');\r", - "});\r", - "\r", - "pm.test(\"В теле ответа должна соблюдаться сортировка по убыванию количества просмотров\", function(){\r", - " pm.expect(target[0].hits).to.be.above(target[1].hits);\r", - "});\r", - "\r", - "pm.test(\"Проверка соответствия реального количества просмотров событий и сохраненных хитов\", function(){\r", - " pm.expect(target[0].hits).equal(2);\r", - " pm.expect(target[1].hits).equal(1);\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris={{uri}}", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2020-05-05 00:00:00", - "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "end", - "value": "2035-05-05 00:00:00", - "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "uris", - "value": "{{uri}}", - "description": "Список uri для которых нужно выгрузить статистику" - }, - { - "key": "uris", - "value": "aliqua o", - "description": "Список uri для которых нужно выгрузить статистику", - "disabled": true - }, - { - "key": "unique", - "value": "false", - "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)", - "disabled": true - } - ] - } - }, - "response": [] - }, - { - "name": "Получение статистики по посещениям. Обратите внимание: значение даты и времени нужно закодировать (например используя java.net.URLEncoder.encode)(Тест на /events)", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try { \r", - " pm.collectionVariables.set(\"uri\", '/events'); \r", - " \r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events\",\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " \r", - " pm.sendRequest({\r", - " url : \"http://localhost:9090/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris=/events&unique=false\",\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " pm.collectionVariables.set('source', response.json());\r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events\",\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " });\r", - " });\r", - " });\r", - " \r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json\", function () {\r", - " pm.response.to.be.ok; \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const target = pm.response.json()[0];\r", - "\r", - "pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r", - " pm.expect(target).to.have.all.keys('app', 'uri', 'hits');\r", - "});\r", - "\r", - "const source = pm.collectionVariables.get(\"source\")[0];\r", - "\r", - "\r", - "pm.test(\"После выполнения запроса GET /events должно увеличиться количество хитов.\", function(){\r", - " pm.expect(source.hits + 1).equal(target.hits, 'Количество хитов после выполнения запроса GET /events должно быть больше на 1.');\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris={{uri}}&unique=false", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2020-05-05 00:00:00", - "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "end", - "value": "2035-05-05 00:00:00", - "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "uris", - "value": "{{uri}}", - "description": "Список uri для которых нужно выгрузить статистику" - }, - { - "key": "unique", - "value": "false", - "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)" - } - ] - } - }, - "response": [] - }, - { - "name": "Получение статистики по посещениям. (Тест на опциональность и работу параметра unique)", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "const main = async () => {\r", - " const api = new API(pm);\r", - " const rnd = new RandomUtils();\r", - "\r", - " try { \r", - " pm.collectionVariables.set(\"uri\", '/events'); \r", - " \r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events\",\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " pm.sendRequest({\r", - " url : \"http://localhost:8080/events\",\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " \r", - " pm.sendRequest({\r", - " url : \"http://localhost:9090/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris=/events&unique=true\",\r", - " method : \"GET\",\r", - " header: { \"Content-Type\": \"application/json\" }\r", - " }, (error, response) => {\r", - " pm.collectionVariables.set('source', response.json());\r", - " });\r", - " });\r", - " });\r", - " } catch(err) {\r", - " console.error(\"Ошибка при подготовке тестовых данных.\", err);\r", - " }\r", - "};\r", - "\r", - "const interval = setInterval(() => {}, 1000);\r", - "\r", - "setTimeout(async () => \r", - " {\r", - " try {\r", - " await main();\r", - " } catch (e) {\r", - " console.error(e);\r", - " } finally {\r", - " clearInterval(interval);\r", - " }\r", - " }, \r", - " 100 \r", - ");" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 200 и данные в формате json при запросе без опционального параметра unique\", function () {\r", - " pm.response.to.be.ok; \r", - " pm.response.to.be.withBody;\r", - " pm.response.to.be.json;\r", - "});\r", - "\r", - "const target = pm.response.json()[0];\r", - "\r", - "pm.test(\"Посты должны содержать поля: app, uri, hits\", function () {\r", - " pm.expect(target).to.have.all.keys('app', 'uri', 'hits');\r", - "});\r", - "\r", - "const source = pm.collectionVariables.get(\"source\")[0];\r", - "\r", - "pm.test(\"Количество уникальных просмотров с одного ip должно равняться 1\", function () {\r", - " pm.expect(source.hits == 1);\r", - "})\r", - "\r", - "pm.test(\"Количество просмотров с одного ip должно быть больше 1\", function () {\r", - " pm.expect(target.hits > 1);\r", - "})" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/stats?start=2020-05-05 00:00:00&end=2035-05-05 00:00:00&uris={{uri}}", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2020-05-05 00:00:00", - "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "end", - "value": "2035-05-05 00:00:00", - "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "uris", - "value": "{{uri}}", - "description": "Список uri для которых нужно выгрузить статистику" - }, - { - "key": "uris", - "value": "aliqua o", - "description": "Список uri для которых нужно выгрузить статистику", - "disabled": true - }, - { - "key": "unique", - "value": "false", - "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)", - "disabled": true - } - ] - } - }, - "response": [] - }, - { - "name": "Получение статистики по посещениям. (Тест на верную обработку запроса с неверными датами начала и конца диапазона времени)", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r", - " pm.response.to.be.badRequest;\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/stats?start=2035-05-05 00:00:00&end=2020-05-05 00:00:00&uris={{uri}}", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2035-05-05 00:00:00", - "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "end", - "value": "2020-05-05 00:00:00", - "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "uris", - "value": "{{uri}}", - "description": "Список uri для которых нужно выгрузить статистику" - }, - { - "key": "unique", - "value": "false", - "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)", - "disabled": true - } - ] - } - }, - "response": [] - }, - { - "name": "Тест на верную обработку запроса без даты начала", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r", - " pm.response.to.be.badRequest;\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/stats?end=2020-05-05 00:00:00&uris={{uri}}", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2035-05-05 00:00:00", - "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")", - "disabled": true - }, - { - "key": "end", - "value": "2020-05-05 00:00:00", - "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "uris", - "value": "{{uri}}", - "description": "Список uri для которых нужно выгрузить статистику" - }, - { - "key": "unique", - "value": "false", - "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)", - "disabled": true - } - ] - } - }, - "response": [] - }, - { - "name": "Тест на верную обработку запроса без даты конца", - "event": [ - { - "listen": "prerequest", - "script": { - "exec": [ - "" - ], - "type": "text/javascript" - } - }, - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Ответ должен содержать код статуса 400\", function () {\r", - " pm.response.to.be.badRequest;\r", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Accept", - "value": "application/json" - } - ], - "url": { - "raw": "{{baseUrl}}/stats?start=2035-05-05 00:00:00&uris={{uri}}", - "host": [ - "{{baseUrl}}" - ], - "path": [ - "stats" - ], - "query": [ - { - "key": "start", - "value": "2035-05-05 00:00:00", - "description": "(Required) Дата и время начала диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")" - }, - { - "key": "end", - "value": "2020-05-05 00:00:00", - "description": "(Required) Дата и время конца диапазона за который нужно выгрузить статистику (в формате \"yyyy-MM-dd HH:mm:ss\")", - "disabled": true - }, - { - "key": "uris", - "value": "{{uri}}", - "description": "Список uri для которых нужно выгрузить статистику" - }, - { - "key": "unique", - "value": "false", - "description": "Нужно ли учитывать только уникальные посещения (только с уникальным ip)", - "disabled": true - } - ] - } - }, - "response": [] - } - ], - "event": [ - { - "listen": "prerequest", - "script": { - "type": "text/javascript", - "exec": [ - "API = class {", - " constructor(postman, verbose = false, baseUrl = \"http://localhost:9090\") {", - " this.baseUrl = baseUrl;", - " this.pm = postman;", - " this._verbose = verbose;", - " }", - "", - " async addPost(post, verbose=null) {", - " return this.post(\"/hit\", post, \"Ошибка при сохранении информации о запросе к эндпойнту: \", verbose);", - " }", - "", - " async addUser(user, verbose=null) {", - " return this.post(\"/admin/users\", user, \"http://localhost:8080\", \"Ошибка при добавлении нового пользователя: \", verbose);", - " }", - "", - " async addCategory(category, verbose=null) {", - " return this.post(\"/admin/categories\", category, \"http://localhost:8080\", \"Ошибка при добавлении новой категории: \", verbose);", - " }", - "", - " async addEvent(userId, event, verbose=null) {", - " return this.post(\"/users/\" + userId + \"/events\", event, \"http://localhost:8080\", \"Ошибка при добавлении нового события: \", verbose);", - " }", - "", - " async publishEvent(eventId, verbose=null) {", - " return this.patch('/admin/events/' + eventId, {stateAction: \"PUBLISH_EVENT\"},\"Ошибка при публикации события\", verbose);", - " }", - "", - " async patch(path, body = null, errorText = \"Ошибка при выполнении patch-запроса: \", verbose=null) {", - " return this.sendRequest(\"PATCH\", path, \"http://localhost:8080\", body, errorText);", - " }", - "", - " async post(path, body, newBaseUrl=null, errorText = \"Ошибка при выполнении post-запроса: \", verbose=null) {", - " return this.sendRequest(\"POST\", path, newBaseUrl, body, errorText);", - " }", - "", - " async sendRequest(method, path, newBaseUrl=null, body=null, errorText = \"Ошибка при выполнении запроса: \", verbose=null) {", - " return new Promise((resolve, reject) => {", - " verbose = verbose == null ? this._verbose : verbose;", - " let request;", - " if (newBaseUrl==null)", - " request = {", - " url: this.baseUrl + path,", - " method: method,", - " body: body == null ? \"\" : JSON.stringify(body),", - " header: { \"Content-Type\": \"application/json\" },", - " };", - " else", - " request = {", - " url: newBaseUrl + path,", - " method: method,", - " body: body == null ? \"\" : JSON.stringify(body),", - " header: { \"Content-Type\": \"application/json\" },", - " };", - "", - " if(verbose) {", - " console.log(\"Отправляю запрос: \", request);", - " }", - "", - " try {", - " this.pm.sendRequest(request, (error, response) => {", - " if(error || (response.code >= 400 && response.code <= 599)) {", - " let err = error ? error : JSON.stringify(response.json());", - " console.error(\"При выполнении запроса к серверу возникла ошика.\\n\", err,", - " \"\\nДля отладки проблемы повторите такой же запрос к вашей программе \" + ", - " \"на локальном компьютере. Данные запроса:\\n\", JSON.stringify(request));", - "", - " reject(new Error(errorText + err));", - " }", - "", - " if(verbose) {", - " console.log(\"Результат обработки запроса: код состояния - \", response.code, \", тело: \", response.json());", - " }", - " try{", - " resolve(response.json());", - " } catch(err){", - " resolve(response);", - " }", - " ", - " });", - " } catch(err) {", - " if(verbose) {", - " console.error(errorText, err);", - " }", - " return Promise.reject(err);", - " }", - " });", - " }", - "};", - "", - "RandomUtils = class {", - " constructor() {}", - "", - " getPost() {", - " return {", - " app: \"ewm-main-service\",", - " uri: \"/events/\" + pm.variables.replaceIn('{{$randomInt}}'),", - " ip: pm.variables.replaceIn('{{$randomIP}}'),", - " timestamp: this.getPastDateTime()", - " }", - " }", - "", - " getUser() {", - " return {", - " name: pm.variables.replaceIn('{{$randomFullName}}'),", - " email: pm.variables.replaceIn('{{$randomEmail}}')", - " };", - " }", - "", - " getCategory() {", - " return {", - " name: pm.variables.replaceIn('{{$randomWord}}') + Math.floor(Math.random() * 100).toString()", - " };", - " }", - "", - " getEvent(categoryId) {", - " return {", - " annotation: pm.variables.replaceIn('{{$randomLoremParagraph}}'),", - " category: categoryId,", - " description: pm.variables.replaceIn('{{$randomLoremParagraphs}}'),", - " eventDate: this.getFutureDateTime(),", - " location: {", - " lat: parseFloat(pm.variables.replaceIn('{{$randomLatitude}}')),", - " lon: parseFloat(pm.variables.replaceIn('{{$randomLongitude}}')),", - " },", - " paid: pm.variables.replaceIn('{{$randomBoolean}}'),", - " participantLimit: pm.variables.replaceIn('{{$randomInt}}'),", - " requestModeration: pm.variables.replaceIn('{{$randomBoolean}}'),", - " title: pm.variables.replaceIn('{{$randomLoremSentence}}'),", - " }", - " }", - " ", - " getCompilation(...eventIds) { ", - " return { ", - " title: pm.variables.replaceIn('{{$randomLoremSentence}}'), ", - " pinned: pm.variables.replaceIn('{{$randomBoolean}}'), ", - " events: eventIds ", - " }; ", - " }", - "", - " getPastDateTime(hourShift = 5, minuteShift=0, yearShift=0) {", - " let moment = require('moment');", - "", - " let m = moment();", - " m.subtract(hourShift, 'hour');", - " m.subtract(minuteShift, 'minute');", - " m.subtract(yearShift, 'year');", - "", - " return m.format('YYYY-MM-DD HH:mm:ss');", - " }", - "", - " getFutureDateTime(hourShift = 5, minuteShift=0, yearShift=0) {", - " let moment = require('moment');", - "", - " let m = moment();", - " m.add(hourShift, 'hour');", - " m.add(minuteShift, 'minute');", - " m.add(yearShift, 'year');", - "", - " return m.format('YYYY-MM-DD HH:mm:ss');", - " }", - "}" - ] - } - }, - { - "listen": "test", - "script": { - "type": "text/javascript", - "exec": [ - "" - ] - } - } - ], - "variable": [ - { - "key": "baseUrl", - "value": "http://localhost:9090", - "type": "string" - }, - { - "key": "uri", - "value": "1" - }, - { - "key": "source", - "value": "" - } - ] -} diff --git a/readme.md b/readme.md index 11a93aa..d750076 100644 --- a/readme.md +++ b/readme.md @@ -2,13 +2,13 @@ ![Static Badge](https://img.shields.io/badge/Java-21-green) ![Static Badge](https://img.shields.io/badge/Spring_Boot-3.5.9-green) -![Static Badge](https://img.shields.io/badge/Lombok-red) -![Static Badge](https://img.shields.io/badge/JPA--specification-8A2BE2) +![Static Badge](https://img.shields.io/badge/Microservices-8A2BE2) ![Static Badge](https://img.shields.io/badge/SpringCloud-538681) +![Static Badge](https://img.shields.io/badge/Kafka-blue) +![Static Badge](https://img.shields.io/badge/JPA--specification-5d7cc2) ![Static Badge](https://img.shields.io/badge/PostgreSQL-16.1-blue) ![Static Badge](https://img.shields.io/badge/docker_compose-blue) ![Static Badge](https://img.shields.io/badge/Maven-orange) -![Static Badge](https://img.shields.io/badge/Microservices-8A2BE2) ## Бэкэнд для сервиса поиска мероприятий @@ -17,28 +17,197 @@ configuration files location: infra/config-repo ### Microservice map -![ms](.img/microservices.png) + +microservices.svg + +### Calculate similarities map + +similarity.png + +### Matrix example + +Матрица ведущих весов (leadingWeightMatrix) + +| | u1 | u3 | u5 | u7 | u8 | u10 | u11 | u12 | u13 | +|-----|------|------|------|------|------|------|------|------|------| +| e1 | | | 0.80 | | | | | | | +| e2 | | | | | | | | | 0.80 | +| e4 | 0.40 | 0.80 | | | | 0.40 | | | | +| e5 | 1.00 | | | | | | | | | +| e7 | | | | | 0.80 | | | | | +| e8 | | | | | | | | 0.40 | | +| e9 | | | | | | | 0.80 | | | +| e11 | | | | | | | | | 0.40 | +| e13 | | | | | | | | | 0.40 | +| e14 | | | | | 0.40 | | | | | +| e15 | | | | 0.80 | | | | | | +| e16 | | | | | | | | 0.80 | | +| e17 | | | | | | 0.80 | | | | +| e18 | | | | | | 0.80 | | 0.40 | | +| e20 | 0.80 | | | | | | | | | + +Матрица числителей (sumOfMinWeightsMatrix) + +| | e2 | e4 | e5 | e7 | e8 | e11 | e13 | e14 | e16 | e17 | e18 | e20 | +|-----|------|------|------|------|------|------|------|------|------|------|------|------| +| e2 | 0.00 | | | | | 0.40 | 0.40 | | | | | | +| e4 | | 0.00 | 0.40 | | | | | | | 0.40 | 0.40 | 0.40 | +| e5 | | 0.40 | 0.00 | | | | | | | | | 0.80 | +| e7 | | | | 0.00 | | | | 0.40 | | | | | +| e8 | | | | | 0.00 | | | | 0.40 | | 0.40 | | +| e11 | 0.40 | | | | | 0.00 | 0.40 | | | | | | +| e13 | 0.40 | | | | | 0.40 | 0.00 | | | | | | +| e14 | | | | 0.40 | | | | 0.00 | | | | | +| e16 | | | | | 0.40 | | | | 0.00 | | 0.40 | | +| e17 | | 0.40 | | | | | | | | 0.00 | 0.80 | | +| e18 | | 0.40 | | | 0.40 | | | | 0.40 | 0.80 | 0.00 | | +| e20 | | 0.40 | 0.80 | | | | | | | | | 0.00 | + +Таблица знаменателей (eventToLeadingWeightsSum) + +| | e1 | e2 | e4 | e5 | e7 | e8 | e9 | e11 | e13 | e14 | e15 | e16 | e17 | e18 | e20 | +|-------|------|------|------|------|------|------|------|------|------|------|------|------|------|------|------| +| Σ | 0.80 | 0.80 | 1.60 | 1.00 | 0.80 | 0.40 | 0.80 | 0.40 | 0.40 | 0.40 | 0.80 | 0.80 | 0.80 | 1.20 | 0.80 | ### External API -![external-api.png](.img/external-api.png) -![external-api-2.png](.img/external-api-2.png) +```mermaid +mindmap + root((API)) + admin + 🌐/categories + DELETE /admin/categories/:catId + PATCH /admin/categories/:catId + POST /admin/categories + 🌐/compilations + DELETE /admin/compilations/:compId + PATCH /admin/compilations/:compId + POST /admin/compilations + 🌐/events + GET /admin/events + PATCH /admin/events/:eventId + 🌐/users + DELETE /admin/users/:userId + GET /admin/users/:userId + GET /admin/users + POST /admin/users + user + 🌐/events + GET /users/:userId/events + GET /users/:userId/events/:eventId + GET /users/:userId/events/:eventId/requests + PATCH /users/:userId/events/:eventId + PATCH /users/:userId/events/:eventId/requests + POST /users/:userId/events + 🌐/requests + GET /users/:userId/requests + PATCH /users/:userId/requests/:requestId/cancel + POST /users/:userId/requests + 🌐/rating + PUT /events/:eventId/like + 🌐/recommendations + GET /events/recommendations + public + 🌐/categories + GET /categories + GET /categories/:catId + 🌐/compilations + GET /compilations + GET /compilations/:compId + 🌐/events + GET /events + GET /events/:eventId +``` ### Internal API -![internal-api.png](.img/internal-api.png) +```mermaid +mindmap + root((API)) + system + 🌐/events + GET /system/events/:eventId + GET /system/events/:eventId/initiator + 🌐/requests + GET /system/requests/count + GET /system/requests/users/:userId/events/:eventId + PATCH /system/requests/events/:eventId/status + 🌐/users + GET /system/users/:userId/check + GET /system/users/:userId + GET /system/users/short +``` ### Database map +```mermaid +erDiagram + EVENTS { + bigint id PK + varchar annotation + timestamp created_on + varchar description + timestamp event_date + jsonb location + boolean paid + integer participant_limit + timestamp published_on + boolean request_moderation + varchar state + varchar title + bigint category_id FK + bigint initiator_id FK + } + + CATEGORIES { + bigint id PK + varchar name + } + + COMPILATIONS { + bigint id PK + boolean pinned + varchar title + } + + COMPILATION_EVENTS { + bigint compilation_id FK + bigint events_id FK + } -ewm-main/event-service -![ewm-main-event-service.png](.img/ewm-main-event-service.png) + REQUESTS { + bigint id PK + timestamp created + varchar status + bigint event_id FK + bigint requester_id FK + } -ewm-main/rating-service -![ewm-main-rating-service.png](.img/ewm-main-rating-service.png) + USERS { + bigint id PK + varchar email + varchar name + } -ewm-main/request-service -![ewm-main-request-service.png](.img/ewm-main-request-service.png) + INTERACTIONS { + bigint id PK + bigint user_id FK + bigint event_id FK + numeric action_weight + } -ewm-main/user-service -![ewm-main-user-service.png](.img/ewm-main-user-service.png) + SIMILARITIES { + bigint id PK + bigint event_a FK + bigint event_b FK + numeric score + } -ewm-stats/stats-server -![ewm-stats-stats-server.png](.img/ewm-stats-stats-server.png) \ No newline at end of file + CATEGORIES ||--o{ EVENTS : classifies + USERS ||--o{ EVENTS : initiates + EVENTS ||--o{ COMPILATION_EVENTS : included_in + COMPILATIONS ||--o{ COMPILATION_EVENTS : contains + EVENTS ||--o{ REQUESTS : receives + USERS ||--o{ REQUESTS : creates + USERS ||--o{ INTERACTIONS : performs + EVENTS ||--o{ INTERACTIONS : tracked_in + EVENTS ||--o{ SIMILARITIES : compared_as_a + EVENTS ||--o{ SIMILARITIES : compared_as_b +``` \ No newline at end of file