From a15ad575e7bba5a99bf8a1843631453c43bc6495 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sun, 4 Dec 2022 13:40:32 +0300 Subject: [PATCH 01/10] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gitlab-app/Dockerfile-debug | 23 ------------------- .../bot/gitlab/GitLabBotApplication.java | 13 +++++++++++ .../bot/gitlab/app/GitLabBotApplication.java | 17 -------------- .../gitlab/{app => }/config/AppConfig.java | 2 +- .../{app => }/scheduler/SchedulerService.java | 2 +- pom.xml | 12 ---------- 6 files changed, 15 insertions(+), 54 deletions(-) delete mode 100644 gitlab-app/Dockerfile-debug create mode 100644 gitlab-app/src/main/java/dev/struchkov/bot/gitlab/GitLabBotApplication.java delete mode 100644 gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/GitLabBotApplication.java rename gitlab-app/src/main/java/dev/struchkov/bot/gitlab/{app => }/config/AppConfig.java (98%) rename gitlab-app/src/main/java/dev/struchkov/bot/gitlab/{app => }/scheduler/SchedulerService.java (96%) diff --git a/gitlab-app/Dockerfile-debug b/gitlab-app/Dockerfile-debug deleted file mode 100644 index eab6676..0000000 --- a/gitlab-app/Dockerfile-debug +++ /dev/null @@ -1,23 +0,0 @@ -FROM openjdk:17.0.2-jdk-slim-buster -MAINTAINER uPagge -RUN apt upgrade && addgroup gitlabbot --disabled-password && \ - adduser gitlabbot --ingroup gitlabbot && \ - mkdir -p /bot && \ - chown -R gitlabbot:gitlabbot /bot -WORKDIR /bot -USER gitlabbot:gitlabbot -COPY target/gitlab-notification.jar app.jar -ENV TELEGRAM_PERSON_ID=TELEGRAM_PERSON_ID DATASOURCE_URL=DATASOURCE_URL \ - DATASOURCE_PASSWORD=DATASOURCE_PASSWORD DATASOURCE_USERNAME=DATASOURCE_USERNAME \ - GITLAB_PERSONAL_TOKEN=GITLAB_PERSONAL_TOKEN TELEGRAM_BOT_TOKEN=TELEGRAM_BOT_TOKEN \ - TELEGRAM_BOT_USERNAME=TELEGRAM_BOT_USERNAME GITLAB_URL=GITLAB_URL GITLAB_REPLACE_URL=GITLAB_REPLACE_URL -ENTRYPOINT java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -DTELEGRAM_BOT_USERNAME=${TELEGRAM_BOT_USERNAME} \ - -DTELEGRAM_BOT_TOKEN=$TELEGRAM_BOT_TOKEN \ - -DTELEGRAM_PERSON_ID=$TELEGRAM_PERSON_ID \ - -DDATASOURCE_URL=$DATASOURCE_URL \ - -DDATASOURCE_PASSWORD=$DATASOURCE_PASSWORD \ - -DDATASOURCE_USERNAME=$DATASOURCE_USERNAME \ - -DGITLAB_PERSONAL_TOKEN=$GITLAB_PERSONAL_TOKEN \ - -DGITLAB_URL=$GITLAB_URL \ - -DGITLAB_REPLACE_URL=$GITLAB_REPLACE_URL \ - -jar app.jar \ No newline at end of file diff --git a/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/GitLabBotApplication.java b/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/GitLabBotApplication.java new file mode 100644 index 0000000..6e162ee --- /dev/null +++ b/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/GitLabBotApplication.java @@ -0,0 +1,13 @@ +package dev.struchkov.bot.gitlab; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class GitLabBotApplication { + + public static void main(String[] args) { + SpringApplication.run(GitLabBotApplication.class, args); + } + +} diff --git a/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/GitLabBotApplication.java b/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/GitLabBotApplication.java deleted file mode 100644 index b17448f..0000000 --- a/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/GitLabBotApplication.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.struchkov.bot.gitlab.app; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -@EnableJpaRepositories(basePackages = {"dev.struchkov.bot.gitlab.data.jpa"}) -@SpringBootApplication(scanBasePackages = "dev.struchkov.bot.gitlab") -@EntityScan(basePackages = {"dev.struchkov.bot.gitlab.context.domain.entity"}) -public class GitLabBotApplication { - - public static void main(String[] args) { - SpringApplication.run(GitLabBotApplication.class, args); - } - -} diff --git a/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/config/AppConfig.java b/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/config/AppConfig.java similarity index 98% rename from gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/config/AppConfig.java rename to gitlab-app/src/main/java/dev/struchkov/bot/gitlab/config/AppConfig.java index efa0b6d..f2ae9d8 100644 --- a/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/config/AppConfig.java +++ b/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/config/AppConfig.java @@ -1,4 +1,4 @@ -package dev.struchkov.bot.gitlab.app.config; +package dev.struchkov.bot.gitlab.config; import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; diff --git a/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/scheduler/SchedulerService.java b/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/scheduler/SchedulerService.java similarity index 96% rename from gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/scheduler/SchedulerService.java rename to gitlab-app/src/main/java/dev/struchkov/bot/gitlab/scheduler/SchedulerService.java index 45c7f57..f058b70 100644 --- a/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/app/scheduler/SchedulerService.java +++ b/gitlab-app/src/main/java/dev/struchkov/bot/gitlab/scheduler/SchedulerService.java @@ -1,4 +1,4 @@ -package dev.struchkov.bot.gitlab.app.scheduler; +package dev.struchkov.bot.gitlab.scheduler; import dev.struchkov.bot.gitlab.context.service.CleanService; import dev.struchkov.bot.gitlab.core.service.parser.DiscussionParser; diff --git a/pom.xml b/pom.xml index b9eb7b5..58f5bc7 100644 --- a/pom.xml +++ b/pom.xml @@ -182,18 +182,6 @@ - - org.springframework.boot - spring-boot-starter-web - 2.2.4.RELEASE - - - ch.qos.logback - logback-classic - - - - From 0263f6ce02c1d66de32c8a4c1170177c8eaa7e56 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Sun, 4 Dec 2022 13:54:27 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8?= =?UTF-8?q?=20spring-boot=20=D0=B4=D0=BE=202.6.14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gitlab-app/src/main/resources/banner.txt | 11 +++++++++++ pom.xml | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 gitlab-app/src/main/resources/banner.txt diff --git a/gitlab-app/src/main/resources/banner.txt b/gitlab-app/src/main/resources/banner.txt new file mode 100644 index 0000000..7c62b29 --- /dev/null +++ b/gitlab-app/src/main/resources/banner.txt @@ -0,0 +1,11 @@ + .d8888b. d8b 888 888 888 888b 888 888 d8b .d888 d8b +d88P Y88b Y8P 888 888 888 8888b 888 888 Y8P d88P" Y8P +888 888 888 888 888 88888b 888 888 888 +888 888 888888 888 8888b. 88888b. 888Y88b 888 .d88b. 888888 888 888888 888 .d88b. 888d888 +888 88888 888 888 888 "88b 888 "88b 888 Y88b888 d88""88b 888 888 888 888 d8P Y8b 888P" +888 888 888 888 888 .d888888 888 888 888 Y88888 888 888 888 888 888 888 88888888 888 +Y88b d88P 888 Y88b. 888 888 888 888 d88P 888 Y8888 Y88..88P Y88b. 888 888 888 Y8b. 888 + "Y8888P88 888 "Y888 88888888 "Y888888 88888P" 888 Y888 "Y88P" "Y888 888 888 888 "Y8888 888 +................................................................................................................. +..................................................................................... SpringBoot : 2.6.14 ....... +................................................................................................................. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 58f5bc7..e6820c7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.2 + 2.6.14 From 26a2e14b811168d401a5cdca47f4120ff10ee6e5 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Mon, 5 Dec 2022 11:55:39 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=8C=20liquibase-core=20=D0=B2=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D1=83=D0=BB=D1=8C=20bot-data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot-data/pom.xml | 4 ++++ pom.xml | 6 ------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/bot-data/pom.xml b/bot-data/pom.xml index fef3d3d..d86ba85 100644 --- a/bot-data/pom.xml +++ b/bot-data/pom.xml @@ -24,6 +24,10 @@ org.springframework.data spring-data-jpa + + org.liquibase + liquibase-core + \ No newline at end of file diff --git a/pom.xml b/pom.xml index e6820c7..cc958f8 100644 --- a/pom.xml +++ b/pom.xml @@ -152,12 +152,6 @@ ${postgresql.version} - - org.liquibase - liquibase-core - ${liquibase.version} - - javax.persistence javax.persistence-api From 55b156508982a9bb6c886b69df3210f9f15791d2 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Mon, 5 Dec 2022 16:33:23 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=20=D0=B8=20MR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../context/domain/entity/MergeRequest.java | 25 +- .../gitlab/context/domain/entity/Person.java | 6 + .../notify/pullrequest/NewPrNotify.java | 2 +- .../context/service/MergeRequestsService.java | 2 + .../convert/MergeRequestJsonConverter.java | 33 ++- .../service/convert/ProjectJsonConverter.java | 2 + .../impl/MergeRequestsServiceImpl.java | 263 +++++++++++------- .../core/service/impl/ProjectServiceImpl.java | 10 +- .../service/parser/MergeRequestParser.java | 72 ++++- .../core/service/parser/ProjectParser.java | 29 +- gitlab-app/src/main/resources/application.yml | 2 +- .../main/resources/liquibase/changelog.xml | 3 +- .../liquibase/v.1.0.0/2022-12-03-insert.xml | 2 +- .../resources/liquibase/v.1.0.0/changelog.xml | 2 +- .../v.1.1.3/2022-12-05-add-reviewers.xml | 22 ++ .../resources/liquibase/v.1.1.3/changelog.xml | 12 + .../gitlab/sdk/domain/MergeRequestJson.java | 3 + .../bot/gitlab/telegram/unit/MenuConfig.java | 8 +- 18 files changed, 345 insertions(+), 153 deletions(-) create mode 100644 gitlab-app/src/main/resources/liquibase/v.1.1.3/2022-12-05-add-reviewers.xml create mode 100644 gitlab-app/src/main/resources/liquibase/v.1.1.3/changelog.xml diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/MergeRequest.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/MergeRequest.java index 92038d9..8ec97e5 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/MergeRequest.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/MergeRequest.java @@ -2,22 +2,29 @@ package dev.struchkov.bot.gitlab.context.domain.entity; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.haiti.utils.fieldconstants.annotation.FieldNames; +import dev.struchkov.haiti.utils.fieldconstants.domain.Mode; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; +import javax.persistence.CascadeType; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; +import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.persistence.Table; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -28,7 +35,7 @@ import java.util.Set; @Getter @Setter @Entity -@FieldNames +@FieldNames(mode = {Mode.TABLE, Mode.SIMPLE}) @Table(name = "merge_request") @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class MergeRequest { @@ -66,14 +73,26 @@ public class MergeRequest { @Column(name = "conflict") private boolean conflict; - @ManyToOne + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}) @JoinColumn(name = "author_id") private Person author; - @ManyToOne + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}) @JoinColumn(name = "assignee_id") private Person assignee; + @OneToMany( + fetch = FetchType.LAZY, + cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}, + orphanRemoval = true + ) + @JoinTable( + name = "merge_request_reviewer", + joinColumns = @JoinColumn(name = "merge_request_id", referencedColumnName = "id"), + inverseJoinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id") + ) + private List reviewers = new ArrayList<>(); + @Column(name = "target_branch") private String targetBranch; diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Person.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Person.java index 21ba442..6f5878b 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Person.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Person.java @@ -1,5 +1,8 @@ package dev.struchkov.bot.gitlab.context.domain.entity; +import dev.struchkov.haiti.utils.fieldconstants.annotation.FieldNames; +import dev.struchkov.haiti.utils.fieldconstants.domain.Mode; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @@ -14,10 +17,13 @@ import javax.persistence.Table; @Entity @Getter @Setter +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @Table(name = "person") +@FieldNames(mode = {Mode.TABLE, Mode.SIMPLE}) public class Person { @Id + @EqualsAndHashCode.Include @Column(name = "id") private Long id; diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/pullrequest/NewPrNotify.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/pullrequest/NewPrNotify.java index 5fbd1b2..2c14d94 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/pullrequest/NewPrNotify.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/pullrequest/NewPrNotify.java @@ -48,7 +48,7 @@ public class NewPrNotify extends PrNotify { labelText = "\n\n" + labelText; } return MessageFormat.format( - "{0} *New MergeRequest | {1}*{2}[{3}]({4}){5}{2}{9}: {10} {12} {11}", + "{0} *New merge request for review | {1}*{2}[{3}]({4}){5}{2}{9}: {10} {12} {11}\n{7}: {8}", Smile.FUN.getValue(), projectName, Smile.HR.getValue(), diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java index 91172bc..d7a22e2 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java @@ -18,6 +18,8 @@ public interface MergeRequestsService { MergeRequest update(@NonNull MergeRequest mergeRequest); + List updateAll(@NonNull List mergeRequests); + /** * Получить все идентификаторы вместе со статусами. * diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/convert/MergeRequestJsonConverter.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/convert/MergeRequestJsonConverter.java index 820ffdb..243b531 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/convert/MergeRequestJsonConverter.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/convert/MergeRequestJsonConverter.java @@ -2,16 +2,20 @@ package dev.struchkov.bot.gitlab.core.service.convert; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; +import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.sdk.domain.MergeRequestJson; import dev.struchkov.bot.gitlab.sdk.domain.MergeRequestStateJson; +import dev.struchkov.bot.gitlab.sdk.domain.PersonJson; import lombok.RequiredArgsConstructor; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; /** * @author upagge 15.01.2021 @@ -35,23 +39,36 @@ public class MergeRequestJsonConverter implements Converter convertLabels(Set source) { - if (checkNotEmpty(source)) { - return source.stream() - .map(label -> label.replaceAll("-", "_")) - .collect(Collectors.toSet()); + private void convertReviewers(MergeRequest mergeRequest, List jsonReviewers) { + if (checkNotEmpty(jsonReviewers)) { + final List reviewers = jsonReviewers.stream() + .map(convertPerson::convert) + .toList(); + mergeRequest.setReviewers(reviewers); + } + } + + private static void convertLabels(MergeRequest mergeRequest, Set source) { + if (checkNotEmpty(source)) { + final Set labels = source.stream() + .map(label -> label.replace("-", "_")) + .collect(Collectors.toSet()); + mergeRequest.setLabels(labels); } - return null; } private MergeRequestState convertState(MergeRequestStateJson state) { diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/convert/ProjectJsonConverter.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/convert/ProjectJsonConverter.java index 585968b..c2db30b 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/convert/ProjectJsonConverter.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/convert/ProjectJsonConverter.java @@ -2,6 +2,7 @@ package dev.struchkov.bot.gitlab.core.service.convert; import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.sdk.domain.ProjectJson; +import lombok.RequiredArgsConstructor; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; @@ -9,6 +10,7 @@ import org.springframework.stereotype.Component; * @author upagge 14.01.2021 */ @Component +@RequiredArgsConstructor public class ProjectJsonConverter implements Converter { @Override diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java index a3c0f6b..eeb8051 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java @@ -6,6 +6,7 @@ import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; +import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.domain.filter.MergeRequestFilter; import dev.struchkov.bot.gitlab.context.domain.notify.pullrequest.ConflictPrNotify; @@ -16,7 +17,6 @@ import dev.struchkov.bot.gitlab.context.repository.MergeRequestRepository; import dev.struchkov.bot.gitlab.context.service.DiscussionService; import dev.struchkov.bot.gitlab.context.service.MergeRequestsService; import dev.struchkov.bot.gitlab.context.service.NotifyService; -import dev.struchkov.bot.gitlab.context.service.PersonService; import dev.struchkov.bot.gitlab.context.service.ProjectService; import dev.struchkov.bot.gitlab.core.service.impl.filter.MergeRequestFilterService; import lombok.NonNull; @@ -24,6 +24,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Objects; @@ -31,6 +32,9 @@ import java.util.Set; import java.util.stream.Collectors; import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; +import static dev.struchkov.haiti.utils.Checker.checkNull; import static java.lang.Boolean.TRUE; @Service @@ -39,7 +43,6 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { private final NotifyService notifyService; private final MergeRequestRepository repository; - private final PersonService personService; private final MergeRequestFilterService filterService; private final ProjectService projectService; private final DiscussionService discussionService; @@ -47,63 +50,109 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { private final PersonInformation personInformation; @Override + @Transactional public MergeRequest create(@NonNull MergeRequest mergeRequest) { - if (mergeRequest.getAssignee() != null) { - personService.create(mergeRequest.getAssignee()); - } - personService.create(mergeRequest.getAuthor()); - mergeRequest.setNotification(true); final MergeRequest newMergeRequest = repository.save(mergeRequest); - notifyNewPr(newMergeRequest); + notifyNewMergeRequest(newMergeRequest); return newMergeRequest; } - private void notifyNewPr(MergeRequest newMergeRequest) { - if (!personInformation.getId().equals(newMergeRequest.getAuthor().getId())) { + /** + * Уведомление о новом MergeRequest. + * + * @param savedMergeRequest сохраненный в базу новый MergeRequest. + */ + private void notifyNewMergeRequest(MergeRequest savedMergeRequest) { + notifyUserAboutNewPullRequestIfHeIsReviewer(savedMergeRequest); + notifyUserAboutNewPullRequestIfHeIsAssignee(savedMergeRequest); + } - final String projectName = projectService.getByIdOrThrow(newMergeRequest.getProjectId()).getName(); - if (!newMergeRequest.isConflict()) { - notifyService.send( - NewPrNotify.builder() - .projectName(projectName) - .labels(newMergeRequest.getLabels()) - .author(newMergeRequest.getAuthor().getName()) - .description(newMergeRequest.getDescription()) - .title(newMergeRequest.getTitle()) - .url(newMergeRequest.getWebUrl()) - .targetBranch(newMergeRequest.getTargetBranch()) - .sourceBranch(newMergeRequest.getSourceBranch()) - .build() - ); + private void notifyUserAboutNewPullRequestIfHeIsAssignee(MergeRequest savedMergeRequest) { + final Long gitlabUserId = personInformation.getId(); + final Person assignee = savedMergeRequest.getAssignee(); + final Person author = savedMergeRequest.getAuthor(); + + if (checkNotNull(assignee)) { + if (gitlabUserId.equals(assignee.getId()) && !isAuthorSameAssignee(author, assignee)) { + final String projectName = projectService.getByIdOrThrow(savedMergeRequest.getProjectId()).getName(); + if (!savedMergeRequest.isConflict()) { + //TODO [05.12.2022|uPagge]: Заменить уведомление. Нужно создать новое уведомление, если пользователя назначали ответственным + notifyService.send( + NewPrNotify.builder() + .projectName(projectName) + .labels(savedMergeRequest.getLabels()) + .author(author.getName()) + .description(savedMergeRequest.getDescription()) + .title(savedMergeRequest.getTitle()) + .url(savedMergeRequest.getWebUrl()) + .targetBranch(savedMergeRequest.getTargetBranch()) + .sourceBranch(savedMergeRequest.getSourceBranch()) + .build() + ); + } } + } + } + /** + * Создатель MR является ответственным за этот MR + * + * @return true, если автор и ответственный один и тот же человек. + */ + private boolean isAuthorSameAssignee(Person author, Person assignee) { + return author.getId().equals(assignee.getId()); + } + + private void notifyUserAboutNewPullRequestIfHeIsReviewer(MergeRequest savedMergeRequest) { + final List reviewers = savedMergeRequest.getReviewers(); + final Long gitlabUserId = personInformation.getId(); + + if (checkNotEmpty(reviewers)) { + final boolean isUserInReviewers = reviewers.stream() + .anyMatch(reviewer -> gitlabUserId.equals(reviewer.getId())); + if (isUserInReviewers) { + final String projectName = projectService.getByIdOrThrow(savedMergeRequest.getProjectId()).getName(); + if (!savedMergeRequest.isConflict()) { + notifyService.send( + NewPrNotify.builder() + .projectName(projectName) + .labels(savedMergeRequest.getLabels()) + .author(savedMergeRequest.getAuthor().getName()) + .description(savedMergeRequest.getDescription()) + .title(savedMergeRequest.getTitle()) + .url(savedMergeRequest.getWebUrl()) + .targetBranch(savedMergeRequest.getTargetBranch()) + .sourceBranch(savedMergeRequest.getSourceBranch()) + .build() + ); + } + } } } @Override public MergeRequest update(@NonNull MergeRequest mergeRequest) { - if (mergeRequest.getAssignee() != null) { - personService.create(mergeRequest.getAssignee()); - } - personService.create(mergeRequest.getAuthor()); - final MergeRequest oldMergeRequest = repository.findById(mergeRequest.getId()) - .orElseThrow(notFoundException("МержРеквест не найден")); + .orElseThrow(notFoundException("MergeRequest не найден")); - if (mergeRequest.getNotification() == null) { + final Boolean notification = mergeRequest.getNotification(); + if (checkNull(notification)) { mergeRequest.setNotification(oldMergeRequest.getNotification()); } - if (!oldMergeRequest.getUpdatedDate().equals(mergeRequest.getUpdatedDate()) || oldMergeRequest.isConflict() != mergeRequest.isConflict()) { + if ( + !oldMergeRequest.getUpdatedDate().equals(mergeRequest.getUpdatedDate()) + || oldMergeRequest.isConflict() != mergeRequest.isConflict() + ) { final Project project = projectService.getByIdOrThrow(mergeRequest.getProjectId()); if (TRUE.equals(oldMergeRequest.getNotification())) { - notifyStatus(oldMergeRequest, mergeRequest, project); - notifyConflict(oldMergeRequest, mergeRequest, project); + notifyAboutStatus(oldMergeRequest, mergeRequest, project); + notifyAboutConflict(oldMergeRequest, mergeRequest, project); notifyUpdate(oldMergeRequest, mergeRequest, project); } @@ -112,76 +161,11 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { return oldMergeRequest; } - private void notifyUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { - if ( - !personInformation.getId().equals(mergeRequest.getAuthor().getId()) - && !oldMergeRequest.getDateLastCommit().equals(mergeRequest.getDateLastCommit()) - && !mergeRequest.isConflict() - ) { - final List discussions = discussionService.getAllByMergeRequestId(oldMergeRequest.getId()) - .stream() - .filter(discussion -> Objects.nonNull(discussion.getResponsible())) - .toList(); - final long allTask = discussions.size(); - final long resolvedTask = discussions.stream() - .filter(Discussion::getResolved) - .count(); - final long allYouTasks = discussions.stream() - .filter(discussion -> personInformation.getId().equals(discussion.getFirstNote().getAuthor().getId())) - .count(); - final long resolvedYouTask = discussions.stream() - .filter(discussion -> personInformation.getId().equals(discussion.getFirstNote().getAuthor().getId()) && discussion.getResolved()) - .count(); - notifyService.send( - UpdatePrNotify.builder() - .author(oldMergeRequest.getAuthor().getName()) - .name(oldMergeRequest.getTitle()) - .projectKey(project.getName()) - .url(oldMergeRequest.getWebUrl()) - .allTasks(allTask) - .allResolvedTasks(resolvedTask) - .personTasks(allYouTasks) - .personResolvedTasks(resolvedYouTask) - .build() - ); - } - } - - protected void notifyConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { - if ( - !oldMergeRequest.isConflict() - && mergeRequest.isConflict() - && personInformation.getId().equals(oldMergeRequest.getAuthor().getId()) - ) { - notifyService.send( - ConflictPrNotify.builder() - .sourceBranch(oldMergeRequest.getSourceBranch()) - .name(mergeRequest.getTitle()) - .url(mergeRequest.getWebUrl()) - .projectKey(project.getName()) - .build() - ); - } - } - - protected void notifyStatus(MergeRequest oldMergeRequest, MergeRequest newMergeRequest, Project project) { - final MergeRequestState oldStatus = oldMergeRequest.getState(); - final MergeRequestState newStatus = newMergeRequest.getState(); - if ( - !oldStatus.equals(newStatus) - && oldMergeRequest.getAuthor().getId().equals(personInformation.getId()) - ) { - - notifyService.send( - StatusPrNotify.builder() - .name(newMergeRequest.getTitle()) - .url(oldMergeRequest.getWebUrl()) - .projectName(project.getName()) - .newStatus(newStatus) - .oldStatus(oldStatus) - .build() - ); - } + @Override + public List updateAll(@NonNull List mergeRequests) { + return mergeRequests.stream() + .map(this::update) + .collect(Collectors.toList()); } @Override @@ -225,4 +209,75 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { repository.deleteByIds(mergeRequestIds); } + private void notifyUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { + if ( + !personInformation.getId().equals(mergeRequest.getAuthor().getId()) + && !oldMergeRequest.getDateLastCommit().equals(mergeRequest.getDateLastCommit()) + && !mergeRequest.isConflict() + ) { + final List discussions = discussionService.getAllByMergeRequestId(oldMergeRequest.getId()) + .stream() + .filter(discussion -> Objects.nonNull(discussion.getResponsible())) + .toList(); + final long allTask = discussions.size(); + final long resolvedTask = discussions.stream() + .filter(Discussion::getResolved) + .count(); + final long allYouTasks = discussions.stream() + .filter(discussion -> personInformation.getId().equals(discussion.getFirstNote().getAuthor().getId())) + .count(); + final long resolvedYouTask = discussions.stream() + .filter(discussion -> personInformation.getId().equals(discussion.getFirstNote().getAuthor().getId()) && discussion.getResolved()) + .count(); + notifyService.send( + UpdatePrNotify.builder() + .author(oldMergeRequest.getAuthor().getName()) + .name(oldMergeRequest.getTitle()) + .projectKey(project.getName()) + .url(oldMergeRequest.getWebUrl()) + .allTasks(allTask) + .allResolvedTasks(resolvedTask) + .personTasks(allYouTasks) + .personResolvedTasks(resolvedYouTask) + .build() + ); + } + } + + protected void notifyAboutConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { + if ( + !oldMergeRequest.isConflict() + && mergeRequest.isConflict() + && personInformation.getId().equals(oldMergeRequest.getAuthor().getId()) + ) { + notifyService.send( + ConflictPrNotify.builder() + .sourceBranch(oldMergeRequest.getSourceBranch()) + .name(mergeRequest.getTitle()) + .url(mergeRequest.getWebUrl()) + .projectKey(project.getName()) + .build() + ); + } + } + + protected void notifyAboutStatus(MergeRequest oldMergeRequest, MergeRequest newMergeRequest, Project project) { + final MergeRequestState oldStatus = oldMergeRequest.getState(); + final MergeRequestState newStatus = newMergeRequest.getState(); + if ( + !oldStatus.equals(newStatus) + && oldMergeRequest.getAuthor().getId().equals(personInformation.getId()) + ) { + notifyService.send( + StatusPrNotify.builder() + .name(newMergeRequest.getTitle()) + .url(oldMergeRequest.getWebUrl()) + .projectName(project.getName()) + .newStatus(newStatus) + .oldStatus(oldStatus) + .build() + ); + } + } + } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/ProjectServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/ProjectServiceImpl.java index 6633af1..cedd686 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/ProjectServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/ProjectServiceImpl.java @@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Set; @@ -34,12 +35,15 @@ public class ProjectServiceImpl implements ProjectService { private final PersonInformation personInformation; @Override + @Transactional public Project create(@NonNull Project project) { final Project newProject = repository.save(project); - if (!personInformation.getId().equals(newProject.getCreatorId())) { + final Long gitlabUserId = personInformation.getId(); + + if (!gitlabUserId.equals(newProject.getCreatorId())) { final String authorName = personService.getByIdOrThrown(newProject.getCreatorId()).getName(); - sendNotifyNewProject(newProject, authorName); + notifyAboutNewProject(newProject, authorName); } return newProject; @@ -87,7 +91,7 @@ public class ProjectServiceImpl implements ProjectService { } } - private void sendNotifyNewProject(Project newProject, String authorName) { + private void notifyAboutNewProject(Project newProject, String authorName) { notifyService.send( NewProjectNotify.builder() .projectDescription(newProject.getDescription()) diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/MergeRequestParser.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/MergeRequestParser.java index fef4cca..31a9aa4 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/MergeRequestParser.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/MergeRequestParser.java @@ -4,6 +4,7 @@ import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; import dev.struchkov.bot.gitlab.context.domain.IdAndStatusPr; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; +import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.service.MergeRequestsService; import dev.struchkov.bot.gitlab.context.service.ProjectService; @@ -22,10 +23,15 @@ import org.springframework.stereotype.Service; import java.text.MessageFormat; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT; @Slf4j @@ -47,19 +53,20 @@ public class MergeRequestParser { public void parsingOldMergeRequest() { final Set existIds = mergeRequestsService.getAllId(OLD_STATUSES); - for (IdAndStatusPr existId : existIds) { - final String mrUrl = MessageFormat.format(gitlabProperty.getUrlPullRequest(), existId.getProjectId(), existId.getTwoId()); - final Optional json = HttpParse.request(mrUrl) - .header(ACCEPT) - .header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken()) - .execute(MergeRequestJson.class); - final Optional mergeRequest = json - .map(mergeRequestJson -> { - final MergeRequest newMergeRequest = conversionService.convert(mergeRequestJson, MergeRequest.class); - parsingCommits(newMergeRequest); - return newMergeRequest; - }); - mergeRequest.ifPresent(mergeRequestsService::update); + final List mergeRequests = existIds.stream() + .map(this::getMergeRequest) + .filter(Optional::isPresent) + .map(Optional::get) + .map(mergeRequestJson -> { + final MergeRequest newMergeRequest = conversionService.convert(mergeRequestJson, MergeRequest.class); + parsingCommits(newMergeRequest); + return newMergeRequest; + }) + .collect(Collectors.toList()); + + if (checkNotEmpty(mergeRequests)) { + personMapping(mergeRequests); + mergeRequestsService.updateAll(mergeRequests); } } @@ -83,7 +90,7 @@ public class MergeRequestParser { int page = 1; List mergeRequestJsons = getMergeRequestJsons(project, page); - while (!mergeRequestJsons.isEmpty()) { + while (checkNotEmpty(mergeRequestJsons)) { final Set jsonIds = mergeRequestJsons.stream() .map(MergeRequestJson::getId) @@ -99,6 +106,9 @@ public class MergeRequestParser { return mergeRequest; }) .toList(); + + personMapping(newMergeRequests); + mergeRequestsService.createAll(newMergeRequests); } @@ -106,6 +116,32 @@ public class MergeRequestParser { } } + private static void personMapping(List newMergeRequests) { + final Map personMap = Stream.concat( + newMergeRequests.stream() + .flatMap(mergeRequest -> Stream.of(mergeRequest.getAssignee(), mergeRequest.getAuthor())), + newMergeRequests.stream() + .flatMap(mergeRequest -> mergeRequest.getReviewers().stream()) + ).distinct() + .filter(Objects::nonNull) + .collect(Collectors.toMap(Person::getId, p -> p)); + + for (MergeRequest newMergeRequest : newMergeRequests) { + newMergeRequest.setAuthor(personMap.get(newMergeRequest.getAuthor().getId())); + + final Person assignee = newMergeRequest.getAssignee(); + if (checkNotNull(assignee)) { + newMergeRequest.setAssignee(personMap.get(assignee.getId())); + } + + newMergeRequest.setReviewers( + newMergeRequest.getReviewers().stream() + .map(reviewer -> personMap.get(reviewer.getId())) + .collect(Collectors.toList()) + ); + } + } + private void parsingCommits(MergeRequest mergeRequest) { final List commitJson = HttpParse.request( MessageFormat.format(gitlabProperty.getUrlCommit(), mergeRequest.getProjectId(), mergeRequest.getTwoId()) @@ -125,4 +161,12 @@ public class MergeRequestParser { .executeList(MergeRequestJson.class); } + private Optional getMergeRequest(IdAndStatusPr existId) { + final String mrUrl = MessageFormat.format(gitlabProperty.getUrlPullRequest(), existId.getProjectId(), existId.getTwoId()); + return HttpParse.request(mrUrl) + .header(ACCEPT) + .header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken()) + .execute(MergeRequestJson.class); + } + } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/ProjectParser.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/ProjectParser.java index ed4ba01..6ff3738 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/ProjectParser.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/ProjectParser.java @@ -15,6 +15,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.convert.ConversionService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.text.MessageFormat; import java.util.Collection; @@ -46,10 +47,12 @@ public class ProjectParser { private final GitlabProperty gitlabProperty; private final PersonProperty personProperty; + @Transactional public void parseAllPrivateProject() { parseProjects(PRIVATE); } + @Transactional public void parseAllProjectOwner() { parseProjects(OWNER); } @@ -80,6 +83,20 @@ public class ProjectParser { } } + public void parseByUrl(String projectUrl) { + final ProjectJson projectJson = HttpParse.request(projectUrl) + .header(ACCEPT) + .header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken()) + .execute(ProjectJson.class) + .orElseThrow(convertException("Ошибка получения проекта")); + if (!projectService.existsById(projectJson.getId())) { + createNewPersons(List.of(projectJson)); + + final Project newProject = conversionService.convert(projectJson, Project.class); + projectService.create(newProject); + } + } + private void createNewPersons(List projectJsons) { final Set personCreatorId = projectJsons.stream() .map(ProjectJson::getCreatorId) @@ -113,16 +130,4 @@ public class ProjectParser { .executeList(ProjectJson.class); } - public void parseByUrl(String projectUrl) { - final Project project = HttpParse.request(projectUrl) - .header(ACCEPT) - .header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken()) - .execute(ProjectJson.class) - .map(json -> conversionService.convert(json, Project.class)) - .orElseThrow(convertException("Ошибка получения проекта")); - if (!projectService.existsById(project.getId())) { - projectService.create(project); - } - } - } diff --git a/gitlab-app/src/main/resources/application.yml b/gitlab-app/src/main/resources/application.yml index f991e5d..4e6527a 100644 --- a/gitlab-app/src/main/resources/application.yml +++ b/gitlab-app/src/main/resources/application.yml @@ -32,7 +32,7 @@ gitlab-bot: url-pull-request-close: "${GITLAB_URL}/api/v4/projects/{0,number,#}/merge_requests?state=closed&page={1, number, integer}&per_page=100" url-pull-request-comment: "${GITLAB_URL}/api/v4/projects/{0,number,#}/merge_requests/{1,number,#}/notes?&page={2,number,#}&per_page=100" url-pull-request: "${GITLAB_URL}/api/v4/projects/{0,number,#}/merge_requests/{1,number,#}" - url-merge-request-add: ${GITLAB_URL}/api/v4/projects/{0}%2F{1} + url-merge-request-add: "${GITLAB_URL}/api/v4/projects/" user-url: ${GITLAB_URL}/api/v4/user users-url: ${GITLAB_URL}/api/v4/users url-note: "{0}#note_{1,number,#}" diff --git a/gitlab-app/src/main/resources/liquibase/changelog.xml b/gitlab-app/src/main/resources/liquibase/changelog.xml index be68aec..0bfedec 100644 --- a/gitlab-app/src/main/resources/liquibase/changelog.xml +++ b/gitlab-app/src/main/resources/liquibase/changelog.xml @@ -1,8 +1,9 @@ + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.17.xsd"> + \ No newline at end of file diff --git a/gitlab-app/src/main/resources/liquibase/v.1.0.0/2022-12-03-insert.xml b/gitlab-app/src/main/resources/liquibase/v.1.0.0/2022-12-03-insert.xml index 63f1126..8ff6ba7 100644 --- a/gitlab-app/src/main/resources/liquibase/v.1.0.0/2022-12-03-insert.xml +++ b/gitlab-app/src/main/resources/liquibase/v.1.0.0/2022-12-03-insert.xml @@ -2,7 +2,7 @@ + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.17.xsd"> diff --git a/gitlab-app/src/main/resources/liquibase/v.1.0.0/changelog.xml b/gitlab-app/src/main/resources/liquibase/v.1.0.0/changelog.xml index 9d00dee..31d0925 100644 --- a/gitlab-app/src/main/resources/liquibase/v.1.0.0/changelog.xml +++ b/gitlab-app/src/main/resources/liquibase/v.1.0.0/changelog.xml @@ -1,7 +1,7 @@ + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.17.xsd"> diff --git a/gitlab-app/src/main/resources/liquibase/v.1.1.3/2022-12-05-add-reviewers.xml b/gitlab-app/src/main/resources/liquibase/v.1.1.3/2022-12-05-add-reviewers.xml new file mode 100644 index 0000000..0ad16f5 --- /dev/null +++ b/gitlab-app/src/main/resources/liquibase/v.1.1.3/2022-12-05-add-reviewers.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gitlab-app/src/main/resources/liquibase/v.1.1.3/changelog.xml b/gitlab-app/src/main/resources/liquibase/v.1.1.3/changelog.xml new file mode 100644 index 0000000..c2b406f --- /dev/null +++ b/gitlab-app/src/main/resources/liquibase/v.1.1.3/changelog.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/gitlab-sdk/src/main/java/dev/struchkov/bot/gitlab/sdk/domain/MergeRequestJson.java b/gitlab-sdk/src/main/java/dev/struchkov/bot/gitlab/sdk/domain/MergeRequestJson.java index 3bb7670..73b125f 100644 --- a/gitlab-sdk/src/main/java/dev/struchkov/bot/gitlab/sdk/domain/MergeRequestJson.java +++ b/gitlab-sdk/src/main/java/dev/struchkov/bot/gitlab/sdk/domain/MergeRequestJson.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.Data; import java.time.LocalDateTime; +import java.util.List; import java.util.Set; /** @@ -40,6 +41,8 @@ public class MergeRequestJson { private PersonJson author; private PersonJson assignee; + private List reviewers; + @JsonProperty("web_url") private String webUrl; diff --git a/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/unit/MenuConfig.java b/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/unit/MenuConfig.java index 1bffaf6..2bd93b3 100644 --- a/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/unit/MenuConfig.java +++ b/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/unit/MenuConfig.java @@ -19,7 +19,6 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Component; import java.text.MessageFormat; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -92,9 +91,10 @@ public class MenuConfig { public AnswerText addNewProject() { return AnswerText.builder() .answer(mail -> { - final List urlList = Arrays.stream(mail.getText().split("/")).toList(); - int lastElement = urlList.size() - 1; - final String projectUrl = MessageFormat.format(gitlabProperty.getUrlMergeRequestAdd(), urlList.get(lastElement - 1), urlList.get(lastElement)); + final String mailText = mail.getText(); + final String projectUrl = gitlabProperty.getUrlMergeRequestAdd() + mailText.replace(gitlabProperty.getBaseUrl(), "") + .substring(1) + .replace("/", "%2F"); projectParser.parseByUrl(projectUrl); return boxAnswer("Project added successfully"); }) From e985fe2cbd18985445f20931e495fe92dc421a48 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Mon, 5 Dec 2022 16:41:31 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=20=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D1=85=20=D0=9F=D0=A0=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../context/repository/MergeRequestRepository.java | 3 +++ .../gitlab/context/service/MergeRequestsService.java | 2 ++ .../core/service/impl/MergeRequestsServiceImpl.java | 5 +++++ .../gitlab/data/impl/MergeRequestRepositoryImpl.java | 5 +++++ .../gitlab/data/jpa/MergeRequestJpaRepository.java | 9 +++++---- .../bot/gitlab/telegram/unit/MenuConfig.java | 11 +++++------ 6 files changed, 25 insertions(+), 10 deletions(-) diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/repository/MergeRequestRepository.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/repository/MergeRequestRepository.java index cbe8d6a..921520b 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/repository/MergeRequestRepository.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/repository/MergeRequestRepository.java @@ -30,4 +30,7 @@ public interface MergeRequestRepository { void deleteByIds(Set mergeRequestIds); Page filter(Filter filter, Pageable pageable); + + List findAllByReviewerId(Long personId); + } diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java index d7a22e2..1b42371 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java @@ -38,4 +38,6 @@ public interface MergeRequestsService { void deleteAllById(@NonNull Set mergeRequestIds); + List getAllByReviewerId(@NonNull Long personId); + } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java index eeb8051..312fdda 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java @@ -209,6 +209,11 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { repository.deleteByIds(mergeRequestIds); } + @Override + public List getAllByReviewerId(@NonNull Long personId) { + return repository.findAllByReviewerId(personId); + } + private void notifyUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { if ( !personInformation.getId().equals(mergeRequest.getAuthor().getId()) diff --git a/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/impl/MergeRequestRepositoryImpl.java b/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/impl/MergeRequestRepositoryImpl.java index dcb21ef..41473da 100644 --- a/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/impl/MergeRequestRepositoryImpl.java +++ b/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/impl/MergeRequestRepositoryImpl.java @@ -63,4 +63,9 @@ public class MergeRequestRepositoryImpl implements MergeRequestRepository { return jpaRepository.findAll(filter.>build(), pageable); } + @Override + public List findAllByReviewerId(Long personId) { + return jpaRepository.findAllByReviewersIn(personId); + } + } diff --git a/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/jpa/MergeRequestJpaRepository.java b/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/jpa/MergeRequestJpaRepository.java index 6fd0c40..ef4184c 100644 --- a/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/jpa/MergeRequestJpaRepository.java +++ b/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/jpa/MergeRequestJpaRepository.java @@ -18,19 +18,20 @@ import java.util.Set; public interface MergeRequestJpaRepository extends JpaRepositoryImplementation { - Set findAllByIdIn(Set ids); - void deleteAllByIdIn(Collection id); @Query("SELECT new dev.struchkov.bot.gitlab.context.domain.IdAndStatusPr(p.id, p.twoId, p.projectId, p.state) FROM MergeRequest p WHERE p.state IN :states") Set findAllIdByStateIn(@Param("states") Set states); - @Query("SELECT p.id from MergeRequest p") + @Query("SELECT p.id FROM MergeRequest p") Set findAllIds(); - @Query("SELECT p.author.id from MergeRequest p WHERE p.id = :id") + @Query("SELECT p.author.id FROM MergeRequest p WHERE p.id = :id") Optional findAuthorById(@Param("id") Long id); List findAllByAssigneeId(Long userId); + @Query("SELECT mr FROM MergeRequest mr LEFT JOIN mr.reviewers r WHERE r.id = :reviewerId") + List findAllByReviewersIn(@Param("reviewerId") Long reviewerId); + } diff --git a/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/unit/MenuConfig.java b/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/unit/MenuConfig.java index 2bd93b3..a79a07f 100644 --- a/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/unit/MenuConfig.java +++ b/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/unit/MenuConfig.java @@ -13,9 +13,8 @@ import dev.struchkov.godfather.main.domain.annotation.Unit; import dev.struchkov.godfather.main.domain.content.Mail; import dev.struchkov.godfather.simple.core.unit.AnswerText; import dev.struchkov.godfather.simple.core.unit.MainUnit; +import dev.struchkov.haiti.utils.Checker; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Component; import java.text.MessageFormat; @@ -136,10 +135,9 @@ public class MenuConfig { return AnswerText.builder() .triggerPhrase(GET_ASSIGNEE_MERGE_REQUEST) .answer(() -> { - final Long userId = personInformation.getId(); - final Page sheet = mergeRequestsService.getAll(getAssigneeFilter(userId), PageRequest.of(0, 20)); - if (sheet.hasContent()) { - final List mergeRequests = sheet.getContent(); + final Long gitlabUserId = personInformation.getId(); + final List mergeRequests = mergeRequestsService.getAllByReviewerId(gitlabUserId); + if (Checker.checkNotEmpty(mergeRequests)) { final String text = mergeRequests.stream() .map(mergeRequest -> MessageFormat.format("[{0}]({1})", mergeRequest.getTitle(), mergeRequest.getWebUrl())) .collect(Collectors.joining("\n")); @@ -150,6 +148,7 @@ public class MenuConfig { .build(); } + private MergeRequestFilter getAssigneeFilter(Long userId) { final MergeRequestFilter mergeRequestFilter = new MergeRequestFilter(); mergeRequestFilter.setAssignee(userId); From 0d57bee7853d19d18fee3538dcc18c7d5c764d7b Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Mon, 5 Dec 2022 16:50:05 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20pipline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitlab/context/domain/ExistContainer.java | 41 +++++++++++++++++++ .../context/domain/ExistsContainer.java | 40 ------------------ .../context/domain/entity/Pipeline.java | 3 +- .../context/service/DiscussionService.java | 4 +- .../context/service/MergeRequestsService.java | 4 +- .../gitlab/context/service/PersonService.java | 4 +- .../context/service/PipelineService.java | 4 +- .../context/service/ProjectService.java | 4 +- .../service/impl/DiscussionServiceImpl.java | 8 ++-- .../impl/MergeRequestsServiceImpl.java | 8 ++-- .../core/service/impl/PersonServiceImpl.java | 8 ++-- .../service/impl/PipelineServiceImpl.java | 16 ++++---- .../core/service/impl/ProjectServiceImpl.java | 8 ++-- .../core/service/parser/DiscussionParser.java | 8 ++-- .../service/parser/MergeRequestParser.java | 8 ++-- .../core/service/parser/PipelineParser.java | 12 +++--- .../core/service/parser/ProjectParser.java | 12 +++--- 17 files changed, 97 insertions(+), 95 deletions(-) create mode 100644 bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ExistContainer.java delete mode 100644 bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ExistsContainer.java diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ExistContainer.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ExistContainer.java new file mode 100644 index 0000000..f16664b --- /dev/null +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ExistContainer.java @@ -0,0 +1,41 @@ +package dev.struchkov.bot.gitlab.context.domain; + +import lombok.NonNull; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +public class ExistContainer { + + protected final List container; + protected final boolean allFound; + protected final Set idNoFound; + + protected ExistContainer(List container, boolean allFound, Set idNoFound) { + this.container = container; + this.allFound = allFound; + this.idNoFound = idNoFound; + } + + public static ExistContainer allFind(@NonNull List container) { + return new ExistContainer<>(container, true, Collections.emptySet()); + } + + public static ExistContainer notAllFind(@NonNull List container, @NonNull Set idNoFound) { + return new ExistContainer<>(container, false, idNoFound); + } + + public List getContainer() { + return container; + } + + public boolean isAllFound() { + return allFound; + } + + public Set getIdNoFound() { + return idNoFound; + } + +} diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ExistsContainer.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ExistsContainer.java deleted file mode 100644 index be81a33..0000000 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ExistsContainer.java +++ /dev/null @@ -1,40 +0,0 @@ -package dev.struchkov.bot.gitlab.context.domain; - -import lombok.NonNull; - -import java.util.Collection; -import java.util.Collections; - -public class ExistsContainer { - - protected final Collection container; - protected final boolean allFound; - protected final Collection idNoFound; - - protected ExistsContainer(Collection container, boolean allFound, Collection idNoFound) { - this.container = container; - this.allFound = allFound; - this.idNoFound = idNoFound; - } - - public static ExistsContainer allFind(@NonNull Collection container) { - return new ExistsContainer<>(container, true, Collections.emptyList()); - } - - public static ExistsContainer notAllFind(@NonNull Collection container, @NonNull Collection idNoFound) { - return new ExistsContainer<>(container, false, idNoFound); - } - - public Collection getContainer() { - return container; - } - - public boolean isAllFound() { - return allFound; - } - - public Collection getIdNoFound() { - return idNoFound; - } - -} diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Pipeline.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Pipeline.java index 2270802..5da5094 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Pipeline.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Pipeline.java @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -53,7 +54,7 @@ public class Pipeline { @JoinColumn(name = "project_id") private Project project; - @ManyToOne + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) @JoinColumn(name = "person_id") private Person person; diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/DiscussionService.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/DiscussionService.java index 11707a7..06663eb 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/DiscussionService.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/DiscussionService.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.context.service; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import lombok.NonNull; import org.springframework.data.domain.Page; @@ -31,7 +31,7 @@ public interface DiscussionService { */ List getAllByMergeRequestId(@NonNull Long mergeRequestId); - ExistsContainer existsById(@NonNull Set discussionIds); + ExistContainer existsById(@NonNull Set discussionIds); List createAll(@NonNull List newDiscussions); diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java index 1b42371..bc44bf0 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/MergeRequestsService.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.context.service; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.IdAndStatusPr; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; @@ -32,7 +32,7 @@ public interface MergeRequestsService { Page getAll(@NonNull MergeRequestFilter filter, Pageable pagination); - ExistsContainer existsById(@NonNull Set mergeRequestIds); + ExistContainer existsById(@NonNull Set mergeRequestIds); List createAll(List newMergeRequests); diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/PersonService.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/PersonService.java index 2fd6772..0aa4d7a 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/PersonService.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/PersonService.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.context.service; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.entity.Person; import lombok.NonNull; @@ -18,7 +18,7 @@ public interface PersonService { Person getByIdOrThrown(@NonNull Long personId); - ExistsContainer existsById(Set personIds); + ExistContainer existsById(Set personIds); List createAll(List newPersons); diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/PipelineService.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/PipelineService.java index f2ceacd..bd0a877 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/PipelineService.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/PipelineService.java @@ -1,9 +1,9 @@ package dev.struchkov.bot.gitlab.context.service; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.PipelineStatus; import dev.struchkov.bot.gitlab.context.domain.entity.Pipeline; import dev.struchkov.bot.gitlab.context.domain.filter.PipelineFilter; -import dev.struchkov.haiti.context.domain.ExistsContainer; import lombok.NonNull; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -25,7 +25,7 @@ public interface PipelineService { Page getAll(@NonNull PipelineFilter filter, @NonNull Pageable pagination); - ExistsContainer existsById(@NonNull Set pipelineIds); + ExistContainer existsById(@NonNull Set pipelineIds); void deleteAllById(Set pipelineIds); diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/ProjectService.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/ProjectService.java index 8b23c4a..343e5c5 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/ProjectService.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/ProjectService.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.context.service; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.entity.Project; import lombok.NonNull; import org.springframework.data.domain.Page; @@ -26,6 +26,6 @@ public interface ProjectService { boolean existsById(Long projectId); - ExistsContainer existsById(Set projectIds); + ExistContainer existsById(Set projectIds); } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java index 31d2084..863b50b 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.impl; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; @@ -212,16 +212,16 @@ public class DiscussionServiceImpl implements DiscussionService { } @Override - public ExistsContainer existsById(@NonNull Set discussionIds) { + public ExistContainer existsById(@NonNull Set discussionIds) { final List existsEntity = repository.findAllById(discussionIds); final Set existsIds = existsEntity.stream().map(Discussion::getId).collect(Collectors.toSet()); if (existsIds.containsAll(discussionIds)) { - return dev.struchkov.bot.gitlab.context.domain.ExistsContainer.allFind(existsEntity); + return ExistContainer.allFind(existsEntity); } else { final Set noExistsId = discussionIds.stream() .filter(id -> !existsIds.contains(id)) .collect(Collectors.toSet()); - return ExistsContainer.notAllFind(existsEntity, noExistsId); + return ExistContainer.notAllFind(existsEntity, noExistsId); } } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java index 312fdda..e39ed38 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.impl; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.IdAndStatusPr; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.PersonInformation; @@ -184,16 +184,16 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { } @Override - public ExistsContainer existsById(@NonNull Set mergeRequestIds) { + public ExistContainer existsById(@NonNull Set mergeRequestIds) { final List existsEntity = repository.findAllById(mergeRequestIds); final Set existsIds = existsEntity.stream().map(MergeRequest::getId).collect(Collectors.toSet()); if (existsIds.containsAll(mergeRequestIds)) { - return ExistsContainer.allFind(existsEntity); + return ExistContainer.allFind(existsEntity); } else { final Set noExistsId = mergeRequestIds.stream() .filter(id -> !existsIds.contains(id)) .collect(Collectors.toSet()); - return ExistsContainer.notAllFind(existsEntity, noExistsId); + return ExistContainer.notAllFind(existsEntity, noExistsId); } } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/PersonServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/PersonServiceImpl.java index 0d8632a..15fc01c 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/PersonServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/PersonServiceImpl.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.impl; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.repository.PersonRepository; import dev.struchkov.bot.gitlab.context.service.PersonService; @@ -40,16 +40,16 @@ public class PersonServiceImpl implements PersonService { } @Override - public ExistsContainer existsById(Set personIds) { + public ExistContainer existsById(Set personIds) { final List existsEntity = repository.findAllById(personIds); final Set existsIds = existsEntity.stream().map(Person::getId).collect(Collectors.toSet()); if (existsIds.containsAll(personIds)) { - return ExistsContainer.allFind(existsEntity); + return ExistContainer.allFind(existsEntity); } else { final Set noExistsId = personIds.stream() .filter(id -> !existsIds.contains(id)) .collect(Collectors.toSet()); - return ExistsContainer.notAllFind(existsEntity, noExistsId); + return ExistContainer.notAllFind(existsEntity, noExistsId); } } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/PipelineServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/PipelineServiceImpl.java index 3d145fa..623ba15 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/PipelineServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/PipelineServiceImpl.java @@ -1,5 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.impl; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.PipelineStatus; import dev.struchkov.bot.gitlab.context.domain.entity.Person; @@ -8,15 +9,14 @@ import dev.struchkov.bot.gitlab.context.domain.filter.PipelineFilter; import dev.struchkov.bot.gitlab.context.domain.notify.pipeline.PipelineNotify; import dev.struchkov.bot.gitlab.context.repository.PipelineRepository; import dev.struchkov.bot.gitlab.context.service.NotifyService; -import dev.struchkov.bot.gitlab.context.service.PersonService; import dev.struchkov.bot.gitlab.context.service.PipelineService; import dev.struchkov.bot.gitlab.core.service.impl.filter.PipelineFilterService; -import dev.struchkov.haiti.context.domain.ExistsContainer; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Set; @@ -27,6 +27,7 @@ import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.FAILED; import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.SKIPPED; import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.SUCCESS; import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; /** * Реализация сервиса для работы с пайплайнами. @@ -42,14 +43,13 @@ public class PipelineServiceImpl implements PipelineService { private final NotifyService notifyService; private final PipelineRepository repository; - private final PersonService personService; private final PipelineFilterService pipelineFilterService; private final PersonInformation personInformation; @Override + @Transactional public Pipeline create(@NonNull Pipeline pipeline) { - personService.create(pipeline.getPerson()); final Pipeline newPipeline = repository.save(pipeline); notifyNewPipeline(pipeline, "n/a"); return newPipeline; @@ -87,7 +87,7 @@ public class PipelineServiceImpl implements PipelineService { private boolean isNeedNotifyNewPipeline(@NonNull Pipeline pipeline) { final Person personPipelineCreator = pipeline.getPerson(); return notificationStatus.contains(pipeline.getStatus()) // Пайплайн имеет статус необходимый для уведомления - && personPipelineCreator != null + && checkNotNull(personPipelineCreator) // Создатель пайплайна не null && personInformation.getId().equals(personPipelineCreator.getId()); // Пользователь приложения является инициатором пайплайна } @@ -102,16 +102,16 @@ public class PipelineServiceImpl implements PipelineService { } @Override - public ExistsContainer existsById(@NonNull Set pipelineIds) { + public ExistContainer existsById(@NonNull Set pipelineIds) { final List existsEntity = repository.findAllById(pipelineIds); final Set existsIds = existsEntity.stream().map(Pipeline::getId).collect(Collectors.toSet()); if (existsIds.containsAll(pipelineIds)) { - return ExistsContainer.allFind(existsEntity); + return ExistContainer.allFind(existsEntity); } else { final Set noExistsId = pipelineIds.stream() .filter(id -> !existsIds.contains(id)) .collect(Collectors.toSet()); - return ExistsContainer.notAllFind(existsEntity, noExistsId); + return ExistContainer.notAllFind(existsEntity, noExistsId); } } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/ProjectServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/ProjectServiceImpl.java index cedd686..bdad5f4 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/ProjectServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/ProjectServiceImpl.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.impl; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.domain.notify.NewProjectNotify; @@ -78,16 +78,16 @@ public class ProjectServiceImpl implements ProjectService { } @Override - public ExistsContainer existsById(Set projectIds) { + public ExistContainer existsById(Set projectIds) { final List existsEntity = repository.findAllById(projectIds); final Set existsIds = existsEntity.stream().map(Project::getId).collect(Collectors.toSet()); if (existsIds.containsAll(projectIds)) { - return ExistsContainer.allFind(existsEntity); + return ExistContainer.allFind(existsEntity); } else { final Set noExistsId = projectIds.stream() .filter(id -> !existsIds.contains(id)) .collect(Collectors.toSet()); - return ExistsContainer.notAllFind(existsEntity, noExistsId); + return ExistContainer.notAllFind(existsEntity, noExistsId); } } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/DiscussionParser.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/DiscussionParser.java index b0b770e..346f36d 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/DiscussionParser.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/DiscussionParser.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.parser; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; import dev.struchkov.bot.gitlab.context.domain.entity.Note; @@ -75,10 +75,10 @@ public class DiscussionParser { .map(DiscussionJson::getId) .collect(Collectors.toUnmodifiableSet()); - final ExistsContainer existsContainer = discussionService.existsById(discussionIds); - if (!existsContainer.isAllFound()) { + final ExistContainer existContainer = discussionService.existsById(discussionIds); + if (!existContainer.isAllFound()) { final List newDiscussions = discussionJson.stream() - .filter(json -> existsContainer.getIdNoFound().contains(json.getId())) + .filter(json -> existContainer.getIdNoFound().contains(json.getId())) .map(json -> { final Discussion discussion = conversionService.convert(json, Discussion.class); discussion.setMergeRequest(mergeRequest); diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/MergeRequestParser.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/MergeRequestParser.java index 31a9aa4..61d171e 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/MergeRequestParser.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/MergeRequestParser.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.parser; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.IdAndStatusPr; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; @@ -96,10 +96,10 @@ public class MergeRequestParser { .map(MergeRequestJson::getId) .collect(Collectors.toSet()); - final ExistsContainer existsContainer = mergeRequestsService.existsById(jsonIds); - if (!existsContainer.isAllFound()) { + final ExistContainer existContainer = mergeRequestsService.existsById(jsonIds); + if (!existContainer.isAllFound()) { final List newMergeRequests = mergeRequestJsons.stream() - .filter(json -> existsContainer.getIdNoFound().contains(json.getId())) + .filter(json -> existContainer.getIdNoFound().contains(json.getId())) .map(json -> { final MergeRequest mergeRequest = conversionService.convert(json, MergeRequest.class); parsingCommits(mergeRequest); diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/PipelineParser.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/PipelineParser.java index b195199..08d2b14 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/PipelineParser.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/PipelineParser.java @@ -1,5 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.parser; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.PipelineStatus; import dev.struchkov.bot.gitlab.context.domain.entity.Pipeline; import dev.struchkov.bot.gitlab.context.domain.entity.Project; @@ -9,7 +10,6 @@ import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty; import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.sdk.domain.PipelineJson; -import dev.struchkov.haiti.context.domain.ExistsContainer; import dev.struchkov.haiti.utils.network.HttpParse; import lombok.RequiredArgsConstructor; import org.springframework.core.convert.ConversionService; @@ -19,7 +19,6 @@ import org.springframework.stereotype.Service; import java.text.MessageFormat; import java.time.LocalDateTime; -import java.util.Collection; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -31,6 +30,7 @@ import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.PREPARING; import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.RUNNING; import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.WAITING_FOR_RESOURCE; import static dev.struchkov.haiti.context.exception.ConvertException.convertException; +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT; /** @@ -75,17 +75,17 @@ public class PipelineParser { LocalDateTime newLastUpdate = LocalDateTime.now(); List pipelineJsons = getPipelineJsons(project.getId(), page, lastUpdate); - while (!pipelineJsons.isEmpty()) { + while (checkNotEmpty(pipelineJsons)) { final Set jsonIds = pipelineJsons.stream() .map(PipelineJson::getId) .collect(Collectors.toSet()); - final ExistsContainer existsContainer = pipelineService.existsById(jsonIds); + final ExistContainer existContainer = pipelineService.existsById(jsonIds); - if (!existsContainer.isAllFound()) { + if (!existContainer.isAllFound()) { - final Collection idsNotFound = existsContainer.getIdNoFound(); + final Set idsNotFound = existContainer.getIdNoFound(); for (Long newId : idsNotFound) { final Pipeline newPipeline = HttpParse.request( diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/ProjectParser.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/ProjectParser.java index 6ff3738..25342f6 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/ProjectParser.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/ProjectParser.java @@ -1,6 +1,6 @@ package dev.struchkov.bot.gitlab.core.service.parser; -import dev.struchkov.bot.gitlab.context.domain.ExistsContainer; +import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.service.PersonService; @@ -69,9 +69,9 @@ public class ProjectParser { createNewPersons(projectJsons); - final ExistsContainer existsContainer = projectService.existsById(projectIds); + final ExistContainer existContainer = projectService.existsById(projectIds); final List newProjects = projectJsons.stream() - .filter(json -> existsContainer.getIdNoFound().contains(json.getId())) + .filter(json -> existContainer.getIdNoFound().contains(json.getId())) .map(json -> conversionService.convert(json, Project.class)) .toList(); @@ -102,10 +102,10 @@ public class ProjectParser { .map(ProjectJson::getCreatorId) .collect(Collectors.toSet()); - final ExistsContainer existsContainer = personService.existsById(personCreatorId); + final ExistContainer existContainer = personService.existsById(personCreatorId); - if (!existsContainer.isAllFound()) { - final Collection notFoundId = existsContainer.getIdNoFound(); + if (!existContainer.isAllFound()) { + final Collection notFoundId = existContainer.getIdNoFound(); final List newPersons = notFoundId.stream() .map( From a6dce07b3f5516ea640ce69646b14f3e319a47b7 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Mon, 5 Dec 2022 22:25:59 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../context/domain/AssigneeChanged.java | 40 +++++++ .../context/domain/ReviewerChanged.java | 38 ++++++ .../context/domain/entity/Discussion.java | 7 +- .../context/domain/entity/MergeRequest.java | 7 +- .../gitlab/context/domain/entity/Note.java | 10 +- .../context/service/DiscussionService.java | 2 + .../service/impl/DiscussionServiceImpl.java | 87 +++++++++----- .../impl/MergeRequestsServiceImpl.java | 96 ++++++++++----- .../core/service/parser/DiscussionParser.java | 109 +++++++++++++++--- bot-data/pom.xml | 4 +- .../data/impl/DiscussionRepositoryImpl.java | 2 + gitlab-app/src/main/resources/application.yml | 2 +- 12 files changed, 318 insertions(+), 86 deletions(-) create mode 100644 bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/AssigneeChanged.java create mode 100644 bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ReviewerChanged.java diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/AssigneeChanged.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/AssigneeChanged.java new file mode 100644 index 0000000..12df35c --- /dev/null +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/AssigneeChanged.java @@ -0,0 +1,40 @@ +package dev.struchkov.bot.gitlab.context.domain; + +import dev.struchkov.bot.gitlab.context.domain.entity.Person; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; +import static dev.struchkov.haiti.utils.Checker.checkNull; + +@Getter +@RequiredArgsConstructor +public enum AssigneeChanged { + + BECOME(true), + DELETED(true), + NOT_AFFECT_USER(true), + NOT_CHANGED(false); + + private final boolean changed; + + public static AssigneeChanged valueOf(Long gitlabUserId, Person oldAssignee, Person newAssignee) { + if (checkNull(oldAssignee) && checkNotNull(newAssignee) && gitlabUserId.equals(newAssignee.getId())) { + return AssigneeChanged.BECOME; + } + if (checkNotNull(oldAssignee) && checkNull(newAssignee) && gitlabUserId.equals(oldAssignee.getId())) { + return AssigneeChanged.DELETED; + } + if (checkNotNull(oldAssignee) && checkNotNull(newAssignee) && !oldAssignee.getId().equals(newAssignee.getId())) { + if (gitlabUserId.equals(oldAssignee.getId())) { + return AssigneeChanged.DELETED; + } + if (gitlabUserId.equals(newAssignee.getId())) { + return AssigneeChanged.BECOME; + } + return AssigneeChanged.NOT_AFFECT_USER; + } + return AssigneeChanged.NOT_CHANGED; + } + +} \ No newline at end of file diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ReviewerChanged.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ReviewerChanged.java new file mode 100644 index 0000000..4dd38b2 --- /dev/null +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/ReviewerChanged.java @@ -0,0 +1,38 @@ +package dev.struchkov.bot.gitlab.context.domain; + +import dev.struchkov.bot.gitlab.context.domain.entity.Person; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Getter +@RequiredArgsConstructor +public enum ReviewerChanged { + + BECOME(true), + DELETED(true), + NOT_AFFECT_USER(true), + NOT_CHANGED(false); + + private final boolean changed; + + public static ReviewerChanged valueOf(Long gitlabUserId, List oldReviewers, List newReviewers) { + final Map oldMap = oldReviewers.stream().collect(Collectors.toMap(Person::getId, p -> p)); + final Map newMap = newReviewers.stream().collect(Collectors.toMap(Person::getId, p -> p)); + + if (!oldMap.keySet().equals(newMap.keySet())) { + if (oldMap.containsKey(gitlabUserId) && !newMap.containsKey(gitlabUserId)) { + return ReviewerChanged.DELETED; + } + if (!oldMap.containsKey(gitlabUserId) && newMap.containsKey(gitlabUserId)) { + return ReviewerChanged.BECOME; + } + return ReviewerChanged.NOT_AFFECT_USER; + } + return ReviewerChanged.NOT_CHANGED; + } + +} \ No newline at end of file diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Discussion.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Discussion.java index 2887848..4ca9352 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Discussion.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Discussion.java @@ -30,14 +30,14 @@ public class Discussion { @Column(name = "id") private String id; - @ManyToOne + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) @JoinColumn(name = "responsible_id") private Person responsible; @Column(name = "resolved") private Boolean resolved; - @ManyToOne() + @ManyToOne @JoinTable( name = "discussion_merge_request", joinColumns = @JoinColumn(name = "discussion_id"), @@ -50,7 +50,8 @@ public class Discussion { fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, - CascadeType.MERGE + CascadeType.MERGE, + CascadeType.REFRESH } ) private List notes; diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/MergeRequest.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/MergeRequest.java index 8ec97e5..5734e1e 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/MergeRequest.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/MergeRequest.java @@ -73,18 +73,17 @@ public class MergeRequest { @Column(name = "conflict") private boolean conflict; - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}) + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name = "author_id") private Person author; - @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}) + @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinColumn(name = "assignee_id") private Person assignee; @OneToMany( fetch = FetchType.LAZY, - cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}, - orphanRemoval = true + cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) @JoinTable( name = "merge_request_reviewer", diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Note.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Note.java index 504d3d0..608c2a8 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Note.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Note.java @@ -12,6 +12,9 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import java.time.LocalDateTime; +import static javax.persistence.CascadeType.MERGE; +import static javax.persistence.CascadeType.PERSIST; + @Getter @Setter @Entity @@ -20,7 +23,8 @@ import java.time.LocalDateTime; public class Note { @Id - @Column + @Column(name = "id") + @EqualsAndHashCode.Include private Long id; @Column(name = "type") @@ -35,7 +39,7 @@ public class Note { @Column(name = "updated_date") private LocalDateTime updated; - @ManyToOne + @ManyToOne(cascade = {PERSIST, MERGE}) @JoinColumn(name = "author_id") private Person author; @@ -57,7 +61,7 @@ public class Note { @Column(name = "resolved") private Boolean resolved; - @ManyToOne + @ManyToOne(cascade = {PERSIST, MERGE}) @JoinColumn(name = "resolved_id") private Person resolvedBy; diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/DiscussionService.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/DiscussionService.java index 06663eb..4765d15 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/DiscussionService.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/service/DiscussionService.java @@ -18,6 +18,8 @@ public interface DiscussionService { Discussion update(@NonNull Discussion discussion); + List updateAll(@NonNull List discussions); + /** * Метод отправляющий коментарий в дискуссию. * diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java index 863b50b..e8241c7 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java @@ -5,13 +5,13 @@ import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; import dev.struchkov.bot.gitlab.context.domain.entity.Note; +import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.notify.comment.CommentNotify; import dev.struchkov.bot.gitlab.context.domain.notify.task.TaskCloseNotify; import dev.struchkov.bot.gitlab.context.domain.notify.task.TaskNewNotify; import dev.struchkov.bot.gitlab.context.repository.DiscussionRepository; import dev.struchkov.bot.gitlab.context.service.DiscussionService; import dev.struchkov.bot.gitlab.context.service.NotifyService; -import dev.struchkov.bot.gitlab.context.service.PersonService; import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty; import dev.struchkov.bot.gitlab.core.utils.StringUtils; @@ -25,6 +25,7 @@ import okhttp3.RequestBody; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.text.MessageFormat; @@ -38,6 +39,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; import static java.lang.Boolean.FALSE; /** @@ -52,7 +54,6 @@ public class DiscussionServiceImpl implements DiscussionService { protected static final Pattern PATTERN = Pattern.compile("@[\\w]+"); - private final PersonService personService; private final DiscussionRepository repository; private final PersonInformation personInformation; @@ -62,14 +63,18 @@ public class DiscussionServiceImpl implements DiscussionService { private final NotifyService notifyService; @Override + @Transactional public Discussion create(@NonNull Discussion discussion) { - discussion.getNotes().forEach(note -> personService.create(note.getAuthor())); - discussion.getNotes().forEach(this::notificationPersonal); - discussion.getNotes().forEach(note -> notifyNewNote(note, discussion)); + final List notes = discussion.getNotes(); + + notes.forEach(this::notificationPersonal); + notes.forEach(note -> notifyNewNote(note, discussion)); final boolean resolved = discussion.getNotes().stream() .allMatch(note -> note.isResolvable() && note.getResolved()); + discussion.setResolved(resolved); + return repository.save(discussion); } @@ -89,10 +94,10 @@ public class DiscussionServiceImpl implements DiscussionService { } private boolean isNeedNotifyNewNote(Note note, Discussion discussion) { - final Long personId = personInformation.getId(); + final Long gitlabUserId = personInformation.getId(); return note.isResolvable() // Тип комментария требует решения (Задачи) - && personId.equals(discussion.getResponsible().getId()) // Создатель дискуссии пользователь приложения - && !personId.equals(note.getAuthor().getId()) // Создатель комментария не пользователь системы + && gitlabUserId.equals(discussion.getResponsible().getId()) // Создатель дискуссии пользователь приложения + && !gitlabUserId.equals(note.getAuthor().getId()) // Создатель комментария не пользователь системы && FALSE.equals(note.getResolved()); // Комментарий не отмечен как решенный } @@ -100,40 +105,68 @@ public class DiscussionServiceImpl implements DiscussionService { public Discussion update(@NonNull Discussion discussion) { final Discussion oldDiscussion = repository.findById(discussion.getId()) .orElseThrow(notFoundException("Дискуссия не найдена")); - final Map idAndNoteMap = oldDiscussion - .getNotes().stream() - .collect(Collectors.toMap(Note::getId, note -> note)); - // Пользователь участвовал в обсуждении - final boolean userParticipatedInDiscussion = discussion.getNotes().stream() - .anyMatch(note -> personInformation.getId().equals(note.getAuthor().getId())); - - discussion.setMergeRequest(oldDiscussion.getMergeRequest()); discussion.setResponsible(oldDiscussion.getResponsible()); - discussion.getNotes().forEach(note -> updateNote(note, idAndNoteMap, userParticipatedInDiscussion)); + discussion.setMergeRequest(oldDiscussion.getMergeRequest()); + + final Person responsiblePerson = discussion.getResponsible(); + if (checkNotNull(responsiblePerson)) { + for (Note note : discussion.getNotes()) { + if (responsiblePerson.getId().equals(note.getAuthor().getId())) { + note.setAuthor(responsiblePerson); + } + final Person resolvedBy = note.getResolvedBy(); + if (checkNotNull(resolvedBy)) { + if (responsiblePerson.getId().equals(resolvedBy.getId())) { + note.setResolvedBy(responsiblePerson); + } + } + } + } + notifyUpdateNote(oldDiscussion, discussion); final boolean resolved = discussion.getNotes().stream() .allMatch(note -> note.isResolvable() && note.getResolved()); + discussion.setResolved(resolved); return repository.save(discussion); } - private void updateNote(Note note, Map noteMap, boolean inDiscussion) { - if (noteMap.containsKey(note.getId())) { - final Note oldNote = noteMap.get(note.getId()); + @Override + public List updateAll(@NonNull List discussions) { + return discussions.stream() + .map(this::update) + .collect(Collectors.toList()); + } - if (note.isResolvable()) { - updateTask(note, oldNote); - } + private void notifyUpdateNote(Discussion oldDiscussion, Discussion discussion) { + final Map noteMap = oldDiscussion + .getNotes().stream() + .collect(Collectors.toMap(Note::getId, n -> n)); + + // Пользователь участвовал в обсуждении + final boolean userParticipatedInDiscussion = oldDiscussion.getNotes().stream() + .anyMatch(note -> personInformation.getId().equals(note.getAuthor().getId())); + + for (Note newNote : discussion.getNotes()) { + final Long newNoteId = newNote.getId(); + if (noteMap.containsKey(newNoteId)) { + final Note oldNote = noteMap.get(newNoteId); + + if (newNote.isResolvable()) { + updateTask(newNote, oldNote); + } - } else { - if (inDiscussion) { - notifyNewAnswer(note); } else { - notificationPersonal(note); + if (userParticipatedInDiscussion) { + notifyNewAnswer(newNote); + } else { + notificationPersonal(newNote); + } } } + } private void notifyNewAnswer(Note note) { diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java index e39ed38..0fb8cf5 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java @@ -1,9 +1,11 @@ package dev.struchkov.bot.gitlab.core.service.impl; +import dev.struchkov.bot.gitlab.context.domain.AssigneeChanged; import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.IdAndStatusPr; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.PersonInformation; +import dev.struchkov.bot.gitlab.context.domain.ReviewerChanged; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; import dev.struchkov.bot.gitlab.context.domain.entity.Person; @@ -117,24 +119,29 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { if (isUserInReviewers) { final String projectName = projectService.getByIdOrThrow(savedMergeRequest.getProjectId()).getName(); if (!savedMergeRequest.isConflict()) { - notifyService.send( - NewPrNotify.builder() - .projectName(projectName) - .labels(savedMergeRequest.getLabels()) - .author(savedMergeRequest.getAuthor().getName()) - .description(savedMergeRequest.getDescription()) - .title(savedMergeRequest.getTitle()) - .url(savedMergeRequest.getWebUrl()) - .targetBranch(savedMergeRequest.getTargetBranch()) - .sourceBranch(savedMergeRequest.getSourceBranch()) - .build() - ); + sendNotifyAboutNewMr(savedMergeRequest, projectName); } } } } + private void sendNotifyAboutNewMr(MergeRequest savedMergeRequest, String projectName) { + notifyService.send( + NewPrNotify.builder() + .projectName(projectName) + .labels(savedMergeRequest.getLabels()) + .author(savedMergeRequest.getAuthor().getName()) + .description(savedMergeRequest.getDescription()) + .title(savedMergeRequest.getTitle()) + .url(savedMergeRequest.getWebUrl()) + .targetBranch(savedMergeRequest.getTargetBranch()) + .sourceBranch(savedMergeRequest.getSourceBranch()) + .build() + ); + } + @Override + @Transactional public MergeRequest update(@NonNull MergeRequest mergeRequest) { final MergeRequest oldMergeRequest = repository.findById(mergeRequest.getId()) .orElseThrow(notFoundException("MergeRequest не найден")); @@ -144,24 +151,53 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { mergeRequest.setNotification(oldMergeRequest.getNotification()); } - if ( + final Long gitlabUserId = personInformation.getId(); + final AssigneeChanged assigneeChanged = AssigneeChanged.valueOf(gitlabUserId, oldMergeRequest.getAssignee(), mergeRequest.getAssignee()); + final ReviewerChanged reviewerChanged = ReviewerChanged.valueOf(gitlabUserId, oldMergeRequest.getReviewers(), mergeRequest.getReviewers()); + + final boolean isChangedMr = !oldMergeRequest.getUpdatedDate().equals(mergeRequest.getUpdatedDate()) - || oldMergeRequest.isConflict() != mergeRequest.isConflict() - ) { + || oldMergeRequest.isConflict() != mergeRequest.isConflict(); + final boolean isChangedLinkedEntity = reviewerChanged.isChanged() || assigneeChanged.isChanged(); + + if (isChangedMr || isChangedLinkedEntity) { final Project project = projectService.getByIdOrThrow(mergeRequest.getProjectId()); - if (TRUE.equals(oldMergeRequest.getNotification())) { + if (TRUE.equals(notification) && isChangedMr) { notifyAboutStatus(oldMergeRequest, mergeRequest, project); notifyAboutConflict(oldMergeRequest, mergeRequest, project); - notifyUpdate(oldMergeRequest, mergeRequest, project); + notifyAboutUpdate(oldMergeRequest, mergeRequest, project); + } + + if (TRUE.equals(notification) && isChangedLinkedEntity) { + notifyReviewer(reviewerChanged, mergeRequest, project); + notifyAssignee(assigneeChanged, mergeRequest, project); } return repository.save(mergeRequest); } + return oldMergeRequest; } + + //TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление + private void notifyAssignee(AssigneeChanged assigneeChanged, MergeRequest mergeRequest, Project project) { + switch (assigneeChanged) { + case BECOME -> sendNotifyAboutNewMr(mergeRequest, project.getName()); + } + } + + //TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление ревьювера + //TODO [05.12.2022|uPagge]: Заменить тип уведомления на самостоятельный + private void notifyReviewer(ReviewerChanged reviewerChanged, MergeRequest mergeRequest, Project project) { + switch (reviewerChanged) { + case BECOME -> sendNotifyAboutNewMr(mergeRequest, project.getName()); + } + } + @Override + @Transactional public List updateAll(@NonNull List mergeRequests) { return mergeRequests.stream() .map(this::update) @@ -214,11 +250,13 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { return repository.findAllByReviewerId(personId); } - private void notifyUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { + private void notifyAboutUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { + final Long gitlabUserId = personInformation.getId(); + if ( - !personInformation.getId().equals(mergeRequest.getAuthor().getId()) - && !oldMergeRequest.getDateLastCommit().equals(mergeRequest.getDateLastCommit()) - && !mergeRequest.isConflict() + !gitlabUserId.equals(mergeRequest.getAuthor().getId()) // Автор MR не пользователь приложения + && !oldMergeRequest.getDateLastCommit().equals(mergeRequest.getDateLastCommit()) // Изменилась дата последнего коммита + && !mergeRequest.isConflict() // MR не находится в состоянии конфликта ) { final List discussions = discussionService.getAllByMergeRequestId(oldMergeRequest.getId()) .stream() @@ -229,10 +267,10 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { .filter(Discussion::getResolved) .count(); final long allYouTasks = discussions.stream() - .filter(discussion -> personInformation.getId().equals(discussion.getFirstNote().getAuthor().getId())) + .filter(discussion -> gitlabUserId.equals(discussion.getFirstNote().getAuthor().getId())) .count(); final long resolvedYouTask = discussions.stream() - .filter(discussion -> personInformation.getId().equals(discussion.getFirstNote().getAuthor().getId()) && discussion.getResolved()) + .filter(discussion -> gitlabUserId.equals(discussion.getFirstNote().getAuthor().getId()) && discussion.getResolved()) .count(); notifyService.send( UpdatePrNotify.builder() @@ -250,10 +288,11 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { } protected void notifyAboutConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { + final Long gitlabUserId = personInformation.getId(); if ( - !oldMergeRequest.isConflict() - && mergeRequest.isConflict() - && personInformation.getId().equals(oldMergeRequest.getAuthor().getId()) + !oldMergeRequest.isConflict() // У старого MR не было конфликта + && mergeRequest.isConflict() // А у нового есть + && gitlabUserId.equals(oldMergeRequest.getAuthor().getId()) // и MR создан пользователем бота ) { notifyService.send( ConflictPrNotify.builder() @@ -269,9 +308,10 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { protected void notifyAboutStatus(MergeRequest oldMergeRequest, MergeRequest newMergeRequest, Project project) { final MergeRequestState oldStatus = oldMergeRequest.getState(); final MergeRequestState newStatus = newMergeRequest.getState(); + final Long gitlabUserId = personInformation.getId(); if ( - !oldStatus.equals(newStatus) - && oldMergeRequest.getAuthor().getId().equals(personInformation.getId()) + !oldStatus.equals(newStatus) // статус изменился + && gitlabUserId.equals(oldMergeRequest.getAuthor().getId()) // создатель MR является пользователем бота ) { notifyService.send( StatusPrNotify.builder() diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/DiscussionParser.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/DiscussionParser.java index 346f36d..b22a778 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/DiscussionParser.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/parser/DiscussionParser.java @@ -4,6 +4,7 @@ import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; import dev.struchkov.bot.gitlab.context.domain.entity.Note; +import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.service.DiscussionService; import dev.struchkov.bot.gitlab.context.service.MergeRequestsService; import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; @@ -17,13 +18,20 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Component; import java.text.MessageFormat; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; +import java.util.stream.Stream; import static dev.struchkov.bot.gitlab.core.utils.StringUtils.H_PRIVATE_TOKEN; +import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; +import static dev.struchkov.haiti.utils.Checker.checkNotNull; +import static dev.struchkov.haiti.utils.Checker.checkNull; import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT; /** @@ -52,8 +60,12 @@ public class DiscussionParser { Page mergeRequestSheet = mergeRequestsService.getAll(PageRequest.of(page, COUNT)); while (mergeRequestSheet.hasContent()) { - mergeRequestSheet.getContent() - .forEach(this::processingMergeRequest); + final List mergeRequests = mergeRequestSheet.getContent(); + + for (MergeRequest mergeRequest : mergeRequests) { + processingMergeRequest(mergeRequest); + } + mergeRequestSheet = mergeRequestsService.getAll(PageRequest.of(++page, COUNT)); } } @@ -86,9 +98,52 @@ public class DiscussionParser { discussion.getNotes().forEach(createNoteLink(mergeRequest)); return discussion; }) - .filter(discussion -> discussion.getNotes() != null && !discussion.getNotes().isEmpty()) + // Фильтрация специально стоит после map(). Таким образом отбрасываются системные уведомления + .filter(discussion -> checkNotEmpty(discussion.getNotes())) .toList(); - discussionService.createAll(newDiscussions); + + if (checkNotEmpty(newDiscussions)) { + personMapping(newDiscussions); + discussionService.createAll(newDiscussions); + } + + } + } + + private void personMapping(List newDiscussions) { + final Stream firstStream = Stream.concat( + newDiscussions.stream() + .flatMap(discussion -> discussion.getNotes().stream()) + .map(Note::getResolvedBy) + .filter(Objects::nonNull), + newDiscussions.stream() + .flatMap(discussion -> discussion.getNotes().stream()) + .map(Note::getAuthor) + .filter(Objects::nonNull) + ); + + final Map personMap = Stream.concat( + firstStream, + newDiscussions.stream() + .map(Discussion::getResponsible) + .filter(Objects::nonNull) + ).distinct() + .collect(Collectors.toMap(Person::getId, p -> p)); + + for (Discussion newDiscussion : newDiscussions) { + final Person responsible = newDiscussion.getResponsible(); + if (checkNotNull(responsible)) { + newDiscussion.setResponsible(personMap.get(responsible.getId())); + } + + for (Note note : newDiscussion.getNotes()) { + note.setAuthor(personMap.get(note.getAuthor().getId())); + + final Person resolvedBy = note.getResolvedBy(); + if (checkNotNull(resolvedBy)) { + note.setResolvedBy(personMap.get(resolvedBy.getId())); + } + } } } @@ -97,33 +152,47 @@ public class DiscussionParser { */ public void scanOldDiscussions() { int page = 0; - Page discussionSheet = discussionService.getAll(PageRequest.of(page, COUNT)); + Page discussionPage = discussionService.getAll(PageRequest.of(page, COUNT)); - while (discussionSheet.hasContent()) { - final List discussions = discussionSheet.getContent(); + while (discussionPage.hasContent()) { + final List discussions = discussionPage.getContent(); + // Удаляем обсуждения, которые потеряли свои MR + //TODO [05.12.2022|uPagge]: Проверить целесообразность этого действия + discussions.stream() + .filter(discussion -> checkNull(discussion.getMergeRequest())) + .map(Discussion::getId) + .forEach(discussionService::deleteById); + + final List newDiscussions = new ArrayList<>(); for (Discussion discussion : discussions) { - if (discussion.getMergeRequest() != null) { - final Optional optNewDiscussion = HttpParse.request(createLinkOldDiscussion(discussion)) - .header(ACCEPT) - .header(H_PRIVATE_TOKEN, personProperty.getToken()) - .execute(DiscussionJson.class) + if (checkNotNull(discussion.getMergeRequest())) { + getOldDiscussionJson(discussion) .map(json -> { final Discussion newDiscussion = conversionService.convert(json, Discussion.class); newDiscussion.getNotes().forEach(createNoteLink(discussion.getMergeRequest())); return newDiscussion; - }); - optNewDiscussion.ifPresent(discussionService::update); - } else { - discussionService.deleteById(discussion.getId()); + }).ifPresent(newDiscussions::add); } } - discussionSheet = discussionService.getAll(PageRequest.of(++page, COUNT)); + if (checkNotEmpty(newDiscussions)) { + personMapping(newDiscussions); + discussionService.updateAll(newDiscussions); + } + + discussionPage = discussionService.getAll(PageRequest.of(++page, COUNT)); } } + private Optional getOldDiscussionJson(Discussion discussion) { + return HttpParse.request(createLinkOldDiscussion(discussion)) + .header(ACCEPT) + .header(H_PRIVATE_TOKEN, personProperty.getToken()) + .execute(DiscussionJson.class); + } + private String createLinkOldDiscussion(Discussion discussion) { return MessageFormat.format( gitlabProperty.getUrlOneDiscussion(), @@ -142,7 +211,11 @@ public class DiscussionParser { private Consumer createNoteLink(MergeRequest mergeRequest) { return note -> { - final String url = MessageFormat.format(gitlabProperty.getUrlNote(), mergeRequest.getWebUrl(), note.getId()); + final String url = MessageFormat.format( + gitlabProperty.getUrlNote(), + mergeRequest.getWebUrl(), + note.getId() + ); note.setWebUrl(url); }; } diff --git a/bot-data/pom.xml b/bot-data/pom.xml index d86ba85..0ce8d3b 100644 --- a/bot-data/pom.xml +++ b/bot-data/pom.xml @@ -21,8 +21,8 @@ bot-context - org.springframework.data - spring-data-jpa + org.springframework.boot + spring-boot-starter-data-jpa org.liquibase diff --git a/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/impl/DiscussionRepositoryImpl.java b/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/impl/DiscussionRepositoryImpl.java index 3ed56d5..2782985 100644 --- a/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/impl/DiscussionRepositoryImpl.java +++ b/bot-data/src/main/java/dev/struchkov/bot/gitlab/data/impl/DiscussionRepositoryImpl.java @@ -5,6 +5,7 @@ import dev.struchkov.bot.gitlab.context.repository.DiscussionRepository; import dev.struchkov.bot.gitlab.data.jpa.DiscussionJpaRepository; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; @@ -16,6 +17,7 @@ import java.util.Set; /** * @author upagge 11.02.2021 */ +@Slf4j @Repository @RequiredArgsConstructor public class DiscussionRepositoryImpl implements DiscussionRepository { diff --git a/gitlab-app/src/main/resources/application.yml b/gitlab-app/src/main/resources/application.yml index 4e6527a..45657eb 100644 --- a/gitlab-app/src/main/resources/application.yml +++ b/gitlab-app/src/main/resources/application.yml @@ -7,7 +7,7 @@ spring: liquibase: change-log: classpath:liquibase/changelog.xml jpa: - show-sql: false + show-sql: true hibernate: ddl-auto: none database-platform: org.hibernate.dialect.PostgreSQLDialect From f8a6c36eea867571a51771ed24e6db62fb053083 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Wed, 7 Dec 2022 12:12:23 +0300 Subject: [PATCH 08/10] =?UTF-8?q?=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B3=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitlab-ci.yml | 34 ++++++++- .../gitlab/context/domain/MessageSend.java | 3 +- .../context/domain/entity/Discussion.java | 10 +++ .../notify/comment/AnswerCommentNotify.java | 1 - .../domain/notify/comment/CommentNotify.java | 31 -------- .../notify/comment/NewCommentNotify.java | 43 +++++++++++ .../notify/task/DiscussionNewNotify.java | 59 ++++++++++++++ .../domain/notify/task/TaskNewNotify.java | 34 --------- .../bot/gitlab/context/utils/Smile.java | 4 +- .../service/impl/DiscussionServiceImpl.java | 76 +++++++++++++------ .../impl/MergeRequestsServiceImpl.java | 1 + gitlab-app/src/main/resources/application.yml | 2 +- pom.xml | 2 +- .../gitlab/telegram/service/StartNotify.java | 2 +- 14 files changed, 207 insertions(+), 95 deletions(-) delete mode 100644 bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/CommentNotify.java create mode 100644 bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/NewCommentNotify.java create mode 100644 bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/task/DiscussionNewNotify.java delete mode 100644 bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/task/TaskNewNotify.java diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index eeb5118..3e77a12 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,37 @@ stages: - build - deploy -build: +build-develop: + image: maven:3.8.6-eclipse-temurin-17 + stage: build + variables: + MAVEN_OPTS: "-Dmaven.repo.local=./.m2/repository" + only: + - develop + except: + - tags + script: + - 'mvn -U clean package' + artifacts: + paths: + - gitlab-app/target/gitlab-notification.jar + +docker-build-develop: + image: upagge/docker-buildx:latest + stage: deploy + only: + - develop + except: + - tags + services: + - docker:dind + before_script: + - echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY --username $CI_REGISTRY_USER --password-stdin + script: + - docker buildx create --use + - docker buildx build --push --platform linux/amd64,linux/arm64/v8 -t "$CI_REGISTRY_IMAGE:develop" . + +build-release: image: maven:3.8.6-eclipse-temurin-17 stage: build variables: @@ -17,7 +47,7 @@ build: paths: - gitlab-app/target/gitlab-notification.jar -docker-build: +docker-build-release: image: upagge/docker-buildx:latest stage: deploy only: diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/MessageSend.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/MessageSend.java index c7e9898..bb9319d 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/MessageSend.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/MessageSend.java @@ -12,9 +12,10 @@ import lombok.Setter; @Builder @NoArgsConstructor @AllArgsConstructor -@EqualsAndHashCode(of = "id") +@EqualsAndHashCode(onlyExplicitlyIncluded = true) public class MessageSend { + @EqualsAndHashCode.Include private Long id; private Long telegramId; private String message; diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Discussion.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Discussion.java index 4ca9352..5eda83a 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Discussion.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/entity/Discussion.java @@ -15,6 +15,7 @@ import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Table; import java.util.List; +import java.util.Optional; /** * @author upagge 11.02.2021 @@ -65,4 +66,13 @@ public class Discussion { return this.notes.get(0); } + public Optional getPrevLastNote() { + final int size = notes.size(); + if (size > 2) { + return Optional.of(notes.get(size - 2)); + } + return Optional.empty(); + } + + } diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/AnswerCommentNotify.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/AnswerCommentNotify.java index 951e988..df275a0 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/AnswerCommentNotify.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/AnswerCommentNotify.java @@ -2,7 +2,6 @@ package dev.struchkov.bot.gitlab.context.domain.notify.comment; import dev.struchkov.bot.gitlab.context.domain.Answer; import dev.struchkov.bot.gitlab.context.domain.notify.Notify; -import dev.struchkov.bot.gitlab.context.service.AppSettingService; import dev.struchkov.bot.gitlab.context.utils.Smile; import dev.struchkov.haiti.utils.Strings; import lombok.Builder; diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/CommentNotify.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/CommentNotify.java deleted file mode 100644 index 1f22e22..0000000 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/CommentNotify.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.struchkov.bot.gitlab.context.domain.notify.comment; - -import dev.struchkov.bot.gitlab.context.domain.notify.Notify; -import dev.struchkov.bot.gitlab.context.utils.Smile; -import lombok.Builder; - -import java.text.MessageFormat; - -import static dev.struchkov.haiti.utils.Strings.escapeMarkdown; - -public record CommentNotify( - String url, - String authorName, - String message -) implements Notify { - - @Builder - public CommentNotify { - } - - @Override - public String generateMessage() { - return MessageFormat.format( - "{0} *New mention* | [MR]({1}){2}*{3}*: {4}", - Smile.COMMENT.getValue(), url, Smile.HR.getValue(), authorName, escapeMarkdown(message) - ); - } - -} - - diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/NewCommentNotify.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/NewCommentNotify.java new file mode 100644 index 0000000..6385b1f --- /dev/null +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/comment/NewCommentNotify.java @@ -0,0 +1,43 @@ +package dev.struchkov.bot.gitlab.context.domain.notify.comment; + +import dev.struchkov.bot.gitlab.context.domain.notify.Notify; +import dev.struchkov.bot.gitlab.context.utils.Smile; +import lombok.Builder; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; +import static dev.struchkov.haiti.utils.Strings.escapeMarkdown; + +@Builder +public record NewCommentNotify( + String url, + String discussionMessage, + String discussionAuthor, + String previousMessage, + String previousAuthor, + String authorName, + String message +) implements Notify { + + @Override + public String generateMessage() { + + final StringBuilder builder = new StringBuilder(Smile.COMMENT.getValue()).append(" [New answer in discussion](").append(url).append(")\n--- --- --- ---"); + + if (checkNotNull(discussionMessage)) { + builder.append("\n-- -- discussion first message -- --\n") + .append("*").append(discussionAuthor).append("*: ").append(escapeMarkdown(discussionMessage)); + } + + if (checkNotNull(previousMessage)) { + builder.append("\n-- -- -- previous message -- -- --\n") + .append("*").append(previousAuthor).append("*: ").append(escapeMarkdown(previousMessage)); + } + + builder.append("\n-- -- -- --- new answer --- -- -- --\n") + .append("*").append(authorName).append("*: ").append(escapeMarkdown(message)); + return builder.toString(); + } + +} + + diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/task/DiscussionNewNotify.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/task/DiscussionNewNotify.java new file mode 100644 index 0000000..69c0877 --- /dev/null +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/task/DiscussionNewNotify.java @@ -0,0 +1,59 @@ +package dev.struchkov.bot.gitlab.context.domain.notify.task; + +import dev.struchkov.bot.gitlab.context.utils.Smile; +import dev.struchkov.haiti.utils.Pair; +import lombok.Builder; +import lombok.Getter; +import lombok.Singular; + +import java.util.List; +import java.util.stream.Collectors; + +import static dev.struchkov.haiti.utils.Checker.checkNotNull; +import static dev.struchkov.haiti.utils.Strings.escapeMarkdown; + +/** + * @author upagge 10.09.2020 + */ +@Getter +public class DiscussionNewNotify extends TaskNotify { + + private final String mrName; + private final List> notes; + + @Builder + public DiscussionNewNotify( + String mrName, + String authorName, + String url, + String discussionMessage, + @Singular List> notes + ) { + super(authorName, url, discussionMessage); + this.mrName = mrName; + this.notes = notes; + } + + @Override + public String generateMessage() { + final StringBuilder builder = new StringBuilder(Smile.TASK.getValue()).append(" [New discussion](").append(url).append(")") + .append(Smile.HR.getValue()) + .append(escapeMarkdown(mrName)) + .append(Smile.HR.getValue()) + .append("*").append(authorName).append("*: ").append(escapeMarkdown(messageTask)); + + if (checkNotNull(notes)) { + builder.append("\n-- -- -- -- comments -- -- -- --\n") + .append(convertNotes(notes)); + } + + return builder.toString(); + } + + private String convertNotes(List> notes) { + return notes.stream() + .map(note -> "*" + note.getKey() + "*: " + note.getValue()) + .collect(Collectors.joining("\n")); + } + +} diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/task/TaskNewNotify.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/task/TaskNewNotify.java deleted file mode 100644 index 8066f57..0000000 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/task/TaskNewNotify.java +++ /dev/null @@ -1,34 +0,0 @@ -package dev.struchkov.bot.gitlab.context.domain.notify.task; - -import dev.struchkov.bot.gitlab.context.utils.Smile; -import lombok.Builder; -import lombok.Getter; - -import java.text.MessageFormat; - -import static dev.struchkov.haiti.utils.Strings.escapeMarkdown; - -/** - * @author upagge 10.09.2020 - */ -@Getter -public class TaskNewNotify extends TaskNotify { - - @Builder - protected TaskNewNotify( - String authorName, - String url, - String messageTask - ) { - super(authorName, url, messageTask); - } - - @Override - public String generateMessage() { - return MessageFormat.format( - "{0} *New [task]({1}) assigned{2}*{3}*: {4}", - Smile.TASK.getValue(), url, Smile.HR.getValue(), authorName, escapeMarkdown(messageTask) - ); - } - -} diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/utils/Smile.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/utils/Smile.java index f29556b..721ddda 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/utils/Smile.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/utils/Smile.java @@ -33,7 +33,9 @@ public enum Smile { DANGEROUS("⚠️"), COMMENT("\uD83D\uDCAC"), ARROW("➜"), - HR("\n -- -- -- -- --\n"), + SHORT_HR("\n-- -- --\n"), + HR("\n-- -- -- -- --\n"), + HR2("\n-- -- -- -- -- -- -- -- -- --\n"), FAILURE("❌"), SUCCESS("✅"), BUILD("♻️"), diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java index e8241c7..46277c5 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/DiscussionServiceImpl.java @@ -6,15 +6,16 @@ import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; import dev.struchkov.bot.gitlab.context.domain.entity.Note; import dev.struchkov.bot.gitlab.context.domain.entity.Person; -import dev.struchkov.bot.gitlab.context.domain.notify.comment.CommentNotify; +import dev.struchkov.bot.gitlab.context.domain.notify.comment.NewCommentNotify; +import dev.struchkov.bot.gitlab.context.domain.notify.task.DiscussionNewNotify; import dev.struchkov.bot.gitlab.context.domain.notify.task.TaskCloseNotify; -import dev.struchkov.bot.gitlab.context.domain.notify.task.TaskNewNotify; import dev.struchkov.bot.gitlab.context.repository.DiscussionRepository; import dev.struchkov.bot.gitlab.context.service.DiscussionService; import dev.struchkov.bot.gitlab.context.service.NotifyService; import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty; import dev.struchkov.bot.gitlab.core.utils.StringUtils; +import dev.struchkov.haiti.utils.Pair; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -33,6 +34,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -67,8 +69,11 @@ public class DiscussionServiceImpl implements DiscussionService { public Discussion create(@NonNull Discussion discussion) { final List notes = discussion.getNotes(); - notes.forEach(this::notificationPersonal); - notes.forEach(note -> notifyNewNote(note, discussion)); + if (isNeedNotifyNewNote(discussion)) { + notifyNewDiscussion(discussion); + } else { + notes.forEach(this::notificationPersonal); + } final boolean resolved = discussion.getNotes().stream() .allMatch(note -> note.isResolvable() && note.getResolved()); @@ -81,24 +86,37 @@ public class DiscussionServiceImpl implements DiscussionService { /** *

Уведомляет пользователя, если появился новый комментарий

*/ - private void notifyNewNote(Note note, Discussion discussion) { - if (isNeedNotifyNewNote(note, discussion)) { - notifyService.send( - TaskNewNotify.builder() - .authorName(note.getAuthor().getName()) - .messageTask(note.getBody()) - .url(note.getWebUrl()) - .build() - ); + private void notifyNewDiscussion(Discussion discussion) { + final Note firstNote = discussion.getFirstNote(); + final List notes = discussion.getNotes(); + + + final MergeRequest mergeRequest = discussion.getMergeRequest(); + final DiscussionNewNotify.DiscussionNewNotifyBuilder notifyBuilder = DiscussionNewNotify.builder() + .mrName(mergeRequest.getTitle()) + .authorName(firstNote.getAuthor().getName()) + .discussionMessage(firstNote.getBody()) + .url(firstNote.getWebUrl()); + + if (notes.size() > 1) { + for (int i = 1; i < notes.size(); i++) { + final Note note = notes.get(i); + notifyBuilder.note( + new Pair<>(note.getAuthor().getName(), note.getBody()) + ); + } } + + notifyService.send(notifyBuilder.build()); } - private boolean isNeedNotifyNewNote(Note note, Discussion discussion) { + private boolean isNeedNotifyNewNote(Discussion discussion) { + final Note firstNote = discussion.getFirstNote(); final Long gitlabUserId = personInformation.getId(); - return note.isResolvable() // Тип комментария требует решения (Задачи) - && gitlabUserId.equals(discussion.getResponsible().getId()) // Создатель дискуссии пользователь приложения - && !gitlabUserId.equals(note.getAuthor().getId()) // Создатель комментария не пользователь системы - && FALSE.equals(note.getResolved()); // Комментарий не отмечен как решенный + return firstNote.isResolvable() // Тип комментария требует решения (Задачи) + && gitlabUserId.equals(discussion.getResponsible().getId()) // Ответственный за дискуссию пользователь + && !gitlabUserId.equals(firstNote.getAuthor().getId()) // Создатель комментария не пользователь системы + && FALSE.equals(firstNote.getResolved()); // Комментарий не отмечен как решенный } @Override @@ -160,7 +178,7 @@ public class DiscussionServiceImpl implements DiscussionService { } else { if (userParticipatedInDiscussion) { - notifyNewAnswer(newNote); + notifyNewAnswer(discussion, newNote); } else { notificationPersonal(newNote); } @@ -169,11 +187,25 @@ public class DiscussionServiceImpl implements DiscussionService { } - private void notifyNewAnswer(Note note) { + private void notifyNewAnswer(Discussion discussion, Note note) { if (!personInformation.getId().equals(note.getAuthor().getId())) { + final Note firstNote = discussion.getFirstNote(); + final Optional prevLastNote = discussion.getPrevLastNote(); + + + final NewCommentNotify.NewCommentNotifyBuilder notifyBuilder = NewCommentNotify.builder(); + + if (prevLastNote.isPresent()) { + final Note prevNote = prevLastNote.get(); + notifyBuilder.previousMessage(prevNote.getBody()); + notifyBuilder.previousAuthor(prevNote.getAuthor().getName()); + } + notifyService.send( - CommentNotify.builder() + notifyBuilder .url(note.getWebUrl()) + .discussionMessage(firstNote.getBody()) + .discussionAuthor(firstNote.getAuthor().getName()) .message(note.getBody()) .authorName(note.getAuthor().getName()) .build() @@ -287,7 +319,7 @@ public class DiscussionServiceImpl implements DiscussionService { } if (recipientsLogins.contains(personInformation.getUsername())) { notifyService.send( - CommentNotify.builder() + NewCommentNotify.builder() .authorName(note.getAuthor().getName()) .message(note.getBody()) .url(note.getWebUrl()) diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java index 0fb8cf5..72c1747 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java @@ -241,6 +241,7 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { } @Override + @Transactional public void deleteAllById(@NonNull Set mergeRequestIds) { repository.deleteByIds(mergeRequestIds); } diff --git a/gitlab-app/src/main/resources/application.yml b/gitlab-app/src/main/resources/application.yml index 45657eb..4e6527a 100644 --- a/gitlab-app/src/main/resources/application.yml +++ b/gitlab-app/src/main/resources/application.yml @@ -7,7 +7,7 @@ spring: liquibase: change-log: classpath:liquibase/changelog.xml jpa: - show-sql: true + show-sql: false hibernate: ddl-auto: none database-platform: org.hibernate.dialect.PostgreSQLDialect diff --git a/pom.xml b/pom.xml index cc958f8..61dfeee 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ UTF-8 UTF-8 - 0.0.38 + 0.0.39 2.2 diff --git a/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/service/StartNotify.java b/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/service/StartNotify.java index 0173756..9de610a 100644 --- a/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/service/StartNotify.java +++ b/telegram-bot/src/main/java/dev/struchkov/bot/gitlab/telegram/service/StartNotify.java @@ -25,7 +25,7 @@ public class StartNotify { if (!settingService.isFirstStart()) { notifyService.send( SimpleTextNotify.builder() - .message("Привет. Желаю продуктивного дня :)" + + .message("Hello. I wish you a productive day :)" + "\n-- -- -- -- --\n" + "Version " + appProperty.getVersion() + " | Developer: [uPagge](https://mark.struchkov.dev)") .build() From ee1425b5afc6955e75d24b831a8f5b0032363b2e Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Thu, 8 Dec 2022 22:40:21 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D1=83=D0=B2=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=20=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8=20MR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notify/pullrequest/UpdatePrNotify.java | 24 +++++++--- .../impl/MergeRequestsServiceImpl.java | 45 ++++++++++--------- 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/pullrequest/UpdatePrNotify.java b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/pullrequest/UpdatePrNotify.java index 99a30b0..ed1a36d 100644 --- a/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/pullrequest/UpdatePrNotify.java +++ b/bot-context/src/main/java/dev/struchkov/bot/gitlab/context/domain/notify/pullrequest/UpdatePrNotify.java @@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.utils.Smile; import lombok.Builder; import lombok.Getter; -import java.text.MessageFormat; - @Getter public class UpdatePrNotify extends PrNotify { @@ -36,10 +34,24 @@ public class UpdatePrNotify extends PrNotify { @Override public String generateMessage() { - return MessageFormat.format( - "{0} *MergeRequest update | {6}*{3}[{1}]({2}){3}{4}: {5}", - Smile.UPDATE.getValue(), title, url, Smile.HR.getValue(), Smile.AUTHOR.getValue(), author, projectName, allTasks, allResolvedTasks, personTasks, personResolvedTasks - ); + final StringBuilder builder = new StringBuilder(Smile.UPDATE.getValue()).append(" *MergeRequest update | ").append(projectName).append("*") + .append(Smile.HR.getValue()) + .append("[").append(title).append("](").append(url).append(")"); + + + if (allTasks > 0) { + builder.append(Smile.HR.getValue()) + .append("All tasks: ").append(allResolvedTasks).append("/").append(allTasks); + + if (personTasks > 0) { + builder.append("\nYour tasks: ").append(personResolvedTasks).append("/").append(personTasks); + } + } + + builder.append(Smile.HR.getValue()) + .append(Smile.AUTHOR.getValue()).append(": ").append(author); + + return builder.toString(); } } diff --git a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java index 72c1747..7021c7e 100644 --- a/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java +++ b/bot-core/src/main/java/dev/struchkov/bot/gitlab/core/service/impl/MergeRequestsServiceImpl.java @@ -29,14 +29,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; import static dev.struchkov.haiti.utils.Checker.checkNotEmpty; import static dev.struchkov.haiti.utils.Checker.checkNotNull; -import static dev.struchkov.haiti.utils.Checker.checkNull; import static java.lang.Boolean.TRUE; @Service @@ -146,8 +144,8 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { final MergeRequest oldMergeRequest = repository.findById(mergeRequest.getId()) .orElseThrow(notFoundException("MergeRequest не найден")); - final Boolean notification = mergeRequest.getNotification(); - if (checkNull(notification)) { + final Boolean notification = oldMergeRequest.getNotification(); + if (checkNotNull(notification)) { mergeRequest.setNotification(oldMergeRequest.getNotification()); } @@ -252,27 +250,34 @@ public class MergeRequestsServiceImpl implements MergeRequestsService { } private void notifyAboutUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { - final Long gitlabUserId = personInformation.getId(); + final Long botUserGitlabId = personInformation.getId(); if ( - !gitlabUserId.equals(mergeRequest.getAuthor().getId()) // Автор MR не пользователь приложения + !botUserGitlabId.equals(mergeRequest.getAuthor().getId()) // Автор MR не пользователь приложения && !oldMergeRequest.getDateLastCommit().equals(mergeRequest.getDateLastCommit()) // Изменилась дата последнего коммита && !mergeRequest.isConflict() // MR не находится в состоянии конфликта ) { - final List discussions = discussionService.getAllByMergeRequestId(oldMergeRequest.getId()) - .stream() - .filter(discussion -> Objects.nonNull(discussion.getResponsible())) - .toList(); - final long allTask = discussions.size(); - final long resolvedTask = discussions.stream() - .filter(Discussion::getResolved) - .count(); - final long allYouTasks = discussions.stream() - .filter(discussion -> gitlabUserId.equals(discussion.getFirstNote().getAuthor().getId())) - .count(); - final long resolvedYouTask = discussions.stream() - .filter(discussion -> gitlabUserId.equals(discussion.getFirstNote().getAuthor().getId()) && discussion.getResolved()) - .count(); + + long allTask = 0; + long resolvedTask = 0; + long allYouTasks = 0; + long resolvedYouTask = 0; + final List discussions = discussionService.getAllByMergeRequestId(oldMergeRequest.getId()); + for (Discussion discussion : discussions) { + if (checkNotNull(discussion.getResponsible())) { + final boolean isBotUserAuthorDiscussion = botUserGitlabId.equals(discussion.getFirstNote().getAuthor().getId()); + allTask += 1; + if (isBotUserAuthorDiscussion) { + allYouTasks += 1; + } + if (TRUE.equals(discussion.getResolved())) { + resolvedTask += 1; + if (isBotUserAuthorDiscussion) { + resolvedYouTask += 1; + } + } + } + } notifyService.send( UpdatePrNotify.builder() .author(oldMergeRequest.getAuthor().getName()) From b87e516fc050044feef34a86092c5f9ec6772860 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Fri, 9 Dec 2022 10:53:17 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D1=80=D1=83?= =?UTF-8?q?=D1=81=D1=81=D0=BA=D0=B8=D1=85=20=D1=81=D0=B8=D0=BC=D0=B2=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=B2=20=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 881ac59..01ddd53 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,4 +34,4 @@ COPY --from=app-build $BUILD_PATH/spring-boot-loader/ ./ COPY --from=app-build $BUILD_PATH/dependencies/ ./ COPY --from=app-build $BUILD_PATH/application/ ./ -ENTRYPOINT java -DTELEGRAM_BOT_USERNAME=$TELEGRAM_BOT_USERNAME -DTELEGRAM_BOT_TOKEN=$TELEGRAM_BOT_TOKEN -DTELEGRAM_PERSON_ID=$TELEGRAM_PERSON_ID -DDATASOURCE_URL=$DATASOURCE_URL -DDATASOURCE_PASSWORD=$DATASOURCE_PASSWORD -DDATASOURCE_USERNAME=$DATASOURCE_USERNAME -DGITLAB_PERSONAL_TOKEN=$GITLAB_PERSONAL_TOKEN -DGITLAB_URL=$GITLAB_URL -DGITLAB_REPLACE_URL=$GITLAB_REPLACE_URL org.springframework.boot.loader.JarLauncher \ No newline at end of file +ENTRYPOINT java -Dfile.encoding=UTF8 -Dconsole.encoding=UTF8 -DTELEGRAM_BOT_USERNAME=$TELEGRAM_BOT_USERNAME -DTELEGRAM_BOT_TOKEN=$TELEGRAM_BOT_TOKEN -DTELEGRAM_PERSON_ID=$TELEGRAM_PERSON_ID -DDATASOURCE_URL=$DATASOURCE_URL -DDATASOURCE_PASSWORD=$DATASOURCE_PASSWORD -DDATASOURCE_USERNAME=$DATASOURCE_USERNAME -DGITLAB_PERSONAL_TOKEN=$GITLAB_PERSONAL_TOKEN -DGITLAB_URL=$GITLAB_URL -DGITLAB_REPLACE_URL=$GITLAB_REPLACE_URL org.springframework.boot.loader.JarLauncher \ No newline at end of file