From b74f7ae7daddb34f3e59357968bf4a1026226a9e Mon Sep 17 00:00:00 2001 From: upagge Date: Tue, 7 Apr 2020 18:28:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/change/ChangeType.java | 2 +- .../domain/change/ConflictPrChange.java | 21 +++++ .../domain/entity/PullRequest.java | 3 + .../dto/bitbucket/MergeResult.java | 10 +++ .../bitbucketbot/dto/bitbucket/Outcome.java | 8 ++ .../dto/bitbucket/Properties.java | 10 +++ .../dto/bitbucket/PullRequestJson.java | 1 + .../scheduler/SchedulerChangeParsing.java | 4 + .../scheduler/SchedulerPullRequest.java | 83 +++++++++++-------- .../converter/PullRequestJsonConverter.java | 10 +++ .../com/tsc/bitbucketbot/utils/Message.java | 6 ++ src/main/resources/liquibase/change-log.xml | 1 + .../resources/liquibase/change-set/v2.0.0.xml | 18 ++++ 13 files changed, 140 insertions(+), 37 deletions(-) create mode 100644 src/main/java/com/tsc/bitbucketbot/domain/change/ConflictPrChange.java create mode 100644 src/main/java/com/tsc/bitbucketbot/dto/bitbucket/MergeResult.java create mode 100644 src/main/java/com/tsc/bitbucketbot/dto/bitbucket/Outcome.java create mode 100644 src/main/java/com/tsc/bitbucketbot/dto/bitbucket/Properties.java create mode 100644 src/main/resources/liquibase/change-set/v2.0.0.xml diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/ChangeType.java b/src/main/java/com/tsc/bitbucketbot/domain/change/ChangeType.java index 34164db..29397a2 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/change/ChangeType.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/ChangeType.java @@ -2,6 +2,6 @@ package com.tsc.bitbucketbot.domain.change; public enum ChangeType { - STATUS_PR, UPDATE_PR, REVIEWERS, NEW_PR + STATUS_PR, UPDATE_PR, REVIEWERS, NEW_PR, CONFLICT_PR } diff --git a/src/main/java/com/tsc/bitbucketbot/domain/change/ConflictPrChange.java b/src/main/java/com/tsc/bitbucketbot/domain/change/ConflictPrChange.java new file mode 100644 index 0000000..d58f23f --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/domain/change/ConflictPrChange.java @@ -0,0 +1,21 @@ +package com.tsc.bitbucketbot.domain.change; + +import lombok.Builder; +import lombok.Getter; +import lombok.Singular; + +import java.util.Set; + +@Getter +public class ConflictPrChange extends PrChange { + + @Builder + private ConflictPrChange( + @Singular("telegramId") Set telegramId, + String name, + String url + ) { + super(ChangeType.CONFLICT_PR, telegramId, name, url); + } + +} diff --git a/src/main/java/com/tsc/bitbucketbot/domain/entity/PullRequest.java b/src/main/java/com/tsc/bitbucketbot/domain/entity/PullRequest.java index 9336729..2eca5e5 100644 --- a/src/main/java/com/tsc/bitbucketbot/domain/entity/PullRequest.java +++ b/src/main/java/com/tsc/bitbucketbot/domain/entity/PullRequest.java @@ -86,4 +86,7 @@ public class PullRequest { @Column(name = "update_date") private LocalDateTime updateDate; + @Column(name = "conflict") + private boolean conflict; + } diff --git a/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/MergeResult.java b/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/MergeResult.java new file mode 100644 index 0000000..a47d205 --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/MergeResult.java @@ -0,0 +1,10 @@ +package com.tsc.bitbucketbot.dto.bitbucket; + +import lombok.Data; + +@Data +public class MergeResult { + + private Outcome outcome; + +} diff --git a/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/Outcome.java b/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/Outcome.java new file mode 100644 index 0000000..c207a73 --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/Outcome.java @@ -0,0 +1,8 @@ +package com.tsc.bitbucketbot.dto.bitbucket; + +public enum Outcome { + + CONFLICTED, + CLEAN + +} diff --git a/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/Properties.java b/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/Properties.java new file mode 100644 index 0000000..f392484 --- /dev/null +++ b/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/Properties.java @@ -0,0 +1,10 @@ +package com.tsc.bitbucketbot.dto.bitbucket; + +import lombok.Data; + +@Data +public class Properties { + + private MergeResult mergeResult; + +} diff --git a/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/PullRequestJson.java b/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/PullRequestJson.java index d761d22..ffb28cb 100644 --- a/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/PullRequestJson.java +++ b/src/main/java/com/tsc/bitbucketbot/dto/bitbucket/PullRequestJson.java @@ -31,5 +31,6 @@ public class PullRequestJson { private UserDecisionJson author; private List reviewers; private FromRefJson fromRef; + private Properties properties; } diff --git a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerChangeParsing.java b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerChangeParsing.java index 49698f2..94aedaf 100644 --- a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerChangeParsing.java +++ b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerChangeParsing.java @@ -1,6 +1,7 @@ package com.tsc.bitbucketbot.scheduler; import com.tsc.bitbucketbot.domain.change.Change; +import com.tsc.bitbucketbot.domain.change.ConflictPrChange; import com.tsc.bitbucketbot.domain.change.NewPrChange; import com.tsc.bitbucketbot.domain.change.ReviewersPrChange; import com.tsc.bitbucketbot.domain.change.StatusPrChange; @@ -59,6 +60,9 @@ public class SchedulerChangeParsing { case UPDATE_PR: message = Message.generate(((UpdatePrChange) change)); break; + case CONFLICT_PR: + message = Message.generate(((ConflictPrChange) change)); + break; default: throw new NotFoundException("Нет обработчика для типа " + change.getType().name()); } diff --git a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPullRequest.java b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPullRequest.java index 303139c..7206d70 100644 --- a/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPullRequest.java +++ b/src/main/java/com/tsc/bitbucketbot/scheduler/SchedulerPullRequest.java @@ -4,6 +4,7 @@ import com.tsc.bitbucketbot.config.BitbucketConfig; import com.tsc.bitbucketbot.domain.IdAndStatusPr; import com.tsc.bitbucketbot.domain.PullRequestStatus; import com.tsc.bitbucketbot.domain.ReviewerStatus; +import com.tsc.bitbucketbot.domain.change.ConflictPrChange; import com.tsc.bitbucketbot.domain.change.NewPrChange; import com.tsc.bitbucketbot.domain.change.ReviewersPrChange; import com.tsc.bitbucketbot.domain.change.StatusPrChange; @@ -12,6 +13,7 @@ import com.tsc.bitbucketbot.domain.entity.PullRequest; import com.tsc.bitbucketbot.domain.entity.Reviewer; import com.tsc.bitbucketbot.domain.entity.User; import com.tsc.bitbucketbot.domain.util.ReviewerChange; +import com.tsc.bitbucketbot.dto.bitbucket.PullRequestJson; import com.tsc.bitbucketbot.dto.bitbucket.sheet.PullRequestSheetJson; import com.tsc.bitbucketbot.service.ChangeService; import com.tsc.bitbucketbot.service.PullRequestsService; @@ -56,7 +58,7 @@ public class SchedulerPullRequest { private final BitbucketConfig bitbucketConfig; @Scheduled(fixedRate = 30000) - public void checkOldPullRequest() { + public void checkPullRequest() { final Set existsId = pullRequestsService.getAllId(STATUSES).stream() .map(IdAndStatusPr::getId) .collect(Collectors.toSet()); @@ -97,29 +99,17 @@ public class SchedulerPullRequest { Optional sheetJson = Utils.urlToJson(bitbucketConfig.getUrlPullRequestClose(), user.getToken(), PullRequestSheetJson.class); while (sheetJson.isPresent() && sheetJson.get().getValues() != null && !sheetJson.get().getValues().isEmpty()) { final PullRequestSheetJson bitbucketSheet = sheetJson.get(); - final List newPrs = bitbucketSheet.getValues().stream() - .map(jsonPr -> conversionService.convert(jsonPr, PullRequest.class)) - .peek(pullRequest -> pullRequestsService.getIdByBitbucketIdAndReposId(pullRequest.getBitbucketId(), pullRequest.getRepositoryId()).ifPresent(pullRequest::setId)) - .filter(pullRequest -> pullRequest.getId() != null) - .collect(Collectors.toList()); - for (PullRequest pullRequest : newPrs) { - changeService.add( - StatusPrChange.builder() - .name(pullRequest.getName()) - .url(pullRequest.getUrl()) - .oldStatus(pullRequest.getStatus()) - .newStatus(OPEN) - .telegramId(pullRequest.getAuthor().getTelegramId()) - .build() + final Map existsPr = getExistsPr(bitbucketSheet.getValues()); + final Set pullRequests = pullRequestsService.getAllById(existsPr.keySet()); + if (!existsPr.isEmpty() && !pullRequests.isEmpty()) { + processingUpdateClosePr(existsPr, pullRequests); + ids.addAll( + pullRequestsService.updateAll(existsPr.values()).stream() + .map(PullRequest::getId) + .collect(Collectors.toSet()) ); } - ids.addAll( - pullRequestsService.updateAll(newPrs).stream() - .map(PullRequest::getId) - .collect(Collectors.toSet()) - ); - if (bitbucketSheet.getNextPageStart() != null) { sheetJson = Utils.urlToJson(bitbucketConfig.getUrlPullRequestClose() + bitbucketSheet.getNextPageStart(), bitbucketConfig.getToken(), PullRequestSheetJson.class); } else { @@ -137,15 +127,10 @@ public class SchedulerPullRequest { Optional sheetJson = Utils.urlToJson(bitbucketConfig.getUrlPullRequestOpen(), user.getToken(), PullRequestSheetJson.class); while (sheetJson.isPresent() && sheetJson.get().getValues() != null && !sheetJson.get().getValues().isEmpty()) { final PullRequestSheetJson jsonSheet = sheetJson.get(); - final Map existsPr = jsonSheet.getValues().stream() - .filter(Objects::nonNull) - .map(pullRequestJson -> conversionService.convert(pullRequestJson, PullRequest.class)) - .peek(pullRequest -> pullRequestsService.getIdByBitbucketIdAndReposId(pullRequest.getBitbucketId(), pullRequest.getRepositoryId()).ifPresent(pullRequest::setId)) - .filter(pullRequest -> pullRequest.getId() != null) - .collect(Collectors.toMap(PullRequest::getId, pullRequest -> pullRequest)); + final Map existsPr = getExistsPr(jsonSheet.getValues()); final Set pullRequests = pullRequestsService.getAllById(existsPr.keySet()); if (!existsPr.isEmpty() && !pullRequests.isEmpty()) { - processingUpdate(existsPr, pullRequests); + processingUpdateOpenPr(existsPr, pullRequests); ids.addAll( pullRequestsService.updateAll(existsPr.values()).stream() .map(PullRequest::getId) @@ -163,12 +148,44 @@ public class SchedulerPullRequest { return ids; } + private Map getExistsPr(List pullRequestJsons) { + return pullRequestJsons.stream() + .filter(Objects::nonNull) + .map(pullRequestJson -> conversionService.convert(pullRequestJson, PullRequest.class)) + .peek(pullRequest -> pullRequestsService.getIdByBitbucketIdAndReposId(pullRequest.getBitbucketId(), pullRequest.getRepositoryId()).ifPresent(pullRequest::setId)) + .filter(pullRequest -> pullRequest.getId() != null) + .collect(Collectors.toMap(PullRequest::getId, pullRequest -> pullRequest)); + } + @NonNull - private void processingUpdate(Map newPullRequests, Set pullRequests) { + private void processingUpdateOpenPr(Map newPullRequests, Set pullRequests) { for (PullRequest pullRequest : pullRequests) { PullRequest newPullRequest = newPullRequests.get(pullRequest.getId()); - processingAuthor(pullRequest, newPullRequest); + changeStatusPR(pullRequest, newPullRequest); + changeReviewersPR(pullRequest, newPullRequest); processingReviewer(pullRequest, newPullRequest); + conflictPr(pullRequest, newPullRequest); + } + } + + @NonNull + private void processingUpdateClosePr(Map newPullRequests, Set pullRequests) { + for (PullRequest pullRequest : pullRequests) { + PullRequest newPullRequest = newPullRequests.get(pullRequest.getId()); + changeStatusPR(pullRequest, newPullRequest); + } + } + + @NonNull + private void conflictPr(PullRequest pullRequest, PullRequest newPullRequest) { + if (newPullRequest.isConflict() && !pullRequest.isConflict()) { + changeService.add( + ConflictPrChange.builder() + .name(pullRequest.getName()) + .url(pullRequest.getUrl()) + .telegramId(pullRequest.getAuthor().getTelegramId()) + .build() + ); } } @@ -189,12 +206,6 @@ public class SchedulerPullRequest { } } - @NonNull - private void processingAuthor(PullRequest pullRequest, PullRequest newPullRequest) { - changeStatusPR(pullRequest, newPullRequest); - changeReviewersPR(pullRequest, newPullRequest); - } - @NonNull private boolean isUpdatePr(PullRequest pullRequest, PullRequest newPullRequest) { LocalDateTime oldDate = pullRequest.getUpdateDate(); diff --git a/src/main/java/com/tsc/bitbucketbot/service/converter/PullRequestJsonConverter.java b/src/main/java/com/tsc/bitbucketbot/service/converter/PullRequestJsonConverter.java index ae40ff3..da2a9c1 100644 --- a/src/main/java/com/tsc/bitbucketbot/service/converter/PullRequestJsonConverter.java +++ b/src/main/java/com/tsc/bitbucketbot/service/converter/PullRequestJsonConverter.java @@ -5,6 +5,8 @@ import com.tsc.bitbucketbot.domain.ReviewerStatus; import com.tsc.bitbucketbot.domain.entity.PullRequest; import com.tsc.bitbucketbot.domain.entity.Reviewer; import com.tsc.bitbucketbot.domain.entity.User; +import com.tsc.bitbucketbot.dto.bitbucket.Outcome; +import com.tsc.bitbucketbot.dto.bitbucket.Properties; import com.tsc.bitbucketbot.dto.bitbucket.PullRequestJson; import com.tsc.bitbucketbot.dto.bitbucket.PullRequestState; import com.tsc.bitbucketbot.dto.bitbucket.UserDecisionJson; @@ -32,6 +34,7 @@ public class PullRequestJsonConverter implements Converter 180 ? description.substring(0, 180) + "..." : description; diff --git a/src/main/java/com/tsc/bitbucketbot/utils/Message.java b/src/main/java/com/tsc/bitbucketbot/utils/Message.java index c6ab990..f05cf23 100644 --- a/src/main/java/com/tsc/bitbucketbot/utils/Message.java +++ b/src/main/java/com/tsc/bitbucketbot/utils/Message.java @@ -1,5 +1,6 @@ package com.tsc.bitbucketbot.utils; +import com.tsc.bitbucketbot.domain.change.ConflictPrChange; import com.tsc.bitbucketbot.domain.change.NewPrChange; import com.tsc.bitbucketbot.domain.change.ReviewersPrChange; import com.tsc.bitbucketbot.domain.change.StatusPrChange; @@ -98,6 +99,11 @@ public class Message { Smile.TWO_BR; } + public static String generate(@NonNull ConflictPrChange change) { + return Smile.DANGEROUS + "*Внимание конфлик в ПР*" + Smile.HR + + link(change.getName(), change.getUrl()) + Smile.TWO_BR; + } + @NonNull public static String goodMorningStatistic(List pullRequestsReviews, List pullRequestsNeedWork) { StringBuilder message = new StringBuilder().append(Smile.SUN).append(" Доброе утро ").append(Smile.SUN).append(Smile.HR); diff --git a/src/main/resources/liquibase/change-log.xml b/src/main/resources/liquibase/change-log.xml index 01ca1ce..3425cc2 100644 --- a/src/main/resources/liquibase/change-log.xml +++ b/src/main/resources/liquibase/change-log.xml @@ -7,5 +7,6 @@ + \ No newline at end of file diff --git a/src/main/resources/liquibase/change-set/v2.0.0.xml b/src/main/resources/liquibase/change-set/v2.0.0.xml new file mode 100644 index 0000000..742d149 --- /dev/null +++ b/src/main/resources/liquibase/change-set/v2.0.0.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file