Продолжаем переработку

This commit is contained in:
uPagge 2021-01-14 13:10:53 +03:00
parent 9c97344bf5
commit 418b7c9f80
No known key found for this signature in database
GPG Key ID: 964B40928E4C9088
69 changed files with 272 additions and 1436 deletions

View File

@ -1,123 +0,0 @@
package org.sadtech.bot.vcs.bitbucket.core;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.sadtech.bot.gitlab.context.domain.IdAndStatusPr;
import org.sadtech.bot.gitlab.context.domain.entity.PullRequest;
import org.sadtech.bot.gitlab.context.domain.filter.PullRequestFilter;
import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.core.utils.Pair;
import org.sadtech.bot.gitlab.core.utils.Utils;
import org.sadtech.bot.gitlab.sdk.domain.PullRequestJson;
import org.sadtech.bot.gitlab.sdk.domain.sheet.PullRequestSheetJson;
import org.sadtech.bot.vsc.context.domain.PullRequestStatus;
import org.sadtech.bot.vsc.context.service.PullRequestParser;
import org.springframework.core.convert.ConversionService;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Абстрактный парсер ПРов, для использования в мульти и локал версиях приложения.
*
* @author upagge 25.10.2020
*/
@Slf4j
public abstract class AbstractPullRequestBitbucketParser implements PullRequestParser {
private static final Set<PullRequestStatus> OLD_STATUSES = Stream.of(PullRequestStatus.MERGED, PullRequestStatus.OPEN, PullRequestStatus.DECLINED).collect(Collectors.toSet());
protected final PullRequestsService pullRequestsService;
protected final ConversionService conversionService;
protected AbstractPullRequestBitbucketParser(
PullRequestsService pullRequestsService,
ConversionService conversionService
) {
this.pullRequestsService = pullRequestsService;
this.conversionService = conversionService;
}
public void processingOldPullRequests(@NonNull String urlPullRequestOpen, @NonNull String urlPullRequestClose) {
final Set<Long> existsId = pullRequestsService.getAllId(OLD_STATUSES).stream()
.map(IdAndStatusPr::getId)
.collect(Collectors.toSet());
final Set<Long> openId = getExistsPullRequestIds(urlPullRequestOpen);
final Set<Long> closeId = getExistsPullRequestIds(urlPullRequestClose);
final Set<Long> newNotExistsId = existsId.stream()
.filter(id -> !openId.contains(id) && !closeId.contains(id))
.collect(Collectors.toSet());
log.info("Открыты: " + Arrays.toString(openId.toArray()));
log.info("Закрыты: " + Arrays.toString(closeId.toArray()));
log.info("Не найдены: " + Arrays.toString(newNotExistsId.toArray()));
if (!newNotExistsId.isEmpty() && !openId.isEmpty()) {
pullRequestsService.deleteAllById(newNotExistsId);
}
}
protected abstract Set<Long> getExistsPullRequestIds(@NonNull String bitbucketUrl);
protected void createNewPullRequest(@NonNull String urlPullRequestOpen, @NonNull String bitbucketToken) {
Optional<PullRequestSheetJson> sheetJson = Utils.urlToJson(urlPullRequestOpen, bitbucketToken, PullRequestSheetJson.class);
while (sheetJson.isPresent() && sheetJson.get().hasContent()) {
final PullRequestSheetJson pullRequestBitbucketSheet = sheetJson.get();
final List<PullRequest> newPullRequest = pullRequestBitbucketSheet.getValues().stream()
.collect(Collectors.toMap(pullRequestJson -> new Pair<>(pullRequestJson.getId(), pullRequestJson.getFromRef().getRepository().getId()), pullRequestJson -> pullRequestJson))
.values()
.stream()
.filter(pullRequestJson -> !pullRequestsService.exists(bitbucketIdAndPullRequestId(pullRequestJson)))
.map(pullRequestJson -> conversionService.convert(pullRequestJson, PullRequest.class))
.collect(Collectors.toList());
pullRequestsService.createAll(newPullRequest);
if (pullRequestBitbucketSheet.getNextPageStart() != null) {
sheetJson = Utils.urlToJson(urlPullRequestOpen + pullRequestBitbucketSheet.getNextPageStart(), bitbucketToken, PullRequestSheetJson.class);
} else {
break;
}
}
}
protected Set<Long> updateOldPullRequests(@NonNull String url, @NonNull String token) {
Optional<PullRequestSheetJson> sheetJson = Utils.urlToJson(url, token, PullRequestSheetJson.class);
Set<Long> ids = new HashSet<>();
while (sheetJson.isPresent() && sheetJson.get().hasContent()) {
final PullRequestSheetJson jsonSheet = sheetJson.get();
final List<PullRequest> existsPr = getExistsPr(jsonSheet.getValues());
ids.addAll(
pullRequestsService.updateAll(existsPr).stream()
.map(PullRequest::getId)
.collect(Collectors.toSet())
);
if (jsonSheet.getNextPageStart() != null) {
sheetJson = Utils.urlToJson(url + jsonSheet.getNextPageStart(), token, PullRequestSheetJson.class);
} else {
break;
}
}
return ids;
}
private List<PullRequest> getExistsPr(@NonNull List<PullRequestJson> pullRequestJsons) {
return pullRequestJsons.stream()
.filter(json -> pullRequestsService.exists(bitbucketIdAndPullRequestId(json)))
.map(json -> conversionService.convert(json, PullRequest.class))
.collect(Collectors.toList());
}
private PullRequestFilter bitbucketIdAndPullRequestId(PullRequestJson json) {
return PullRequestFilter.builder()
.bitbucketId(json.getId())
.bitbucketRepositoryId(json.getFromRef().getRepository().getId())
.build();
}
}

View File

@ -75,6 +75,11 @@
<artifactId>gitlab-sdk</artifactId> <artifactId>gitlab-sdk</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.sadtech.haiti</groupId>
<artifactId>haiti-utils</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.liquibase</groupId> <groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId> <artifactId>liquibase-core</artifactId>
@ -98,7 +103,7 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration> <configuration>
<finalName>bitbucketbot</finalName> <finalName>gitlab-notification</finalName>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>

View File

@ -1,13 +1,13 @@
package org.sadtech.bot.vcs.bitbucket.app; package org.sadtech.bot.gitlab.app;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@EnableJpaRepositories(basePackages = {"org.sadtech.bot.vcs.bitbucketbot.data.jpa", "org.sadtech.bot.vcs.teamcity.core.repository.jpa"}) @EnableJpaRepositories(basePackages = {"org.sadtech.bot.gitlab.data.jpa", "org.sadtech.bot.gitlab.teamcity.core.repository.jpa"})
@SpringBootApplication(scanBasePackages = "org.sadtech.bot.vcs") @SpringBootApplication(scanBasePackages = "org.sadtech.bot.gitlab")
@EntityScan(basePackages = {"org.sadtech.bot.vsc.bitbucketbot.context.domain.entity", "org.sadtech.bot.vcs.teamcity.core.domain.entity"}) @EntityScan(basePackages = {"org.sadtech.bot.gitlab.context.domain.entity", "org.sadtech.bot.gitlab.teamcity.core.domain.entity"})
public class BitbucketbotApplication { public class BitbucketbotApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@ -1,4 +1,4 @@
package org.sadtech.bot.vcs.bitbucket.app.config; package org.sadtech.bot.gitlab.app.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;

View File

@ -1,4 +1,4 @@
package org.sadtech.bot.vcs.bitbucket.app.config.property; package org.sadtech.bot.gitlab.app.config.property;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;

View File

@ -1,7 +1,7 @@
package org.sadtech.bot.vcs.bitbucket.app.scheduler; package org.sadtech.bot.gitlab.app.scheduler;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.vcs.bitbucket.app.service.CommentAndTaskParser; import org.sadtech.bot.gitlab.app.service.CommentAndTaskParser;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

View File

@ -1,4 +1,4 @@
package org.sadtech.bot.vcs.bitbucket.app.scheduler; package org.sadtech.bot.gitlab.app.scheduler;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@ -1,6 +1,8 @@
package org.sadtech.bot.vcs.bitbucket.app.service; package org.sadtech.bot.gitlab.app.service;
import lombok.NonNull; import lombok.NonNull;
import org.sadtech.bot.gitlab.app.config.property.CommentSchedulerProperty;
import org.sadtech.bot.gitlab.app.service.executor.DataScan;
import org.sadtech.bot.gitlab.context.domain.entity.Comment; import org.sadtech.bot.gitlab.context.domain.entity.Comment;
import org.sadtech.bot.gitlab.context.domain.entity.PullRequest; import org.sadtech.bot.gitlab.context.domain.entity.PullRequest;
import org.sadtech.bot.gitlab.context.domain.entity.PullRequestMini; import org.sadtech.bot.gitlab.context.domain.entity.PullRequestMini;
@ -9,13 +11,10 @@ import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.service.CommentService; import org.sadtech.bot.gitlab.context.service.CommentService;
import org.sadtech.bot.gitlab.context.service.PullRequestsService; import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.context.service.TaskService; import org.sadtech.bot.gitlab.context.service.TaskService;
import org.sadtech.bot.gitlab.core.config.properties.BitbucketProperty; import org.sadtech.bot.gitlab.core.config.properties.GitlabProperty;
import org.sadtech.bot.gitlab.core.config.properties.InitProperty; import org.sadtech.bot.gitlab.core.config.properties.InitProperty;
import org.sadtech.bot.gitlab.core.utils.Utils;
import org.sadtech.bot.gitlab.sdk.domain.CommentJson; import org.sadtech.bot.gitlab.sdk.domain.CommentJson;
import org.sadtech.bot.gitlab.sdk.domain.Severity; import org.sadtech.bot.gitlab.sdk.domain.Severity;
import org.sadtech.bot.vcs.bitbucket.app.config.property.CommentSchedulerProperty;
import org.sadtech.bot.vcs.bitbucket.app.service.executor.DataScan;
import org.sadtech.haiti.context.page.Sheet; import org.sadtech.haiti.context.page.Sheet;
import org.sadtech.haiti.core.page.PaginationImpl; import org.sadtech.haiti.core.page.PaginationImpl;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
@ -41,7 +40,7 @@ public class CommentAndTaskParser {
private final TaskService taskService; private final TaskService taskService;
private final ConversionService conversionService; private final ConversionService conversionService;
private final BitbucketProperty bitbucketProperty; private final GitlabProperty gitlabProperty;
private final CommentSchedulerProperty commentSchedulerProperty; private final CommentSchedulerProperty commentSchedulerProperty;
private final InitProperty initProperty; private final InitProperty initProperty;
@ -53,7 +52,7 @@ public class CommentAndTaskParser {
ExecutorScanner executorScanner, ExecutorScanner executorScanner,
TaskService taskService, TaskService taskService,
ConversionService conversionService, ConversionService conversionService,
BitbucketProperty bitbucketProperty, GitlabProperty gitlabProperty,
CommentSchedulerProperty commentSchedulerProperty, CommentSchedulerProperty commentSchedulerProperty,
InitProperty initProperty InitProperty initProperty
) { ) {
@ -62,7 +61,7 @@ public class CommentAndTaskParser {
this.executorScanner = executorScanner; this.executorScanner = executorScanner;
this.taskService = taskService; this.taskService = taskService;
this.conversionService = conversionService; this.conversionService = conversionService;
this.bitbucketProperty = bitbucketProperty; this.gitlabProperty = gitlabProperty;
this.commentSchedulerProperty = commentSchedulerProperty; this.commentSchedulerProperty = commentSchedulerProperty;
this.initProperty = initProperty; this.initProperty = initProperty;
} }
@ -157,7 +156,7 @@ public class CommentAndTaskParser {
} }
private String getCommentUrl(long commentId, PullRequest pullRequest) { private String getCommentUrl(long commentId, PullRequest pullRequest) {
return bitbucketProperty.getUrlPullRequestComment() return gitlabProperty.getUrlPullRequestComment()
.replace("{projectKey}", pullRequest.getProjectKey()) .replace("{projectKey}", pullRequest.getProjectKey())
.replace("{repositorySlug}", pullRequest.getRepositorySlug()) .replace("{repositorySlug}", pullRequest.getRepositorySlug())
.replace("{pullRequestId}", pullRequest.getBitbucketId().toString()) .replace("{pullRequestId}", pullRequest.getBitbucketId().toString())
@ -171,7 +170,7 @@ public class CommentAndTaskParser {
for (Comment oldComment : comments) { for (Comment oldComment : comments) {
final Optional<CommentJson> optCommentJson = Utils.urlToJson( final Optional<CommentJson> optCommentJson = Utils.urlToJson(
oldComment.getUrlApi(), oldComment.getUrlApi(),
bitbucketProperty.getToken(), gitlabProperty.getToken(),
CommentJson.class CommentJson.class
); );
if (optCommentJson.isPresent()) { if (optCommentJson.isPresent()) {
@ -195,7 +194,7 @@ public class CommentAndTaskParser {
for (Task oldTask : tasks) { for (Task oldTask : tasks) {
final Optional<CommentJson> optCommentJson = Utils.urlToJson( final Optional<CommentJson> optCommentJson = Utils.urlToJson(
oldTask.getUrlApi(), oldTask.getUrlApi(),
bitbucketProperty.getToken(), gitlabProperty.getToken(),
CommentJson.class CommentJson.class
); );
if (optCommentJson.isPresent()) { if (optCommentJson.isPresent()) {

View File

@ -1,13 +1,13 @@
package org.sadtech.bot.vcs.bitbucket.app.service; package org.sadtech.bot.gitlab.app.service;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.sadtech.bot.gitlab.core.config.properties.BitbucketProperty; import org.sadtech.bot.gitlab.app.service.executor.DataScan;
import org.sadtech.bot.gitlab.app.service.executor.Executor;
import org.sadtech.bot.gitlab.app.service.executor.Seeker;
import org.sadtech.bot.gitlab.core.config.properties.GitlabProperty;
import org.sadtech.bot.gitlab.sdk.domain.CommentJson; import org.sadtech.bot.gitlab.sdk.domain.CommentJson;
import org.sadtech.bot.vcs.bitbucket.app.service.executor.DataScan;
import org.sadtech.bot.vcs.bitbucket.app.service.executor.Executor;
import org.sadtech.bot.vcs.bitbucket.app.service.executor.Seeker;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
@ -25,13 +25,13 @@ public class ExecutorScanner implements Executor<DataScan, CommentJson> {
private final ExecutorService executorService; private final ExecutorService executorService;
private List<Future<Optional<CommentJson>>> resultList = new ArrayList<>(); private List<Future<Optional<CommentJson>>> resultList = new ArrayList<>();
private final BitbucketProperty bitbucketProperty; private final GitlabProperty gitlabProperty;
@Override @Override
public boolean registration(@NonNull List<DataScan> dataScans) { public boolean registration(@NonNull List<DataScan> dataScans) {
resultList.addAll( resultList.addAll(
dataScans.stream() dataScans.stream()
.map(dataScan -> new Seeker(dataScan, bitbucketProperty.getToken())) .map(dataScan -> new Seeker(dataScan, gitlabProperty.getToken()))
.map(executorService::submit) .map(executorService::submit)
.collect(Collectors.toList()) .collect(Collectors.toList())
); );

View File

@ -1,4 +1,4 @@
package org.sadtech.bot.vcs.bitbucket.app.service.executor; package org.sadtech.bot.gitlab.app.service.executor;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package org.sadtech.bot.vcs.bitbucket.app.service.executor; package org.sadtech.bot.gitlab.app.service.executor;
import lombok.NonNull; import lombok.NonNull;

View File

@ -1,4 +1,4 @@
package org.sadtech.bot.vcs.bitbucket.app.service.executor; package org.sadtech.bot.gitlab.app.service.executor;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@ -1,7 +1,6 @@
package org.sadtech.bot.vcs.bitbucket.app.service.executor; package org.sadtech.bot.gitlab.app.service.executor;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.core.utils.Utils;
import org.sadtech.bot.gitlab.sdk.domain.CommentJson; import org.sadtech.bot.gitlab.sdk.domain.CommentJson;
import java.util.Optional; import java.util.Optional;

View File

@ -0,0 +1,116 @@
package org.sadtech.bot.gitlab.app.service.parser;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.sadtech.bot.gitlab.context.domain.entity.PullRequest;
import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.core.config.properties.GitlabProperty;
import org.sadtech.bot.gitlab.core.utils.Pair;
import org.sadtech.bot.gitlab.sdk.domain.PullRequestJson;
import org.sadtech.bot.vsc.context.domain.PullRequestStatus;
import org.sadtech.bot.vsc.context.service.PullRequestParser;
import org.sadtech.haiti.utils.network.HttpHeader;
import org.sadtech.haiti.utils.network.HttpParse;
import org.springframework.core.convert.ConversionService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.sadtech.haiti.utils.network.HttpParse.ACCEPT;
import static org.sadtech.haiti.utils.network.HttpParse.AUTHORIZATION;
import static org.sadtech.haiti.utils.network.HttpParse.BEARER;
@Slf4j
@Service
@RequiredArgsConstructor
public class PullRequestBitbucketParser implements PullRequestParser {
private static final Set<PullRequestStatus> OLD_STATUSES = Stream.of(PullRequestStatus.MERGED, PullRequestStatus.OPEN, PullRequestStatus.DECLINED).collect(Collectors.toSet());
private final GitlabProperty gitlabProperty;
private final PullRequestsService pullRequestsService;
private final ConversionService conversionService;
@Override
public void parsingOldPullRequest() {
// processingOldPullRequests(gitlabProperty.getUrlPullRequestOpen(), gitlabProperty.getUrlPullRequestClose());
}
@Override
public void parsingNewPullRequest() {
final List<PullRequestJson> pullRequestJsons = HttpParse.request(gitlabProperty.getUrlPullRequestOpen())
.header(HttpHeader.of(AUTHORIZATION, BEARER + gitlabProperty.getToken()))
.header(ACCEPT)
.executeList(PullRequestJson.class);
while (pullRequestJsons != null && !pullRequestJsons.isEmpty()) {
final List<PullRequest> newPullRequest = pullRequestJsons.stream()
.collect(Collectors.toMap(pullRequestJson -> new Pair<>(pullRequestJson.getId(), pullRequestJson.getFromRef().getRepository().getId()), pullRequestJson -> pullRequestJson))
.values()
.stream()
// .filter(pullRequestJson -> !pullRequestsService.exists(bitbucketIdAndPullRequestId(pullRequestJson)))
.map(pullRequestJson -> conversionService.convert(pullRequestJson, PullRequest.class))
.collect(Collectors.toList());
pullRequestsService.createAll(newPullRequest);
}
}
// private Set<Long> getExistsPullRequestIds(String bitbucketUrl) {
// Optional<PullRequestSheetJson> sheetJson = Utils.urlToJson(url, token, PullRequestSheetJson.class);
// Set<Long> ids = new HashSet<>();
// while (sheetJson.isPresent() && sheetJson.get().hasContent()) {
// final PullRequestSheetJson jsonSheet = sheetJson.get();
// final List<PullRequest> existsPr = getExistsPr(jsonSheet.getValues());
//
// ids.addAll(
// pullRequestsService.updateAll(existsPr).stream()
// .map(PullRequest::getId)
// .collect(Collectors.toSet())
// );
//
// if (jsonSheet.getNextPageStart() != null) {
// sheetJson = Utils.urlToJson(url + jsonSheet.getNextPageStart(), token, PullRequestSheetJson.class);
// } else {
// break;
// }
// }
// return ids;
// }
//
// public void processingOldPullRequests(@NonNull String urlPullRequestOpen, @NonNull String urlPullRequestClose) {
// final Set<Long> existsId = pullRequestsService.getAllId(OLD_STATUSES).stream()
// .map(IdAndStatusPr::getId)
// .collect(Collectors.toSet());
// final Set<Long> openId = getExistsPullRequestIds(urlPullRequestOpen);
// final Set<Long> closeId = getExistsPullRequestIds(urlPullRequestClose);
// final Set<Long> newNotExistsId = existsId.stream()
// .filter(id -> !openId.contains(id) && !closeId.contains(id))
// .collect(Collectors.toSet());
// log.info("Открыты: " + Arrays.toString(openId.toArray()));
// log.info("Закрыты: " + Arrays.toString(closeId.toArray()));
// log.info("Не найдены: " + Arrays.toString(newNotExistsId.toArray()));
// if (!newNotExistsId.isEmpty() && !openId.isEmpty()) {
// pullRequestsService.deleteAllById(newNotExistsId);
// }
// }
//
// private List<PullRequest> getExistsPr(@NonNull List<PullRequestJson> pullRequestJsons) {
// return pullRequestJsons.stream()
// .filter(json -> pullRequestsService.exists(bitbucketIdAndPullRequestId(json)))
// .map(json -> conversionService.convert(json, PullRequest.class))
// .collect(Collectors.toList());
// }
//
// private PullRequestFilter bitbucketIdAndPullRequestId(PullRequestJson json) {
// return PullRequestFilter.builder()
// .bitbucketId(json.getId())
// .bitbucketRepositoryId(json.getFromRef().getRepository().getId())
// .build();
// }
}

View File

@ -1,19 +0,0 @@
package org.sadtech.bot.vcs.bitbucket.app.scheduler;
import lombok.RequiredArgsConstructor;
import org.sadtech.bot.vcs.bitbucket.app.service.parser.PersonBitbucketParser;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class PersonScheduler {
private final PersonBitbucketParser personParser;
@Scheduled(cron = "${bitbucketbot.scheduler.person:0 0 0 */1 * *}")
public void scanPersons() {
personParser.scanNewPerson();
}
}

View File

@ -1,49 +0,0 @@
package org.sadtech.bot.vcs.bitbucket.app.scheduler;
import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.EntityType;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.domain.notify.SimpleTextNotify;
import org.sadtech.bot.gitlab.context.service.NotifyService;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.RatingService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.List;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
@Component
@RequiredArgsConstructor
public class RatingScheduler {
private final RatingService ratingService;
private final PersonService personService;
private final NotifyService notifyService;
@Scheduled(cron = "0 */50 * * * *")
private void ratingRecalculation() {
ratingService.ratingRecalculation();
}
@Scheduled(cron = "0 20 8 * * MON-FRI")
private void goodMorningRating() {
List<Person> allRegister = personService.getAllRegister();
for (Person person : allRegister) {
final String message = ratingService.getRatingTop(person.getLogin());
notifyService.send(
SimpleTextNotify.builder()
.entityType(EntityType.PERSON)
.message(message)
.recipients(Collections.singleton(person.getLogin()))
.build()
);
}
}
}

View File

@ -1,51 +0,0 @@
package org.sadtech.bot.vcs.bitbucket.app.service.parser;
import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.parser.PersonParser;
import org.sadtech.bot.gitlab.core.config.properties.BitbucketProperty;
import org.sadtech.bot.gitlab.core.utils.Utils;
import org.sadtech.bot.gitlab.sdk.domain.UserJson;
import org.sadtech.bot.gitlab.sdk.domain.sheet.UserSheetJson;
import org.springframework.core.convert.ConversionService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class PersonBitbucketParser implements PersonParser {
private final PersonService personService;
private final ConversionService conversionService;
private final BitbucketProperty bitbucketProperty;
@Override
public void scanNewPerson() {
Optional<UserSheetJson> sheetJson = Utils.urlToJson(bitbucketProperty.getUrlUsers(), bitbucketProperty.getToken(), UserSheetJson.class);
while (sheetJson.isPresent() && sheetJson.get().hasContent()) {
final UserSheetJson sheetUsers = sheetJson.get();
final List<UserJson> users = sheetUsers.getValues();
final Set<String> logins = users.stream().map(UserJson::getName).collect(Collectors.toSet());
final Set<String> existsLogins = personService.existsByLogin(logins);
final Set<Person> newUsers = users.stream()
.filter(userJson -> !existsLogins.contains(userJson.getName()))
.map(userJson -> conversionService.convert(userJson, Person.class))
.collect(Collectors.toSet());
if (!newUsers.isEmpty()) {
personService.createAll(newUsers);
}
if (sheetUsers.getNextPageStart() != null) {
sheetJson = Utils.urlToJson(bitbucketProperty.getUrlUsers() + sheetUsers.getNextPageStart(), bitbucketProperty.getToken(), UserSheetJson.class);
} else {
break;
}
}
}
}

View File

@ -1,58 +0,0 @@
package org.sadtech.bot.vcs.bitbucket.app.service.parser;
import lombok.extern.slf4j.Slf4j;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.core.config.properties.BitbucketProperty;
import org.sadtech.bot.vcs.bitbucket.core.AbstractPullRequestBitbucketParser;
import org.sadtech.bot.vsc.context.service.PullRequestParser;
import org.springframework.core.convert.ConversionService;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@Slf4j
@Service
public class PullRequestBitbucketParser extends AbstractPullRequestBitbucketParser implements PullRequestParser {
private final PersonService personService;
private final BitbucketProperty bitbucketProperty;
protected PullRequestBitbucketParser(
PullRequestsService pullRequestsService,
PersonService personService,
ConversionService conversionService,
BitbucketProperty bitbucketProperty
) {
super(pullRequestsService, conversionService);
this.personService = personService;
this.bitbucketProperty = bitbucketProperty;
}
@Override
public void parsingOldPullRequest() {
processingOldPullRequests(bitbucketProperty.getUrlPullRequestOpen(), bitbucketProperty.getUrlPullRequestClose());
}
@Override
public void parsingNewPullRequest() {
final List<Person> users = personService.getAllRegister();
for (Person user : users) {
createNewPullRequest(bitbucketProperty.getUrlPullRequestOpen(), user.getToken());
}
}
@Override
protected Set<Long> getExistsPullRequestIds(String bitbucketUrl) {
final List<Person> persons = personService.getAllRegister();
final Set<Long> ids = new HashSet<>();
for (Person person : persons) {
ids.addAll(updateOldPullRequests(bitbucketUrl, person.getToken()));
}
return ids;
}
}

View File

@ -1,43 +0,0 @@
spring:
datasource:
url: ${DATASOURCE_URL}
username: ${DATASOURCE_USERNAME}
driver-class-name: org.postgresql.Driver
password: ${DATASOURCE_PASSWORD}
liquibase:
change-log: classpath:liquibase/change-log.xml
jpa:
show-sql: false
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.PostgreSQLDialect
properties:
hibernate:
jdbc:
lob:
non_contextual_creation: true
logging:
config: classpath:logback-dev.xml
bitbucketbot:
scheduler:
person: 0 */1 * * * *
comment:
settings:
no-comment-count: 20
comment-count: 100
init:
start-comment-id: 8301
use: false
rating:
enable: true
bitbucket:
token: ${BITBUCKET_ADMIN_TOKEN}
url-pull-request-open: ${BITBUCKET_URL}/rest/api/1.0/dashboard/pull-requests?limit=150&state=OPEN
url-pull-request-close: ${BITBUCKET_URL}/rest/api/1.0/dashboard/pull-requests?limit=150&closedSince=86400
url-pull-request-comment: ${BITBUCKET_URL}/rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}
url-pull-request: ${BITBUCKET_URL}/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/overview
url-users: ${BITBUCKET_URL}/rest/api/1.0/admin/users
teamcity:
token: ${TEAMCITY_ADMIN_TOKEN}
project-url: ${TEAMCITY_URL}/app/rest/projects
build-url: ${TEAMCITY_URL}/app/rest/builds/?locator=project:(id:{0}),branch:(default:any)

View File

@ -1,41 +0,0 @@
spring:
datasource:
url: ${DATASOURCE_URL}
username: ${DATASOURCE_USERNAME}
driver-class-name: org.postgresql.Driver
password: ${DATASOURCE_PASSWORD}
liquibase:
change-log: classpath:liquibase/change-log.xml
jpa:
show-sql: false
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.PostgreSQLDialect
properties:
hibernate:
jdbc:
lob:
non_contextual_creation: true
logging:
config: classpath:logback-prod.xml
bitbucketbot:
scheduler:
person: 0 0 0 */1 * *
comment:
settings:
no-comment-count: 20
comment-count: 100
init:
start-comment-id: 7807
use: false
bitbucket:
token: ${BITBUCKET_ADMIN_TOKEN}
url-pull-request-open: ${BITBUCKET_URL}/rest/api/1.0/dashboard/pull-requests?limit=150&state=OPEN
url-pull-request-close: ${BITBUCKET_URL}/rest/api/1.0/dashboard/pull-requests?limit=150&closedSince=86400
url-pull-request-comment: ${BITBUCKET_URL}/rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}
url-pull-request: ${BITBUCKET_URL}/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/overview
url-users: ${BITBUCKET_URL}/rest/api/1.0/admin/users
teamcity:
token: ${TEAMCITY_ADMIN_TOKEN}
project-url: ${TEAMCITY_URL}/app/rest/projects
build-url: ${TEAMCITY_URL}/app/rest/builds/?locator=project:(id:{0}),branch:(default:any)

View File

@ -1,7 +1,43 @@
server: server:
port: 8018 port: 8018
spring:
datasource:
url: ${DATASOURCE_URL}
username: ${DATASOURCE_USERNAME}
driver-class-name: org.postgresql.Driver
password: ${DATASOURCE_PASSWORD}
liquibase:
change-log: classpath:liquibase/change-log.xml
jpa:
show-sql: false
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.PostgreSQLDialect
properties:
hibernate:
jdbc:
lob:
non_contextual_creation: true
telegram-config: telegram-config:
bot-username: ${TELEGRAM_BOT_USERNAME} bot-username: ${TELEGRAM_BOT_USERNAME}
bot-token: ${TELEGRAM_BOT_TOKEN} bot-token: ${TELEGRAM_BOT_TOKEN}
bitbucketbot: gitlab-bot:
version: 2.15.3 version: 2.15.3
scheduler:
comment:
settings:
no-comment-count: 20
comment-count: 100
gitlab:
token: ${GITLAB_PERSONAL_TOKEN}
username: ${GITLAB_USERNAME}
full-name: ${GITLAB_FULLNAME}
url-pull-request-open: ${GITLAB_URL}/rest/api/1.0/dashboard/pull-requests?limit=150&state=OPEN
url-pull-request-close: ${GITLAB_URL}/rest/api/1.0/dashboard/pull-requests?limit=150&closedSince=86400
url-pull-request-comment: ${GITLAB_URL}/rest/api/1.0/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/comments/{commentId}
url-pull-request: ${GITLAB_URL}/projects/{projectKey}/repos/{repositorySlug}/pull-requests/{pullRequestId}/overview
url-users: ${GITLAB_URL}/rest/api/1.0/admin/users
teamcity:
token: ${TEAMCITY_ADMIN_TOKEN}
project-url: ${TEAMCITY_URL}/app/rest/projects
build-url: ${TEAMCITY_URL}/app/rest/builds/?locator=project:(id:{0}),branch:(default:any)

View File

@ -1,24 +0,0 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{20} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>bitbucketbot-logs.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>bitbucket.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>50MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{20} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
</configuration>

View File

@ -1,24 +0,0 @@
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{20} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>bitbucketbot-logs.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>bitbucket.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>10</maxHistory>
<totalSizeCap>50MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{dd.MM.yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{20} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE"/>
</root>
</configuration>

View File

@ -1,50 +0,0 @@
package org.sadtech.bot.gitlab.context.domain.entity;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* Пользователь битбакета.
*
* @author upagge [30.01.2020]
*/
@Getter
@Setter
@Entity
@Table(name = "person")
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Person {
/**
* Логин
*/
@Id
@EqualsAndHashCode.Include
@Column(name = "login")
private String login;
/**
* Персональный токен из битбакета
*/
@Column(name = "bitbucket_token")
private String token;
/**
* Идентификатор телеграма
*/
@Column(name = "telegram_id")
private Long telegramId;
/**
* ФИО
*/
@Column(name = "full_name")
private String fullName;
}

View File

@ -1,49 +0,0 @@
package org.sadtech.bot.gitlab.context.domain.entity;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.sadtech.bot.gitlab.context.domain.PointType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDateTime;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
@Getter
@Setter
@Entity
@Table(name = "rating_history")
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class RatingHistory {
@Id
@Column(name = "id")
@EqualsAndHashCode.Include
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "login")
private String login;
@Column(name = "points")
private Integer points;
@Enumerated(EnumType.STRING)
@Column(name = "type")
private PointType type;
@Column(name = "date_add")
private LocalDateTime dateAdd;
}

View File

@ -1,42 +0,0 @@
package org.sadtech.bot.gitlab.context.domain.entity;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
@Getter
@Setter
@Entity
@Table(name = "rating_list")
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class RatingList implements Comparable<RatingList> {
@Id
@Column(name = "login")
@EqualsAndHashCode.Include
private String login;
@Column(name = "points")
private Integer points;
@Column(name = "number")
private Integer number;
@Override
public int compareTo(@NonNull RatingList ratingList) {
return Integer.compare(ratingList.getPoints(), points);
}
}

View File

@ -1,31 +0,0 @@
package org.sadtech.bot.gitlab.context.repository;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
* // TODO: 06.09.2020 Добавить описание.
*
* @author upagge 06.09.2020
*/
public interface PersonRepository {
Person save(@NonNull Person person);
boolean existsByTelegramId(Long chatId);
boolean existsByLogin(String login);
List<Person> findAllByTelegramIdNotNullAndTokenNotNull();
Set<Long> findAllTelegramIdByLogin(Set<String> logins);
Optional<Person> findByLogin(@NonNull String login);
Optional<Person> findByTelegramId(@NonNull Long telegramId);
}

View File

@ -1,19 +0,0 @@
package org.sadtech.bot.gitlab.context.repository;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.RatingHistory;
import org.sadtech.haiti.context.repository.SimpleManagerRepository;
import java.time.LocalDateTime;
import java.util.List;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
public interface RatingHistoryRepository extends SimpleManagerRepository<RatingHistory, Long> {
List<RatingHistory> findAllByDateAddBetween(@NonNull LocalDateTime from, @NonNull LocalDateTime to);
}

View File

@ -1,24 +0,0 @@
package org.sadtech.bot.gitlab.context.repository;
import org.sadtech.bot.gitlab.context.domain.entity.RatingList;
import org.sadtech.haiti.context.repository.SimpleManagerRepository;
import java.util.List;
import java.util.Optional;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
public interface RatingListRepository extends SimpleManagerRepository<RatingList, String> {
Optional<RatingList> getByLogin(String login);
List<RatingList> findFirstThree();
List<RatingList> findLastThree();
long count();
}

View File

@ -1,29 +0,0 @@
package org.sadtech.bot.gitlab.context.service;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
public interface PersonService {
Set<String> existsByLogin(@NonNull Set<String> logins);
Person reg(@NonNull Person user);
List<Person> getAllRegister();
Set<Long> getAllTelegramIdByLogin(Set<String> logins);
Person create(@NonNull Person person);
List<Person> createAll(Collection<Person> newUsers);
boolean existsByTelegram(Long telegramId);
Optional<Person> getByTelegramId(@NonNull Long telegramId);
}

View File

@ -1,19 +0,0 @@
package org.sadtech.bot.gitlab.context.service;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.PointType;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
public interface RatingService {
void addRating(@NonNull String login, @NonNull PointType type, @NonNull Integer points);
void ratingRecalculation();
String getRatingTop(@NonNull String login);
}

View File

@ -1,15 +0,0 @@
package org.sadtech.bot.gitlab.context.service.parser;
/**
* // TODO: 06.09.2020 Добавить описание.
*
* @author upagge 06.09.2020
*/
public interface PersonParser {
/**
* Извлечение новых пользователей SCV.
*/
void scanNewPerson();
}

View File

@ -13,12 +13,13 @@ import org.springframework.stereotype.Component;
@Getter @Getter
@Setter @Setter
@Component @Component
@ConfigurationProperties("bitbucketbot.bitbucket") @ConfigurationProperties("gitlab-bot.gitlab")
public class BitbucketProperty { public class GitlabProperty {
private String username;
private String fullName;
/**
* Токен администратора
*/
private String token; private String token;
/** /**
@ -41,9 +42,4 @@ public class BitbucketProperty {
*/ */
private String urlPullRequest; private String urlPullRequest;
/**
* Адрес на получение пользователей битбакет
*/
private String urlUsers;
} }

View File

@ -1,21 +0,0 @@
package org.sadtech.bot.gitlab.core.config.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* // TODO: 25.10.2020 Добавить описание.
*
* @author upagge 25.10.2020
*/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "bitbucketbot.rating")
public class RatingProperty {
boolean enabled = false;
}

View File

@ -2,12 +2,10 @@ package org.sadtech.bot.gitlab.core.scheduler;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.EntityType; import org.sadtech.bot.gitlab.context.domain.EntityType;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.domain.entity.PullRequest; import org.sadtech.bot.gitlab.context.domain.entity.PullRequest;
import org.sadtech.bot.gitlab.context.domain.notify.GoodMorningNotify; import org.sadtech.bot.gitlab.context.domain.notify.GoodMorningNotify;
import org.sadtech.bot.gitlab.context.domain.notify.SimpleTextNotify; import org.sadtech.bot.gitlab.context.domain.notify.SimpleTextNotify;
import org.sadtech.bot.gitlab.context.service.NotifyService; import org.sadtech.bot.gitlab.context.service.NotifyService;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.PullRequestsService; import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.context.utils.Smile; import org.sadtech.bot.gitlab.context.utils.Smile;
import org.sadtech.bot.gitlab.core.config.properties.AppProperty; import org.sadtech.bot.gitlab.core.config.properties.AppProperty;
@ -31,7 +29,6 @@ public class NotificationScheduler {
"mstruchkov", "emukhin", "imescheryakov", "kkeglev" "mstruchkov", "emukhin", "imescheryakov", "kkeglev"
)); ));
private final PersonService personService;
private final PullRequestsService pullRequestsService; private final PullRequestsService pullRequestsService;
private final NotifyService notifyService; private final NotifyService notifyService;

View File

@ -11,7 +11,6 @@ import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.repository.CommentRepository; import org.sadtech.bot.gitlab.context.repository.CommentRepository;
import org.sadtech.bot.gitlab.context.service.CommentService; import org.sadtech.bot.gitlab.context.service.CommentService;
import org.sadtech.bot.gitlab.context.service.NotifyService; import org.sadtech.bot.gitlab.context.service.NotifyService;
import org.sadtech.bot.gitlab.context.service.RatingService;
import org.sadtech.bot.gitlab.context.service.TaskService; import org.sadtech.bot.gitlab.context.service.TaskService;
import org.sadtech.haiti.core.service.AbstractSimpleManagerService; import org.sadtech.haiti.core.service.AbstractSimpleManagerService;
import org.sadtech.haiti.core.util.Assert; import org.sadtech.haiti.core.util.Assert;

View File

@ -1,111 +0,0 @@
package org.sadtech.bot.gitlab.core.service.impl;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.sadtech.bot.gitlab.context.domain.entity.NotifySetting;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.exception.RegException;
import org.sadtech.bot.gitlab.context.repository.PersonRepository;
import org.sadtech.bot.gitlab.context.service.NotifyService;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.core.config.properties.BitbucketProperty;
import org.sadtech.bot.gitlab.core.utils.Utils;
import org.sadtech.haiti.core.util.Assert;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
@Slf4j
@Service
public class PersonServiceImpl implements PersonService {
private final PersonRepository personRepository;
private final BitbucketProperty bitbucketProperty;
private final NotifyService notifyService;
public PersonServiceImpl(
PersonRepository personRepository,
BitbucketProperty bitbucketProperty,
@Lazy NotifyService notifyService
) {
this.personRepository = personRepository;
this.bitbucketProperty = bitbucketProperty;
this.notifyService = notifyService;
}
@Override
public Set<String> existsByLogin(@NonNull Set<String> logins) {
return logins.stream()
.filter(personRepository::existsByLogin)
.collect(Collectors.toSet());
}
@Override
public Person reg(@NonNull Person user) {
final Optional<Person> optUser = personRepository.findByLogin(user.getLogin());
if (optUser.isPresent()) {
final Person oldUser = optUser.get();
if (oldUser.getTelegramId() == null) {
Optional<Object> sheetJson = Utils.urlToJson(bitbucketProperty.getUrlPullRequestClose(), user.getToken(), Object.class);
if (sheetJson.isPresent()) {
oldUser.setTelegramId(user.getTelegramId());
defaultSettings(oldUser);
return personRepository.save(oldUser);
} else {
throw new RegException("Ваш токен не валиден");
}
} else {
throw new RegException("Вы уже авторизованы в системе");
}
}
throw new RegException("Пользователь не найден, подождите обновление базы пользователей!");
}
private void defaultSettings(Person person) {
final NotifySetting notifySetting = new NotifySetting();
notifySetting.setLogin(person.getLogin());
notifySetting.setStartReceiving(LocalDateTime.now());
notifyService.saveSettings(notifySetting);
}
@Override
public List<Person> getAllRegister() {
return personRepository.findAllByTelegramIdNotNullAndTokenNotNull();
}
@Override
public Set<Long> getAllTelegramIdByLogin(Set<String> logins) {
return personRepository.findAllTelegramIdByLogin(logins);
}
@Override
public Person create(@NonNull Person person) {
Assert.isNotNull(person.getLogin(), "При создании пользователя должен присутствовать логин");
return personRepository.save(person);
}
@Override
public List<Person> createAll(Collection<Person> newPersons) {
return newPersons.stream().map(this::create).collect(Collectors.toList());
}
@Override
public boolean existsByTelegram(Long telegramId) {
return personRepository.existsByTelegramId(telegramId);
}
@Override
public Optional<Person> getByTelegramId(@NonNull Long telegramId) {
return personRepository.findByTelegramId(telegramId);
}
}

View File

@ -19,8 +19,6 @@ import org.sadtech.bot.gitlab.context.exception.UpdateException;
import org.sadtech.bot.gitlab.context.repository.PullRequestsRepository; import org.sadtech.bot.gitlab.context.repository.PullRequestsRepository;
import org.sadtech.bot.gitlab.context.service.NotifyService; import org.sadtech.bot.gitlab.context.service.NotifyService;
import org.sadtech.bot.gitlab.context.service.PullRequestsService; import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.context.service.RatingService;
import org.sadtech.bot.gitlab.core.config.properties.RatingProperty;
import org.sadtech.bot.vsc.context.domain.PullRequestStatus; import org.sadtech.bot.vsc.context.domain.PullRequestStatus;
import org.sadtech.bot.vsc.context.domain.ReviewerStatus; import org.sadtech.bot.vsc.context.domain.ReviewerStatus;
import org.sadtech.haiti.context.page.Pagination; import org.sadtech.haiti.context.page.Pagination;

View File

@ -1,140 +0,0 @@
package org.sadtech.bot.gitlab.core.service.impl;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.PointType;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.domain.entity.RatingHistory;
import org.sadtech.bot.gitlab.context.domain.entity.RatingList;
import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.repository.RatingHistoryRepository;
import org.sadtech.bot.gitlab.context.repository.RatingListRepository;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.RatingService;
import org.sadtech.bot.gitlab.context.utils.Smile;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
@Service
@RequiredArgsConstructor
public class RatingServiceImpl implements RatingService {
private final RatingHistoryRepository ratingHistoryRepository;
private final RatingListRepository ratingListRepository;
private final PersonService personService;
@Override
public void addRating(@NonNull String login, @NonNull PointType type, @NonNull Integer points) {
final RatingHistory ratingHistory = new RatingHistory();
ratingHistory.setLogin(login);
ratingHistory.setPoints(points);
ratingHistory.setType(type);
ratingHistory.setDateAdd(LocalDateTime.now());
ratingHistoryRepository.save(ratingHistory);
}
@Override
public void ratingRecalculation() {
AtomicInteger i = new AtomicInteger();
final List<RatingList> newRatingList = ratingHistoryRepository.findAllByDateAddBetween(LocalDateTime.now().minusDays(30L), LocalDateTime.now()).stream()
.collect(Collectors.groupingBy(RatingHistory::getLogin, Collectors.summingInt(RatingHistory::getPoints)))
.entrySet().stream()
.map(this::createRatingList)
.collect(Collectors.toList());
final Set<String> ratingListLogins = newRatingList.stream()
.map(RatingList::getLogin)
.collect(Collectors.toSet());
final Set<String> regLogins = personService.getAllRegister().stream()
.map(Person::getLogin)
.collect(Collectors.toSet());
newRatingList.addAll(
regLogins.stream()
.filter(s -> !ratingListLogins.contains(s))
.map(this::createEmptyRatingList)
.collect(Collectors.toList())
);
ratingListRepository.saveAll(
newRatingList.stream()
.sorted()
.peek(ratingList -> ratingList.setNumber(i.getAndIncrement()))
.collect(Collectors.toList())
);
}
private RatingList createEmptyRatingList(String s) {
final RatingList ratingList = new RatingList();
ratingList.setLogin(s);
ratingList.setPoints(0);
return ratingList;
}
private RatingList createRatingList(Map.Entry<String, Integer> entry) {
final RatingList ratingList = new RatingList();
ratingList.setLogin(entry.getKey());
ratingList.setPoints(entry.getValue());
return ratingList;
}
@Override
public String getRatingTop(@NonNull String login) {
final RatingList personRating = ratingListRepository.getByLogin(login)
.orElseThrow(() -> new NotFoundException("Пользователь не найден"));
final long countPerson = ratingListRepository.count();
final String threeMessage = ratingListRepository.findFirstThree().stream()
.map(this::createString)
.collect(Collectors.joining("\n"));
final String lastMessage = ratingListRepository.findLastThree().stream()
.limit(countPerson - 3 < 0 ? 0 : countPerson - 3)
.map(this::createString)
.collect(Collectors.joining("\n"));
String message;
if (personRating.getPoints() == 0) {
message = Smile.SADLY + " У вас не обнаружена активность в битбакете, поэтому вы не учавствуйте в рейтинге" +
"\n\n" + Smile.TOP + " Рейтинговая таблица " + Smile.TOP + Smile.HR + threeMessage + "\n... ... ... ... ...\n";
} else {
message = Smile.TOP + " Рейтинговая таблица " + Smile.TOP + Smile.HR + threeMessage;
final Integer numberRatingList = personRating.getNumber();
if (numberRatingList <= 2) {
if (countPerson > 3) {
message += "\n... ... ... ... ...\n";
}
} else if (numberRatingList > 3 && numberRatingList <= (countPerson - 3)) {
message += "\n... ... ... ... ...\n" + personRating.getNumber() + ": " + personRating.getLogin() + "\n... ... ... ... ...\n";
} else {
message += "\n... ... ... ... ...\n";
}
}
message += lastMessage;
return message;
}
private String createString(RatingList ratingList) {
String message = "";
final Integer number = ratingList.getNumber();
if (number == 0) {
message += Smile.TOP_ONE.getValue() + " " + ratingList.getLogin() + " " + Smile.TOP_ONE.getValue();
} else if (number == 1) {
message += Smile.TOP_TWO.getValue() + " " + ratingList.getLogin() + " " + Smile.TOP_TWO.getValue();
} else if (number == 2) {
message += Smile.TOP_THREE.getValue() + " " + ratingList.getLogin() + " " + Smile.TOP_THREE.getValue();
} else {
message += Smile.KAKASHKA.getValue() + " " + ratingList.getLogin();
}
return message;
}
}

View File

@ -16,7 +16,6 @@ import org.sadtech.bot.gitlab.context.repository.TaskRepository;
import org.sadtech.bot.gitlab.context.service.CommentService; import org.sadtech.bot.gitlab.context.service.CommentService;
import org.sadtech.bot.gitlab.context.service.NotifyService; import org.sadtech.bot.gitlab.context.service.NotifyService;
import org.sadtech.bot.gitlab.context.service.PullRequestsService; import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.context.service.RatingService;
import org.sadtech.bot.gitlab.context.service.TaskService; import org.sadtech.bot.gitlab.context.service.TaskService;
import org.sadtech.haiti.core.service.AbstractSimpleManagerService; import org.sadtech.haiti.core.service.AbstractSimpleManagerService;
import org.sadtech.haiti.core.util.Assert; import org.sadtech.haiti.core.util.Assert;

View File

@ -1,54 +0,0 @@
package org.sadtech.bot.gitlab.core.utils;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
/**
* @author upagge [30.01.2020]
*/
@Slf4j
public class Utils {
private static final ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
private static final OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
private Utils() {
throw new IllegalStateException("Утилитарный класс");
}
public static <T> Optional<T> urlToJson(@NonNull String urlValue, @NonNull String token, @NonNull Class<T> classOfT) {
Request request = new Request.Builder()
.url(urlValue)
.header("Authorization", "Bearer " + token)
.header("Accept", "text/html,application/xhtml+xml,application/json")
.build();
try (final Response execute = client.newCall(request).execute()) {
if (execute.isSuccessful() && execute.body() != null) {
return Optional.ofNullable(objectMapper.readValue(execute.body().string(), classOfT));
}
} catch (IOException e) {
log.error(e.getMessage());
}
return Optional.empty();
}
}

View File

@ -1,74 +0,0 @@
package org.sadtech.bot.gitlab.data.impl;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.repository.PersonRepository;
import org.sadtech.bot.gitlab.data.jpa.PersonJpaRepository;
import org.springframework.dao.InvalidDataAccessResourceUsageException;
import org.springframework.stereotype.Repository;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
* // TODO: 06.09.2020 Добавить описание.
*
* @author upagge 06.09.2020
*/
@Slf4j
@Repository
@RequiredArgsConstructor
public class PersonRepositoryImpl implements PersonRepository {
private final PersonJpaRepository jpaRepository;
@Override
public Person save(@NonNull Person person) {
return jpaRepository.save(person);
}
@Override
public boolean existsByTelegramId(Long chatId) {
return jpaRepository.existsByTelegramId(chatId);
}
@Override
public boolean existsByLogin(String login) {
try {
return jpaRepository.existsByLogin(login);
} catch (InvalidDataAccessResourceUsageException e) {
log.error(e.getMessage());
}
return false;
}
@Override
public List<Person> findAllByTelegramIdNotNullAndTokenNotNull() {
try {
return jpaRepository.findAllByTelegramIdNotNullAndTokenNotNull();
} catch (InvalidDataAccessResourceUsageException e) {
log.error(e.getMessage());
}
return Collections.emptyList();
}
@Override
public Set<Long> findAllTelegramIdByLogin(Set<String> logins) {
return jpaRepository.findAllTelegramIdByLogin(logins);
}
@Override
public Optional<Person> findByLogin(@NonNull String login) {
return jpaRepository.findById(login);
}
@Override
public Optional<Person> findByTelegramId(@NonNull Long telegramId) {
return jpaRepository.findByTelegramId(telegramId);
}
}

View File

@ -1,33 +0,0 @@
package org.sadtech.bot.gitlab.data.impl;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.RatingHistory;
import org.sadtech.bot.gitlab.context.repository.RatingHistoryRepository;
import org.sadtech.bot.gitlab.data.jpa.RatingHistoryJpaRepository;
import org.sadtech.haiti.database.repository.manager.AbstractSimpleManagerRepository;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
@Repository
public class RatingHistoryRepositoryImpl extends AbstractSimpleManagerRepository<RatingHistory, Long> implements RatingHistoryRepository {
private final RatingHistoryJpaRepository jpaRepository;
public RatingHistoryRepositoryImpl(RatingHistoryJpaRepository jpaRepository) {
super(jpaRepository);
this.jpaRepository = jpaRepository;
}
@Override
public List<RatingHistory> findAllByDateAddBetween(@NonNull LocalDateTime from, @NonNull LocalDateTime to) {
return jpaRepository.findAllByDateAddBetween(from, to);
}
}

View File

@ -1,47 +0,0 @@
package org.sadtech.bot.gitlab.data.impl;
import org.sadtech.bot.gitlab.context.domain.entity.RatingList;
import org.sadtech.bot.gitlab.context.repository.RatingListRepository;
import org.sadtech.bot.gitlab.data.jpa.RatingListJpaRepository;
import org.sadtech.haiti.database.repository.manager.AbstractSimpleManagerRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
@Repository
public class RatingListRepositoryImpl extends AbstractSimpleManagerRepository<RatingList, String> implements RatingListRepository {
private final RatingListJpaRepository jpaRepository;
public RatingListRepositoryImpl(RatingListJpaRepository jpaRepository) {
super(jpaRepository);
this.jpaRepository = jpaRepository;
}
@Override
public Optional<RatingList> getByLogin(String login) {
return jpaRepository.findById(login);
}
@Override
public List<RatingList> findFirstThree() {
return jpaRepository.findTop3ByPointsGreaterThanOrderByNumberAsc(0);
}
@Override
public List<RatingList> findLastThree() {
return jpaRepository.findTop3ByPointsGreaterThanOrderByNumberDesc(0);
}
@Override
public long count() {
return jpaRepository.countByNumberGreaterThan(0);
}
}

View File

@ -1,34 +0,0 @@
package org.sadtech.bot.gitlab.data.jpa;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
import java.util.Set;
/**
* TODO: Добавить описание класса.
*
* @author upagge [30.01.2020]
*/
@Repository
public interface PersonJpaRepository extends JpaRepository<Person, String> {
boolean existsByTelegramId(Long chatId);
boolean existsByLogin(String login);
List<Person> findAllByTelegramIdNotNullAndTokenNotNull();
@Query("SELECT u.telegramId FROM Person u WHERE u.login=:login")
Long findTelegramIdByLogin(String login);
@Query("SELECT u.telegramId FROM Person u WHERE u.login IN :logins AND u.telegramId IS NOT NULL")
Set<Long> findAllTelegramIdByLogin(Set<String> logins);
Optional<Person> findByTelegramId(Long telegramId);
}

View File

@ -1,19 +0,0 @@
package org.sadtech.bot.gitlab.data.jpa;
import org.sadtech.bot.gitlab.context.domain.entity.RatingHistory;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.LocalDateTime;
import java.util.List;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
public interface RatingHistoryJpaRepository extends JpaRepository<RatingHistory, Long> {
List<RatingHistory> findAllByDateAddBetween(LocalDateTime from, LocalDateTime to);
}

View File

@ -1,22 +0,0 @@
package org.sadtech.bot.gitlab.data.jpa;
import org.sadtech.bot.gitlab.context.domain.entity.RatingList;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
public interface RatingListJpaRepository extends JpaRepository<RatingList, String> {
List<RatingList> findTop3ByPointsGreaterThanOrderByNumberAsc(Integer points);
List<RatingList> findTop3ByPointsGreaterThanOrderByNumberDesc(Integer points);
Long countByNumberGreaterThan(Integer points);
}

View File

@ -4,11 +4,11 @@ import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.entity.PullRequest; import org.sadtech.bot.gitlab.context.domain.entity.PullRequest;
import org.sadtech.bot.gitlab.context.domain.entity.Reviewer; import org.sadtech.bot.gitlab.context.domain.entity.Reviewer;
import org.sadtech.bot.gitlab.core.utils.StringUtils; import org.sadtech.bot.gitlab.core.utils.StringUtils;
import org.sadtech.bot.gitlab.sdk.domain.AuthorJson;
import org.sadtech.bot.gitlab.sdk.domain.Outcome; import org.sadtech.bot.gitlab.sdk.domain.Outcome;
import org.sadtech.bot.gitlab.sdk.domain.Properties; import org.sadtech.bot.gitlab.sdk.domain.Properties;
import org.sadtech.bot.gitlab.sdk.domain.PullRequestJson; import org.sadtech.bot.gitlab.sdk.domain.PullRequestJson;
import org.sadtech.bot.gitlab.sdk.domain.PullRequestState; import org.sadtech.bot.gitlab.sdk.domain.PullRequestState;
import org.sadtech.bot.gitlab.sdk.domain.UserDecisionJson;
import org.sadtech.bot.gitlab.sdk.domain.UserPullRequestStatus; import org.sadtech.bot.gitlab.sdk.domain.UserPullRequestStatus;
import org.sadtech.bot.vsc.context.domain.PullRequestStatus; import org.sadtech.bot.vsc.context.domain.PullRequestStatus;
import org.sadtech.bot.vsc.context.domain.ReviewerStatus; import org.sadtech.bot.vsc.context.domain.ReviewerStatus;
@ -23,6 +23,32 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
public class PullRequestJsonConverter implements Converter<PullRequestJson, PullRequest> { public class PullRequestJsonConverter implements Converter<PullRequestJson, PullRequest> {
public static PullRequestStatus convertPullRequestStatus(PullRequestState state) {
switch (state) {
case OPENED:
return PullRequestStatus.OPEN;
case MERGED:
return PullRequestStatus.MERGED;
case DECLINED:
return PullRequestStatus.DECLINED;
default:
throw new ConvertException("Неподдерживаемый тип ПР");
}
}
private static ReviewerStatus convertStatusReviewer(UserPullRequestStatus status) {
switch (status) {
case APPROVED:
return ReviewerStatus.APPROVED;
case NEEDS_WORK:
return ReviewerStatus.UNAPPROVED;
case UNAPPROVED:
return ReviewerStatus.NEEDS_WORK;
default:
throw new ConvertException("Неподдерживаемый статус ревьювера");
}
}
@Override @Override
public PullRequest convert(PullRequestJson json) { public PullRequest convert(PullRequestJson json) {
@ -54,20 +80,7 @@ public class PullRequestJsonConverter implements Converter<PullRequestJson, Pull
&& Outcome.CONFLICTED.equals(properties.getMergeResult().getOutcome()); && Outcome.CONFLICTED.equals(properties.getMergeResult().getOutcome());
} }
public static PullRequestStatus convertPullRequestStatus(PullRequestState state) { private List<Reviewer> convertReviewers(List<AuthorJson> jsonReviewers) {
switch (state) {
case OPEN:
return PullRequestStatus.OPEN;
case MERGED:
return PullRequestStatus.MERGED;
case DECLINED:
return PullRequestStatus.DECLINED;
default:
throw new ConvertException("Неподдерживаемый тип ПР");
}
}
private List<Reviewer> convertReviewers(List<UserDecisionJson> jsonReviewers) {
return jsonReviewers.stream() return jsonReviewers.stream()
.map( .map(
jsonReviewer -> { jsonReviewer -> {
@ -80,17 +93,4 @@ public class PullRequestJsonConverter implements Converter<PullRequestJson, Pull
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private static ReviewerStatus convertStatusReviewer(UserPullRequestStatus status) {
switch (status) {
case APPROVED:
return ReviewerStatus.APPROVED;
case NEEDS_WORK:
return ReviewerStatus.UNAPPROVED;
case UNAPPROVED:
return ReviewerStatus.NEEDS_WORK;
default:
throw new ConvertException("Неподдерживаемый статус ревьювера");
}
}
} }

View File

@ -1,6 +1,5 @@
package org.sadtech.bot.vcs.bitbucket.core.service.converter; package org.sadtech.bot.vcs.bitbucket.core.service.converter;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.sdk.domain.UserJson; import org.sadtech.bot.gitlab.sdk.domain.UserJson;
import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

View File

@ -0,0 +1,21 @@
package org.sadtech.bot.gitlab.sdk.domain;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* TODO: Добавить описание класса.
*
* @author upagge [31.01.2020]
*/
@Data
public class AuthorJson {
private Long id;
private String name;
private String userName;
@JsonProperty("web_url")
private String webUrl;
}

View File

@ -1,11 +1,11 @@
package org.sadtech.bot.gitlab.sdk.domain; package org.sadtech.bot.gitlab.sdk.domain;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Data; import lombok.Data;
import org.sadtech.bot.gitlab.sdk.utils.LocalDateTimeFromEpochDeserializer; import org.sadtech.bot.gitlab.sdk.utils.LocalDateTimeFromEpochDeserializer;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
/** /**
* TODO: Добавить описание класса. * TODO: Добавить описание класса.
@ -16,21 +16,30 @@ import java.util.List;
public class PullRequestJson { public class PullRequestJson {
private Long id; private Long id;
private Integer version;
@JsonProperty("iid")
private Long twoId;
@JsonProperty("project_id")
private Long projectId;
private String title;
private String description;
private PullRequestState state; private PullRequestState state;
@JsonProperty("created_at")
@JsonDeserialize(using = LocalDateTimeFromEpochDeserializer.class) @JsonDeserialize(using = LocalDateTimeFromEpochDeserializer.class)
private LocalDateTime createdDate; private LocalDateTime createdDate;
@JsonProperty("updated_at")
@JsonDeserialize(using = LocalDateTimeFromEpochDeserializer.class) @JsonDeserialize(using = LocalDateTimeFromEpochDeserializer.class)
private LocalDateTime updatedDate; private LocalDateTime updatedDate;
private String title; private AuthorJson author;
private String description;
private LinkJson links; @JsonProperty("web_url")
private UserDecisionJson author; private String webUrl;
private List<UserDecisionJson> reviewers;
private FromRefJson fromRef; @JsonProperty("has_conflicts")
private Properties properties; private String conflicts;
} }

View File

@ -7,6 +7,6 @@ package org.sadtech.bot.gitlab.sdk.domain;
*/ */
public enum PullRequestState { public enum PullRequestState {
OPEN, MERGED, DECLINED OPENED, MERGED, DECLINED
} }

View File

@ -1,18 +0,0 @@
package org.sadtech.bot.gitlab.sdk.domain;
import lombok.Data;
/**
* TODO: Добавить описание класса.
*
* @author upagge [31.01.2020]
*/
@Data
public class UserDecisionJson {
private UserJson user;
private BitbucketUserRole role;
private Boolean approved;
private UserPullRequestStatus status;
}

View File

@ -1,13 +0,0 @@
package org.sadtech.bot.gitlab.sdk.domain.sheet;
import org.sadtech.bot.gitlab.sdk.domain.PullRequestJson;
import org.sadtech.bot.gitlab.sdk.domain.Sheet;
/**
* TODO: Добавить описание класса.
*
* @author upagge [02.02.2020]
*/
public class PullRequestSheetJson extends Sheet<PullRequestJson> {
}

View File

@ -15,7 +15,7 @@
<module>bot-core</module> <module>bot-core</module>
<module>bot-app</module> <module>bot-app</module>
<module>teamcity</module> <module>teamcity</module>
<module>bitbucketbot-core</module> <module>gitlab-core</module>
<module>bot-data</module> <module>bot-data</module>
</modules> </modules>
@ -171,6 +171,12 @@
<version>${haiti.database.version}</version> <version>${haiti.database.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.sadtech.haiti</groupId>
<artifactId>haiti-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency> <dependency>
<groupId>org.sadtech.bot.godfather</groupId> <groupId>org.sadtech.bot.godfather</groupId>
<artifactId>telegram-bot</artifactId> <artifactId>telegram-bot</artifactId>

View File

@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
@Getter @Getter
@Setter @Setter
@Component @Component
@ConfigurationProperties(prefix = "bitbucketbot.teamcity") @ConfigurationProperties(prefix = "gitlab-bot.teamcity")
public class TeamcityProperty { public class TeamcityProperty {
private String token; private String token;

View File

@ -7,7 +7,6 @@ package org.sadtech.bot.gitlab.teamcity.core.service.parser;
*/ */
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.core.utils.Utils;
import org.sadtech.bot.gitlab.teamcity.core.config.property.TeamcityProperty; import org.sadtech.bot.gitlab.teamcity.core.config.property.TeamcityProperty;
import org.sadtech.bot.gitlab.teamcity.core.domain.entity.BuildShort; import org.sadtech.bot.gitlab.teamcity.core.domain.entity.BuildShort;
import org.sadtech.bot.gitlab.teamcity.core.domain.entity.TeamcityProject; import org.sadtech.bot.gitlab.teamcity.core.domain.entity.TeamcityProject;

View File

@ -1,7 +1,6 @@
package org.sadtech.bot.gitlab.teamcity.core.service.parser; package org.sadtech.bot.gitlab.teamcity.core.service.parser;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.core.utils.Utils;
import org.sadtech.bot.gitlab.teamcity.core.config.property.TeamcityProperty; import org.sadtech.bot.gitlab.teamcity.core.config.property.TeamcityProperty;
import org.sadtech.bot.gitlab.teamcity.core.domain.entity.TeamcityProject; import org.sadtech.bot.gitlab.teamcity.core.domain.entity.TeamcityProject;
import org.sadtech.bot.gitlab.teamcity.core.service.TeamcityProjectService; import org.sadtech.bot.gitlab.teamcity.core.service.TeamcityProjectService;

View File

@ -6,7 +6,6 @@ import org.sadtech.bot.gitlab.context.domain.notify.Notify;
import org.sadtech.bot.gitlab.context.exception.NotFoundException; import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.service.ChatService; import org.sadtech.bot.gitlab.context.service.ChatService;
import org.sadtech.bot.gitlab.context.service.MessageSendService; import org.sadtech.bot.gitlab.context.service.MessageSendService;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.social.core.domain.BoxAnswer; import org.sadtech.social.core.domain.BoxAnswer;
import org.sadtech.social.core.service.sender.Sending; import org.sadtech.social.core.service.sender.Sending;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;

View File

@ -1,34 +0,0 @@
package org.sadtech.bot.gitlab.telegram.service.unit;
import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.RatingService;
import org.sadtech.social.bot.service.usercode.ProcessingData;
import org.sadtech.social.core.domain.BoxAnswer;
import org.sadtech.social.core.domain.content.Message;
import org.springframework.stereotype.Component;
/**
* // TODO: 01.10.2020 Добавить описание.
*
* @author upagge 01.10.2020
*/
@Component
@RequiredArgsConstructor
public class RatingTopProcessing implements ProcessingData<Message> {
private final RatingService ratingService;
private final PersonService personService;
@Override
public BoxAnswer processing(Message content) {
final Person person = personService.getByTelegramId(content.getPersonId())
.orElseThrow(() -> new NotFoundException("Пользователь не найден"));
return BoxAnswer.builder()
.message(ratingService.getRatingTop(person.getLogin()))
.build();
}
}

View File

@ -2,10 +2,8 @@ package org.sadtech.bot.gitlab.telegram.service.unit;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.TaskStatus; import org.sadtech.bot.gitlab.context.domain.TaskStatus;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.domain.entity.Task; import org.sadtech.bot.gitlab.context.domain.entity.Task;
import org.sadtech.bot.gitlab.context.exception.NotFoundException; import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.TaskService; import org.sadtech.bot.gitlab.context.service.TaskService;
import org.sadtech.social.bot.service.usercode.ProcessingData; import org.sadtech.social.bot.service.usercode.ProcessingData;
import org.sadtech.social.core.domain.BoxAnswer; import org.sadtech.social.core.domain.BoxAnswer;

View File

@ -1,10 +1,8 @@
package org.sadtech.bot.gitlab.telegram.service.unit.pullrequest; package org.sadtech.bot.gitlab.telegram.service.unit.pullrequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.domain.entity.PullRequest; import org.sadtech.bot.gitlab.context.domain.entity.PullRequest;
import org.sadtech.bot.gitlab.context.exception.NotFoundException; import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.PullRequestsService; import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.context.utils.MessageUtils; import org.sadtech.bot.gitlab.context.utils.MessageUtils;
import org.sadtech.bot.vsc.context.domain.ReviewerStatus; import org.sadtech.bot.vsc.context.domain.ReviewerStatus;

View File

@ -1,10 +1,8 @@
package org.sadtech.bot.gitlab.telegram.service.unit.pullrequest; package org.sadtech.bot.gitlab.telegram.service.unit.pullrequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.domain.entity.PullRequest; import org.sadtech.bot.gitlab.context.domain.entity.PullRequest;
import org.sadtech.bot.gitlab.context.exception.NotFoundException; import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.context.service.PullRequestsService; import org.sadtech.bot.gitlab.context.service.PullRequestsService;
import org.sadtech.bot.gitlab.context.utils.MessageUtils; import org.sadtech.bot.gitlab.context.utils.MessageUtils;
import org.sadtech.bot.vsc.context.domain.PullRequestStatus; import org.sadtech.bot.vsc.context.domain.PullRequestStatus;

View File

@ -4,10 +4,8 @@ import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.domain.entity.NotifySetting; import org.sadtech.bot.gitlab.context.domain.entity.NotifySetting;
import org.sadtech.bot.gitlab.context.domain.entity.Person;
import org.sadtech.bot.gitlab.context.exception.NotFoundException; import org.sadtech.bot.gitlab.context.exception.NotFoundException;
import org.sadtech.bot.gitlab.context.service.NotifyService; import org.sadtech.bot.gitlab.context.service.NotifyService;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.social.bot.domain.unit.AnswerProcessing; import org.sadtech.social.bot.domain.unit.AnswerProcessing;
import org.sadtech.social.bot.domain.unit.AnswerText; import org.sadtech.social.bot.domain.unit.AnswerText;
import org.sadtech.social.core.domain.BoxAnswer; import org.sadtech.social.core.domain.BoxAnswer;

View File

@ -1,8 +1,6 @@
package org.sadtech.bot.gitlab.telegram.unit; package org.sadtech.bot.gitlab.telegram.unit;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.bot.gitlab.context.service.PersonService;
import org.sadtech.bot.gitlab.telegram.service.unit.RatingTopProcessing;
import org.sadtech.bot.gitlab.telegram.service.unit.TaskProcessing; import org.sadtech.bot.gitlab.telegram.service.unit.TaskProcessing;
import org.sadtech.bot.gitlab.telegram.utils.GeneratorKeyBoards; import org.sadtech.bot.gitlab.telegram.utils.GeneratorKeyBoards;
import org.sadtech.social.bot.domain.unit.AnswerCheck; import org.sadtech.social.bot.domain.unit.AnswerCheck;