Большой рефакторинг 2

This commit is contained in:
Struchkov Mark 2022-01-28 21:55:50 +03:00
parent 32a5bf19e1
commit f5b30b11fa
83 changed files with 259 additions and 420 deletions

View File

@ -9,7 +9,7 @@ import java.util.Arrays;
import java.util.Locale;
/**
* // TODO: 16.01.2021 Добавить описание.
* Список локализаций приложения.
*
* @author upagge 16.01.2021
*/

View File

@ -1,7 +1,6 @@
package dev.struchkov.bot.gitlab.context.domain;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/

View File

@ -4,8 +4,6 @@ import lombok.Getter;
import lombok.Setter;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
@Getter

View File

@ -1,8 +1,6 @@
package dev.struchkov.bot.gitlab.context.domain;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/
public enum PipelineStatus {

View File

@ -13,7 +13,7 @@ import javax.persistence.Id;
import javax.persistence.Table;
/**
* // TODO: 16.01.2021 Добавить описание.
* Основные настройки приложения.
*
* @author upagge 16.01.2021
*/

View File

@ -18,8 +18,6 @@ import javax.persistence.Table;
import java.util.List;
/**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021
*/
@Getter

View File

@ -12,8 +12,6 @@ import javax.persistence.Id;
import javax.persistence.Table;
/**
* // TODO: 12.09.2020 Добавить описание.
*
* @author upagge 12.09.2020
*/
@Getter

View File

@ -10,8 +10,6 @@ import javax.persistence.Id;
import javax.persistence.Table;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
@Entity

View File

@ -17,8 +17,6 @@ import javax.persistence.Table;
import java.time.LocalDateTime;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/

View File

@ -12,8 +12,6 @@ import javax.persistence.Table;
import java.time.LocalDateTime;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
@Getter

View File

@ -1,5 +1,6 @@
package dev.struchkov.bot.gitlab.context.domain.filter;
import dev.struchkov.bot.gitlab.context.domain.entity.Pipeline;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -10,7 +11,7 @@ import lombok.Setter;
import java.time.LocalDateTime;
/**
* // TODO: 08.02.2021 Добавить описание.
* Объект фильтра для {@link Pipeline}.
*
* @author upagge 08.02.2021
*/

View File

@ -5,7 +5,6 @@ import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import dev.struchkov.bot.gitlab.context.utils.MessageUtils;
import dev.struchkov.bot.gitlab.context.utils.Smile;
import lombok.Builder;
import lombok.Getter;
import java.util.List;
@ -14,28 +13,17 @@ import java.util.List;
*
* @author upagge 20.09.2020
*/
@Getter
//TODO [28.01.2022]: Решить доработать и оставить или удалить.
public class GoodMorningNotify implements Notify {
public record GoodMorningNotify(
List<MergeRequest> mergeRequestsReviews,
List<MergeRequest> mergeRequestsNeedWork,
String personName, String version
) implements Notify {
private static final Integer PR_COUNT = 4;
private final List<MergeRequest> mergeRequestsReviews;
private final List<MergeRequest> mergeRequestsNeedWork;
private final String personName;
private final String version;
@Builder
protected GoodMorningNotify(
List<MergeRequest> mergeRequestsReviews,
List<MergeRequest> mergeRequestsNeedWork,
String personName,
String version
) {
this.mergeRequestsReviews = mergeRequestsReviews;
this.mergeRequestsNeedWork = mergeRequestsNeedWork;
this.personName = personName;
this.version = version;
public GoodMorningNotify {
}
@Override

View File

@ -8,23 +8,18 @@ import lombok.Builder;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
public class NewProjectNotify implements Notify {
private final String projectName;
private final String projectUrl;
private final String projectDescription;
private final String authorName;
public record NewProjectNotify(
String projectName,
String projectUrl,
String projectDescription,
String authorName
) implements Notify {
@Builder
public NewProjectNotify(String projectName, String projectUrl, String projectDescription, String authorName) {
this.projectName = projectName;
this.projectUrl = projectUrl;
this.projectDescription = projectDescription;
this.authorName = authorName;
public NewProjectNotify {
}
@Override

View File

@ -2,21 +2,14 @@ package dev.struchkov.bot.gitlab.context.domain.notify;
import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import lombok.Builder;
import lombok.Getter;
/**
* // TODO: 20.09.2020 Добавить описание.
*
* @author upagge 20.09.2020
*/
@Getter
public class SimpleTextNotify implements Notify {
private final String message;
public record SimpleTextNotify(String message) implements Notify {
@Builder
private SimpleTextNotify(String message) {
this.message = message;
public SimpleTextNotify {
}
@Override

View File

@ -4,26 +4,17 @@ import dev.struchkov.bot.gitlab.context.domain.notify.Notify;
import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import dev.struchkov.bot.gitlab.context.utils.Smile;
import lombok.Builder;
import lombok.Getter;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
@Getter
public class CommentNotify implements Notify {
private final String authorName;
private final String message;
private final String url;
public record CommentNotify(
String url,
String authorName,
String message
) implements Notify {
@Builder
private CommentNotify(
String url,
String authorName,
String message
) {
this.authorName = authorName;
this.message = message;
this.url = url;
public CommentNotify {
}
@Override

View File

@ -10,34 +10,19 @@ import java.text.MessageFormat;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/
public class PipelineNotify implements Notify {
private final Long pipelineId;
private final String projectName;
private final String refName;
private final String newStatus;
private final String webUrl;
private String oldStatus = "n/a";
public record PipelineNotify(
Long pipelineId,
String projectName,
String refName,
String oldStatus,
String newStatus,
String webUrl
) implements Notify {
@Builder
public PipelineNotify(
Long pipelineId,
String projectName,
String refName,
String oldStatus,
String newStatus,
String webUrl
) {
this.pipelineId = pipelineId;
this.projectName = projectName;
this.refName = refName;
this.oldStatus = oldStatus;
this.newStatus = newStatus;
this.webUrl = webUrl;
public PipelineNotify {
}
@Override

View File

@ -7,8 +7,6 @@ import lombok.Builder;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
/**
* // TODO: 10.09.2020 Добавить описание.
*
* @author upagge 10.09.2020
*/
public class TaskCloseNotify extends TaskNotify {

View File

@ -8,8 +8,6 @@ import lombok.Getter;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
/**
* // TODO: 10.09.2020 Добавить описание.
*
* @author upagge 10.09.2020
*/
@Getter

View File

@ -1,15 +0,0 @@
package dev.struchkov.bot.gitlab.context.exception;
import dev.struchkov.haiti.context.exception.BasicException;
abstract class GitlabBotException extends BasicException {
public GitlabBotException(String message) {
super(message);
}
public GitlabBotException(String message, Throwable throwable) {
super(message, throwable);
}
}

View File

@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.domain.entity.AppSetting;
import dev.struchkov.haiti.context.repository.SimpleManagerRepository;
/**
* // TODO: 16.01.2021 Добавить описание.
*
* @author upagge 16.01.2021
*/
public interface AppSettingRepository extends SimpleManagerRepository<AppSetting, Long> {

View File

@ -7,12 +7,13 @@ import lombok.NonNull;
import java.util.List;
/**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021
*/
public interface DiscussionRepository extends SimpleManagerRepository<Discussion, String> {
/**
* Вернуть все дискусии для MR
*/
List<Discussion> findAllByMergeRequestId(@NonNull Long mergeRequestId);
}

View File

@ -9,8 +9,6 @@ import lombok.NonNull;
import java.util.List;
/**
* // TODO: 08.09.2020 Добавить описание.
*
* @author upagge 08.09.2020
*/
public interface NoteRepository extends SimpleManagerRepository<Note, Long> {

View File

@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.haiti.context.repository.SimpleManagerRepository;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
public interface PersonRepository extends SimpleManagerRepository<Person, Long> {

View File

@ -1,18 +1,16 @@
package dev.struchkov.bot.gitlab.context.repository;
import dev.struchkov.bot.gitlab.context.domain.PipelineStatus;
import dev.struchkov.bot.gitlab.context.domain.entity.Pipeline;
import dev.struchkov.haiti.context.page.Pagination;
import dev.struchkov.haiti.context.page.Sheet;
import dev.struchkov.haiti.context.repository.SimpleManagerRepository;
import dev.struchkov.haiti.filter.FilterOperation;
import lombok.NonNull;
import dev.struchkov.bot.gitlab.context.domain.PipelineStatus;
import java.util.Set;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/
public interface PipelineRepository extends SimpleManagerRepository<Pipeline, Long>, FilterOperation<Pipeline> {

View File

@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.domain.entity.Project;
import dev.struchkov.haiti.context.repository.SimpleManagerRepository;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
public interface ProjectRepository extends SimpleManagerRepository<Project, Long> {

View File

@ -4,20 +4,41 @@ import dev.struchkov.bot.gitlab.context.domain.AppLocale;
import lombok.NonNull;
/**
* // TODO: 16.01.2021 Добавить описание.
* Сервис отвечает за пользовательские настройки приложения.
*
* @author upagge 16.01.2021
*/
public interface AppSettingService {
/**
* Метод позволяет проверить запускается ли приложение впервые.
*
* @return true - если это первый запуск
*/
boolean isFirstStart();
/**
* Метод отмечает, что приложение было запущено.
*
* @see AppSettingService#isFirstStart()
*/
void disableFirstStart();
/**
* Позволяет получить по ключу текст на языке, который установил пользователь
*
* @param label ключ сообщений
* @return Сообщение на языке пользователя
*/
String getMessage(@NonNull String label);
String getMessage(@NonNull String label, Object... params);
/**
* Устанавливает язык приложения
*
* @param appLocale Язык, который необходимо установить
*/
void setLocale(@NonNull AppLocale appLocale);
}

View File

@ -1,14 +1,23 @@
package dev.struchkov.bot.gitlab.context.service;
/**
* // TODO: 08.02.2021 Добавить описание.
* <p>Контракт очистки хранилища.</p>
* <p>Так как все что мы получаем от гитлаба сохраняется в БД, иногда нужно удалять устаревшие данные. Например, MR, которые уже были давно вмержены.</p>
*
* @author upagge 08.02.2021
*/
public interface CleanService {
void cleanMergedPullRequests();
/**
* <p>Удаляет старые MR.</p>
* <p>По умолчанию старыми считаются те, которые закрыты или вмержены</p>
*/
void cleanOldMergedRequests();
/**
* <p>Удаляет старые пайплайны</p>
* <p>По умолчанию удаляет все пайплайны старше суток</p>
*/
void cleanOldPipelines();
}

View File

@ -7,14 +7,21 @@ import lombok.NonNull;
import java.util.List;
/**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021
*/
public interface DiscussionService extends SimpleManagerService<Discussion, String> {
/**
* Метод отправляющий коментарий в дискуссию.
*
* @param discussionId Идентификатор дискуссии
* @param text Текст комментария
*/
void answer(@NonNull String discussionId, @NonNull String text);
/**
* Получить все дискусси для MR.
*/
List<Discussion> getAllByMergeRequestId(@NonNull Long mergeRequestId);
}

View File

@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.haiti.context.service.SimpleManagerService;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
public interface PersonService extends SimpleManagerService<Person, Long> {

View File

@ -12,7 +12,7 @@ import lombok.NonNull;
import java.util.Set;
/**
* // TODO: 17.01.2021 Добавить описание.
* Сервис для работы с пайплайнами
*
* @author upagge 17.01.2021
*/

View File

@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.domain.entity.Project;
import dev.struchkov.haiti.context.service.SimpleManagerService;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
public interface ProjectService extends SimpleManagerService<Project, Long> {

View File

@ -6,7 +6,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* // TODO: 11.10.2020 Добавить описание.
* Основные настройки приложения.
*
* @author upagge 11.10.2020
*/

View File

@ -6,8 +6,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/

View File

@ -6,11 +6,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import java.util.stream.Collectors;
/**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021
*/
@Component

View File

@ -10,8 +10,6 @@ import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
@Component

View File

@ -7,8 +7,6 @@ import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
/**
* // TODO: 12.09.2020 Добавить описание.
*
* @author upagge 12.09.2020
*/
@Component

View File

@ -6,8 +6,6 @@ import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
@Component

View File

@ -21,8 +21,6 @@ import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.SUCCESS;
import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.WAITING_FOR_RESOURCE;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/
@Component

View File

@ -6,8 +6,6 @@ import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
@Component

View File

@ -15,7 +15,7 @@ import java.util.Locale;
import java.util.function.Supplier;
/**
* // TODO: 16.01.2021 Добавить описание.
* Сервис отвечает за пользовательские настройки приложения.
*
* @author upagge 16.01.2021
*/
@ -31,26 +31,20 @@ public class AppSettingServiceImpl implements AppSettingService {
@Override
public boolean isFirstStart() {
return appSettingRepository.findById(KEY)
.orElseThrow(NOT_FOUND_SETTINGS)
.isFirstStart();
return getAppSetting().isFirstStart();
}
@Override
public void disableFirstStart() {
final AppSetting appSetting = appSettingRepository.findById(KEY).orElseThrow(NOT_FOUND_SETTINGS);
final AppSetting appSetting = getAppSetting();
appSetting.setFirstStart(false);
appSettingRepository.save(appSetting);
}
@Override
public String getMessage(@NonNull String label) {
final Locale value = appSettingRepository.findById(KEY)
.orElseThrow(NOT_FOUND_SETTINGS)
.getAppLocale().getValue();
return messageSource.getMessage(
label, null, value
);
final Locale value = getAppSetting().getAppLocale().getValue();
return messageSource.getMessage(label, null, value);
}
@Override
@ -59,17 +53,20 @@ public class AppSettingServiceImpl implements AppSettingService {
return messageSource.getMessage(
label,
paramsArray,
appSettingRepository.findById(KEY)
.orElseThrow(NOT_FOUND_SETTINGS)
.getAppLocale().getValue()
getAppSetting().getAppLocale().getValue()
);
}
@Override
public void setLocale(@NonNull AppLocale appLocale) {
final AppSetting appSetting = appSettingRepository.findById(KEY).orElseThrow(NOT_FOUND_SETTINGS);
final AppSetting appSetting = getAppSetting();
appSetting.setAppLocale(appLocale);
appSettingRepository.save(appSetting);
}
private AppSetting getAppSetting() {
return appSettingRepository.findById(KEY)
.orElseThrow(NOT_FOUND_SETTINGS);
}
}

View File

@ -15,13 +15,12 @@ import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static dev.struchkov.bot.gitlab.context.domain.MergeRequestState.CLOSED;
import static dev.struchkov.bot.gitlab.context.domain.MergeRequestState.MERGED;
/**
* // TODO: 08.02.2021 Добавить описание.
* Реализация сервиса очистки данных.
*
* @author upagge 08.02.2021
*/
@ -30,7 +29,7 @@ import static dev.struchkov.bot.gitlab.context.domain.MergeRequestState.MERGED;
public class CleanServiceImpl implements CleanService {
private static final int COUNT = 1000;
private static final MergeRequestFilter CLEAN_FILTER = MergeRequestFilter.builder()
private static final MergeRequestFilter MR_CLEAN_FILTER = MergeRequestFilter.builder()
.states(Set.of(MERGED, CLOSED))
.build();
@ -38,9 +37,9 @@ public class CleanServiceImpl implements CleanService {
private final PipelineService pipelineService;
@Override
public void cleanMergedPullRequests() {
public void cleanOldMergedRequests() {
int page = 0;
Sheet<MergeRequest> mergeRequestSheet = mergeRequestsService.getAll(CLEAN_FILTER, PaginationImpl.of(page, COUNT));
Sheet<MergeRequest> mergeRequestSheet = mergeRequestsService.getAll(MR_CLEAN_FILTER, PaginationImpl.of(page, COUNT));
while (mergeRequestSheet.hasContent()) {
final Set<Long> ids = mergeRequestSheet.getContent().stream()
@ -49,7 +48,7 @@ public class CleanServiceImpl implements CleanService {
mergeRequestsService.deleteAllById(ids);
mergeRequestSheet = mergeRequestsService.getAll(CLEAN_FILTER, PaginationImpl.of(++page, COUNT));
mergeRequestSheet = mergeRequestsService.getAll(MR_CLEAN_FILTER, PaginationImpl.of(++page, COUNT));
}
}

View File

@ -35,8 +35,10 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static java.lang.Boolean.FALSE;
/**
* // TODO: 11.02.2021 Добавить описание.
* Сервис для работы с дискуссиями.
*
* @author upagge 11.02.2021
*/
@ -69,7 +71,7 @@ public class DiscussionServiceImpl extends AbstractSimpleManagerService<Discussi
public Discussion create(@NonNull Discussion discussion) {
discussion.getNotes().forEach(note -> personService.create(note.getAuthor()));
discussion.getNotes().forEach(this::notificationPersonal);
discussion.getNotes().forEach(note -> notifyNewTask(note, discussion));
discussion.getNotes().forEach(note -> notifyNewNote(note, discussion));
final boolean resolved = discussion.getNotes().stream()
.allMatch(note -> note.isResolvable() && note.getResolved());
@ -77,13 +79,11 @@ public class DiscussionServiceImpl extends AbstractSimpleManagerService<Discussi
return discussionRepository.save(discussion);
}
private void notifyNewTask(Note note, Discussion discussion) {
if (note.isResolvable()
&& personInformation.getId().equals(discussion.getResponsible().getId())
&& !personInformation.getId().equals(note.getAuthor().getId())
&& note.getResolved() != null
&& !note.getResolved()
) {
/**
* <p>Уведомляет пользователя, если появился новый комментарий</p>
*/
private void notifyNewNote(Note note, Discussion discussion) {
if (isNeedNotifyNewNote(note, discussion)) {
notifyService.send(
TaskNewNotify.builder()
.authorName(note.getAuthor().getName())
@ -94,22 +94,34 @@ public class DiscussionServiceImpl extends AbstractSimpleManagerService<Discussi
}
}
private boolean isNeedNotifyNewNote(Note note, Discussion discussion) {
final Long personId = personInformation.getId();
return note.isResolvable() // Тип комментария требует решения (Задачи)
&& personId.equals(discussion.getResponsible().getId()) // Создатель дискуссии пользователь приложения
&& !personId.equals(note.getAuthor().getId()) // Создатель комментария не пользователь системы
&& FALSE.equals(note.getResolved()); // Комментарий не отмечен как решенный
}
@Override
public Discussion update(@NonNull Discussion discussion) {
final Discussion oldDiscussion = discussionRepository.findById(discussion.getId())
.orElseThrow(NotFoundException.supplier("Дискуссия не найдена"));
final Map<Long, Note> noteMap = oldDiscussion
final Map<Long, Note> idAndNoteMap = oldDiscussion
.getNotes().stream()
.collect(Collectors.toMap(Note::getId, note -> note));
final boolean inDiscussion = discussion.getNotes().stream()
// Пользователь участвовал в обсуждении
final boolean userParticipatedInDiscussion = discussion.getNotes().stream()
.anyMatch(note -> personInformation.getId().equals(note.getAuthor().getId()));
discussion.setMergeRequest(oldDiscussion.getMergeRequest());
discussion.setResponsible(oldDiscussion.getResponsible());
discussion.getNotes().forEach(note -> updateNote(note, noteMap, inDiscussion));
discussion.getNotes().forEach(note -> updateNote(note, idAndNoteMap, userParticipatedInDiscussion));
final boolean resolved = discussion.getNotes().stream()
.allMatch(note -> note.isResolvable() && note.getResolved());
discussion.setResolved(resolved);
return discussionRepository.save(discussion);
}
@ -205,9 +217,12 @@ public class DiscussionServiceImpl extends AbstractSimpleManagerService<Discussi
return discussionRepository.findAllByMergeRequestId(mergeRequestId);
}
/**
* Уведомляет пользователя, если его никнейм упоминается в комментарии.
*/
protected void notificationPersonal(@NonNull Note note) {
Matcher matcher = PATTERN.matcher(note.getBody());
Set<String> recipientsLogins = new HashSet<>();
final Matcher matcher = PATTERN.matcher(note.getBody());
final Set<String> recipientsLogins = new HashSet<>();
while (matcher.find()) {
final String login = matcher.group(0).replace("@", "");
recipientsLogins.add(login);

View File

@ -8,8 +8,6 @@ import lombok.NonNull;
import org.springframework.stereotype.Service;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
@Service

View File

@ -2,6 +2,7 @@ package dev.struchkov.bot.gitlab.core.service.impl;
import dev.struchkov.bot.gitlab.context.domain.PersonInformation;
import dev.struchkov.bot.gitlab.context.domain.PipelineStatus;
import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.bot.gitlab.context.domain.entity.Pipeline;
import dev.struchkov.bot.gitlab.context.domain.filter.PipelineFilter;
import dev.struchkov.bot.gitlab.context.domain.notify.pipeline.PipelineNotify;
@ -26,13 +27,14 @@ import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.SKIPPED;
import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.SUCCESS;
/**
* // TODO: 17.01.2021 Добавить описание.
* Реализация сервиса для работы с пайплайнами.
*
* @author upagge 17.01.2021
*/
@Service
public class PipelineServiceImpl extends AbstractSimpleManagerService<Pipeline, Long> implements PipelineService {
// Статусы пайплайнов, о которых нужно уведомить
private static final Set<PipelineStatus> notificationStatus = Set.of(FAILED, SUCCESS, CANCELED, SKIPPED);
private final NotifyService notifyService;
@ -61,12 +63,12 @@ public class PipelineServiceImpl extends AbstractSimpleManagerService<Pipeline,
public Pipeline create(@NonNull Pipeline pipeline) {
personService.create(pipeline.getPerson());
final Pipeline newPipeline = pipelineRepository.save(pipeline);
notifyNewPipeline(pipeline, "n/a");
return newPipeline;
}
if (
notificationStatus.contains(pipeline.getStatus())
&& pipeline.getPerson() != null
&& personInformation.getId().equals(pipeline.getPerson().getId())
) {
private void notifyNewPipeline(Pipeline pipeline, String oldStatus) {
if (isNeedNotifyNewPipeline(pipeline)) {
notifyService.send(
PipelineNotify.builder()
.newStatus(pipeline.getStatus().name())
@ -74,11 +76,10 @@ public class PipelineServiceImpl extends AbstractSimpleManagerService<Pipeline,
.projectName(pipeline.getProject().getName())
.refName(pipeline.getRef())
.webUrl(pipeline.getWebUrl())
.oldStatus(oldStatus)
.build()
);
}
return newPipeline;
}
@Override
@ -88,31 +89,20 @@ public class PipelineServiceImpl extends AbstractSimpleManagerService<Pipeline,
if (!oldPipeline.getUpdated().equals(pipeline.getUpdated())) {
pipeline.setProject(oldPipeline.getProject());
if (
notificationStatus.contains(pipeline.getStatus())
&& pipeline.getPerson() != null
&& personInformation.getId().equals(pipeline.getPerson().getId())
) {
notifyService.send(
PipelineNotify.builder()
.pipelineId(pipeline.getId())
.webUrl(pipeline.getWebUrl())
.projectName(pipeline.getProject().getName())
.refName(pipeline.getRef())
.newStatus(pipeline.getStatus().name())
.oldStatus(oldPipeline.getStatus().name())
.build()
);
return pipelineRepository.save(pipeline);
}
notifyNewPipeline(pipeline, oldPipeline.getStatus().name());
return pipelineRepository.save(pipeline);
}
return oldPipeline;
}
private boolean isNeedNotifyNewPipeline(@NonNull Pipeline pipeline) {
final Person personPipelineCreator = pipeline.getPerson();
return notificationStatus.contains(pipeline.getStatus()) // Пайплайн имеет статус необходимый для уведомления
&& personPipelineCreator != null
&& personInformation.getId().equals(personPipelineCreator.getId()); // Пользователь приложения является инициатором пайплайна
}
@Override
public Sheet<Pipeline> getAllByStatuses(@NonNull Set<PipelineStatus> statuses, @NonNull Pagination pagination) {
return pipelineRepository.findAllByStatuses(statuses, pagination);

View File

@ -14,8 +14,6 @@ import lombok.NonNull;
import org.springframework.stereotype.Service;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
@Service
@ -44,23 +42,27 @@ public class ProjectServiceImpl extends AbstractSimpleManagerService<Project, Lo
public Project create(@NonNull Project project) {
final Project newProject = projectRepository.save(project);
if (!newProject.getCreatorId().equals(personInformation.getId())) {
if (!personInformation.getId().equals(newProject.getCreatorId())) {
final String authorName = personService.getById(newProject.getCreatorId())
.orElseThrow(NotFoundException.supplier("Пользователь не найден"))
.getName();
notifyService.send(
NewProjectNotify.builder()
.projectDescription(newProject.getDescription())
.projectName(newProject.getName())
.projectUrl(newProject.getWebUrl())
.authorName(authorName)
.build()
);
sendNotifyNewProject(newProject, authorName);
}
return newProject;
}
private void sendNotifyNewProject(Project newProject, String authorName) {
notifyService.send(
NewProjectNotify.builder()
.projectDescription(newProject.getDescription())
.projectName(newProject.getName())
.projectUrl(newProject.getWebUrl())
.authorName(authorName)
.build()
);
}
@Override
public Project update(@NonNull Project project) {
return projectRepository.save(project);

View File

@ -13,7 +13,7 @@ import lombok.NonNull;
import org.springframework.stereotype.Service;
/**
* // TODO: 08.02.2021 Добавить описание.
* Сервис фильтрации пайплайнов.
*
* @author upagge 08.02.2021
*/

View File

@ -2,11 +2,11 @@ package dev.struchkov.bot.gitlab.core.service.parser;
import dev.struchkov.bot.gitlab.context.domain.entity.Discussion;
import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest;
import dev.struchkov.bot.gitlab.context.domain.entity.Note;
import dev.struchkov.bot.gitlab.context.service.DiscussionService;
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty;
import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty;
import dev.struchkov.bot.gitlab.core.utils.StringUtils;
import dev.struchkov.bot.gitlab.sdk.domain.DiscussionJson;
import dev.struchkov.haiti.context.domain.ExistsContainer;
import dev.struchkov.haiti.context.page.Sheet;
@ -20,12 +20,14 @@ import java.text.MessageFormat;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import static dev.struchkov.bot.gitlab.core.utils.StringUtils.H_PRIVATE_TOKEN;
import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT;
/**
* // TODO: 11.02.2021 Добавить описание.
* Парсер обсуждений.
*
* @author upagge 11.02.2021
*/
@ -33,7 +35,7 @@ import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT;
@RequiredArgsConstructor
public class DiscussionParser {
public static final int COUNT = 100;
public static final int COUNT = 500;
private final DiscussionService discussionService;
private final MergeRequestsService mergeRequestsService;
@ -42,19 +44,16 @@ public class DiscussionParser {
private final GitlabProperty gitlabProperty;
private final PersonProperty personProperty;
/**
* Поиск новых обсуждений
*/
public void scanNewDiscussion() {
int page = 0;
Sheet<MergeRequest> mergeRequestSheet = mergeRequestsService.getAll(PaginationImpl.of(page, COUNT));
while (mergeRequestSheet.hasContent()) {
final List<MergeRequest> mergeRequests = mergeRequestSheet.getContent();
for (MergeRequest mergeRequest : mergeRequests) {
processingMergeRequest(mergeRequest);
}
mergeRequestSheet.getContent()
.forEach(this::processingMergeRequest);
mergeRequestSheet = mergeRequestsService.getAll(PaginationImpl.of(++page, COUNT));
}
}
@ -72,11 +71,11 @@ public class DiscussionParser {
}
private void createNewDiscussion(List<DiscussionJson> discussionJson, MergeRequest mergeRequest) {
final Set<String> jsonIds = discussionJson.stream()
final Set<String> discussionIds = discussionJson.stream()
.map(DiscussionJson::getId)
.collect(Collectors.toSet());
.collect(Collectors.toUnmodifiableSet());
final ExistsContainer<Discussion, String> existsContainer = discussionService.existsById(jsonIds);
final ExistsContainer<Discussion, String> existsContainer = discussionService.existsById(discussionIds);
if (!existsContainer.isAllFound()) {
final List<Discussion> newDiscussions = discussionJson.stream()
.filter(json -> existsContainer.getIdNoFound().contains(json.getId()))
@ -84,12 +83,7 @@ public class DiscussionParser {
final Discussion discussion = conversionService.convert(json, Discussion.class);
discussion.setMergeRequest(mergeRequest);
discussion.setResponsible(mergeRequest.getAuthor());
discussion.getNotes().forEach(
note -> {
final String url = MessageFormat.format(gitlabProperty.getUrlNote(), mergeRequest.getWebUrl(), note.getId());
note.setWebUrl(url);
}
);
discussion.getNotes().forEach(createNoteLink(mergeRequest));
return discussion;
})
.filter(discussion -> discussion.getNotes() != null && !discussion.getNotes().isEmpty())
@ -98,34 +92,25 @@ public class DiscussionParser {
}
}
private List<DiscussionJson> getDiscussionJson(MergeRequest mergeRequest, int page) {
return HttpParse.request(MessageFormat.format(gitlabProperty.getUrlDiscussion(), mergeRequest.getProjectId(), mergeRequest.getTwoId(), page))
.header(ACCEPT)
.header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken())
.executeList(DiscussionJson.class);
}
/**
* Сканирование старых обсуждений на предмет новых комментарие
*/
public void scanOldDiscussions() {
int page = 0;
Sheet<Discussion> discussionSheet = discussionService.getAll(PaginationImpl.of(page, 100));
Sheet<Discussion> discussionSheet = discussionService.getAll(PaginationImpl.of(page, COUNT));
while (discussionSheet.hasContent()) {
final List<Discussion> discussions = discussionSheet.getContent();
for (Discussion discussion : discussions) {
if (discussion.getMergeRequest() != null) {
final Optional<Discussion> optNewDiscussion = HttpParse.request(MessageFormat.format(gitlabProperty.getUrlOneDiscussion(), discussion.getMergeRequest().getProjectId(), discussion.getMergeRequest().getTwoId(), discussion.getId()))
final Optional<Discussion> optNewDiscussion = HttpParse.request(createLinkOldDiscussion(discussion))
.header(ACCEPT)
.header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken())
.header(H_PRIVATE_TOKEN, personProperty.getToken())
.execute(DiscussionJson.class)
.map(json -> {
final Discussion newDiscussion = conversionService.convert(json, Discussion.class);
newDiscussion.getNotes().forEach(
note -> {
final String url = MessageFormat.format(gitlabProperty.getUrlNote(), discussion.getMergeRequest().getWebUrl(), note.getId());
note.setWebUrl(url);
}
);
newDiscussion.getNotes().forEach(createNoteLink(discussion.getMergeRequest()));
return newDiscussion;
});
optNewDiscussion.ifPresent(discussionService::update);
@ -134,10 +119,32 @@ public class DiscussionParser {
}
}
discussionSheet = discussionService.getAll(PaginationImpl.of(++page, 100));
discussionSheet = discussionService.getAll(PaginationImpl.of(++page, COUNT));
}
}
private String createLinkOldDiscussion(Discussion discussion) {
return MessageFormat.format(
gitlabProperty.getUrlOneDiscussion(),
discussion.getMergeRequest().getProjectId(),
discussion.getMergeRequest().getTwoId(),
discussion.getId()
);
}
private List<DiscussionJson> getDiscussionJson(MergeRequest mergeRequest, int page) {
return HttpParse.request(MessageFormat.format(gitlabProperty.getUrlDiscussion(), mergeRequest.getProjectId(), mergeRequest.getTwoId(), page))
.header(ACCEPT)
.header(H_PRIVATE_TOKEN, personProperty.getToken())
.executeList(DiscussionJson.class);
}
private Consumer<Note> createNoteLink(MergeRequest mergeRequest) {
return note -> {
final String url = MessageFormat.format(gitlabProperty.getUrlNote(), mergeRequest.getWebUrl(), note.getId());
note.setWebUrl(url);
};
}
}

View File

@ -24,7 +24,6 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.CREATED;
import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.MANUAL;
@ -35,11 +34,10 @@ import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.WAITING_FOR
import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT;
/**
* // TODO: 17.01.2021 Добавить описание.
* Парсер пайплайнов.
*
* @author upagge 17.01.2021
*/
@Service
@RequiredArgsConstructor
public class PipelineParser {
@ -101,7 +99,7 @@ public class PipelineParser {
pipeline.setProject(project);
return pipeline;
})
.orElseThrow(() -> new ConvertException("Ошибка обновления Pipelines"));
.orElseThrow(ConvertException.supplier("Ошибка обновления Pipelines"));
pipelineService.create(newPipeline);
}
@ -136,7 +134,7 @@ public class PipelineParser {
.header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken())
.execute(PipelineJson.class)
.map(json -> conversionService.convert(json, Pipeline.class))
.orElseThrow(() -> new ConvertException("Ошибка обновления Pipelines"));
.orElseThrow(ConvertException.supplier("Ошибка обновления Pipelines"));
pipelineService.update(newPipeline);
}

View File

@ -26,7 +26,7 @@ import java.util.stream.Collectors;
import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT;
/**
* // TODO: 14.01.2021 Добавить описание.
* Парсер проектов.
*
* @author upagge 14.01.2021
*/
@ -60,13 +60,13 @@ public class ProjectParser {
while (!projectJsons.isEmpty()) {
final Set<Long> jsonIds = projectJsons.stream()
final Set<Long> projectIds = projectJsons.stream()
.map(ProjectJson::getId)
.collect(Collectors.toSet());
.collect(Collectors.toUnmodifiableSet());
createNewPersons(projectJsons);
final ExistsContainer<Project, Long> existsContainer = projectService.existsById(jsonIds);
final ExistsContainer<Project, Long> existsContainer = projectService.existsById(projectIds);
final List<Project> newProjects = projectJsons.stream()
.filter(json -> existsContainer.getIdNoFound().contains(json.getId()))
.map(json -> conversionService.convert(json, Project.class))
@ -81,11 +81,11 @@ public class ProjectParser {
}
private void createNewPersons(List<ProjectJson> projectJsons) {
final Set<Long> jsonIds = projectJsons.stream()
final Set<Long> personCreatorId = projectJsons.stream()
.map(ProjectJson::getCreatorId)
.collect(Collectors.toSet());
final ExistsContainer<Person, Long> existsContainer = personService.existsById(jsonIds);
final ExistsContainer<Person, Long> existsContainer = personService.existsById(personCreatorId);
if (!existsContainer.isAllFound()) {
final Collection<Long> notFoundId = existsContainer.getIdNoFound();
@ -96,11 +96,11 @@ public class ProjectParser {
.header(ACCEPT)
.header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken())
.execute(PersonJson.class)
.map(json -> conversionService.convert(json, Person.class)).orElseThrow(() -> new ConvertException("Ошибка преобразования нового пользователя"))
.map(json -> conversionService.convert(json, Person.class))
.orElseThrow(ConvertException.supplier("Ошибка преобразования нового пользователя"))
).toList();
personService.createAll(newPersons);
}
}
@ -119,7 +119,7 @@ public class ProjectParser {
.header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken())
.execute(ProjectJson.class)
.map(json -> conversionService.convert(json, Project.class))
.orElseThrow(() -> new ConvertException("Ошибка получения проекта"));
.orElseThrow(ConvertException.supplier("Ошибка получения проекта"));
if (!projectService.existsById(project.getId())) {
projectService.create(project);
}

View File

@ -4,7 +4,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
/**
* // TODO: 29.09.2020 Добавить описание.
* Утилитарный класс для работы со сторками.
*
* @author upagge 29.09.2020
*/

View File

@ -7,8 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* // TODO: 16.01.2021 Добавить описание.
*
* @author upagge 16.01.2021
*/
@Repository

View File

@ -10,8 +10,6 @@ import org.springframework.stereotype.Repository;
import java.util.List;
/**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021
*/
@Repository

View File

@ -13,7 +13,6 @@ import org.springframework.stereotype.Repository;
import java.util.List;
/**
* // TODO: 08.09.2020 Добавить описание.
*
* @author upagge 08.09.2020
*/

View File

@ -7,8 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
@Repository

View File

@ -14,8 +14,6 @@ import org.springframework.stereotype.Repository;
import java.util.Set;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/
@Repository

View File

@ -7,8 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
@Repository

View File

@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.domain.entity.AppSetting;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* // TODO: 16.01.2021 Добавить описание.
*
* @author upagge 16.01.2021
*/
public interface AppSettingJpaRepository extends JpaRepository<AppSetting, Long> {

View File

@ -6,12 +6,13 @@ import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021
*/
public interface DiscussionJpaRepository extends JpaRepository<Discussion, String> {
/**
* Находит все обсуждения MR
*/
List<Discussion> findAllByMergeRequestId(Long mergeRequestId);
}

View File

@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021
*/
public interface PersonJpaRepository extends JpaRepository<Person, Long> {

View File

@ -9,8 +9,6 @@ import org.springframework.data.jpa.repository.support.JpaRepositoryImplementati
import java.util.Set;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/
public interface PipelineJpaRepository extends JpaRepositoryImplementation<Pipeline, Long> {

View File

@ -4,8 +4,6 @@ import dev.struchkov.bot.gitlab.context.domain.entity.Project;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
public interface ProjectJpaRepository extends JpaRepository<Project, Long> {

View File

@ -10,8 +10,6 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
@Slf4j
@ -33,7 +31,7 @@ public class SchedulerService {
discussionParser.scanOldDiscussions();
discussionParser.scanNewDiscussion();
cleanService.cleanOldPipelines();
cleanService.cleanMergedPullRequests();
cleanService.cleanOldMergedRequests();
}
}

View File

@ -10,8 +10,6 @@ import lombok.Data;
import java.time.LocalDateTime;
/**
* // TODO: 19.01.2021 Добавить описание.
*
* @author upagge 19.01.2021
*/
@Data

View File

@ -6,8 +6,6 @@ import lombok.Setter;
import java.util.List;
/**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021
*/
@Getter

View File

@ -11,8 +11,6 @@ import java.time.LocalDateTime;
import java.util.Set;
/**
* TODO: Добавить описание класса.
*
* @author upagge [30.01.2020]
*/
@Data

View File

@ -3,8 +3,6 @@ package dev.struchkov.bot.gitlab.sdk.domain;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* TODO: Добавить комментарий енума.
*
* @author upagge [01.02.2020]
*/
public enum MergeRequestStateJson {

View File

@ -4,8 +4,6 @@ import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* TODO: Добавить описание класса.
*
* @author upagge [31.01.2020]
*/
@Data

View File

@ -10,8 +10,6 @@ import lombok.Data;
import java.time.LocalDateTime;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/
@Data

View File

@ -3,8 +3,6 @@ package dev.struchkov.bot.gitlab.sdk.domain;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021
*/
public enum PipelineStatusJson {

View File

@ -10,8 +10,6 @@ import lombok.Data;
import java.time.LocalDateTime;
/**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021
*/
@Data

View File

@ -1,25 +0,0 @@
package dev.struchkov.bot.gitlab.sdk.domain;
import lombok.Data;
import java.util.List;
/**
* TODO: Добавить описание класса.
*
* @author upagge [30.01.2020]
*/
@Data
public abstract class Sheet<T> {
private Integer size;
private Integer limit;
private Boolean isLastPage;
private List<T> values;
private Integer nextPageStart;
public boolean hasContent() {
return values != null && !values.isEmpty();
}
}

View File

@ -3,8 +3,6 @@ package dev.struchkov.bot.gitlab.sdk.domain;
import lombok.Data;
/**
* TODO: Добавить описание класса.
*
* @author upagge [31.01.2020]
*/
@Data

View File

@ -1,26 +0,0 @@
package dev.struchkov.bot.gitlab.sdk.utils;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
public class LocalDateTimeFromEpochDeserializer extends JsonDeserializer<LocalDateTime> {
@Override
public LocalDateTime deserialize(JsonParser jp, DeserializationContext ctxt) {
try {
Long time = jp.readValueAs(Long.class);
Instant instant = Instant.ofEpochMilli(time);
return instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
} catch (IOException e) {
}
return null;
}
}

View File

@ -24,8 +24,6 @@ import org.springframework.scheduling.annotation.EnableScheduling;
import java.util.Collections;
/**
* TODO: Добавить описание класса.
*
* @author upagge [30.01.2020]
*/
@Configuration

View File

@ -11,7 +11,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* // TODO: 17.09.2020 Добавить описание.
* Отправляет сообщение в телеграмм.
*
* @author upagge 17.09.2020
*/

View File

@ -6,7 +6,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
/**
* // TODO: 18.09.2020 Добавить описание.
* Заменяет урл, который назначает гитлаб на любой другой перед отправкой сообщения. Потому что иногда у self-host гитлабов урлы, которые не преобразуются телеграммом в ссылки. В этом случае имеет смысл менять их на ip.
*
* @author upagge 18.09.2020
*/

View File

@ -10,8 +10,6 @@ import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* // TODO: 19.01.2021 Добавить описание.
*
* @author upagge 19.01.2021
*/
@Component

View File

@ -1,10 +1,10 @@
package dev.struchkov.bot.gitlab.telegram.service.unit;
/**
* // TODO: 17.09.2020 Добавить описание.
*
* @author upagge 17.09.2020
*/
//package dev.struchkov.bot.gitlab.telegram.service.unit;
//
///**
// * // TODO: 17.09.2020 Добавить описание.
// *
// * @author upagge 17.09.2020
// */
//@Component
//@RequiredArgsConstructor
//public class TaskProcessing implements ProcessingData<Message> {

View File

@ -7,8 +7,6 @@ import dev.struchkov.godfather.context.service.usercode.ProcessingData;
import lombok.RequiredArgsConstructor;
/**
* // TODO: 17.09.2020 Добавить описание.
*
* @author upagge 17.09.2020
*/
//@Component

View File

@ -7,8 +7,6 @@ import dev.struchkov.godfather.context.service.usercode.ProcessingData;
import lombok.RequiredArgsConstructor;
/**
* // TODO: 17.09.2020 Добавить описание.
*
* @author upagge 17.09.2020
*/
//@Component

View File

@ -10,6 +10,7 @@ import dev.struchkov.bot.gitlab.context.service.NoteService;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty;
import dev.struchkov.bot.gitlab.core.service.parser.ProjectParser;
import dev.struchkov.godfather.context.domain.BoxAnswer;
import dev.struchkov.godfather.context.domain.content.Message;
import dev.struchkov.godfather.context.domain.keyboard.KeyBoard;
import dev.struchkov.godfather.context.domain.keyboard.KeyBoardLine;
import dev.struchkov.godfather.context.domain.keyboard.button.KeyBoardButtonText;
@ -35,12 +36,12 @@ import java.util.stream.Collectors;
public class MenuConfig {
@Bean
public AnswerText menu(
public AnswerText<Message> menu(
AppSettingService settingService,
AnswerText settings,
AnswerText textAddNewProject,
AnswerText getTasks,
AnswerText getAssigneeMergeRequest
AnswerText<Message> settings,
AnswerText<Message> textAddNewProject,
AnswerText<Message> getTasks,
AnswerText<Message> getAssigneeMergeRequest
) {
return AnswerText.builder()
.boxAnswer(message ->
@ -83,9 +84,9 @@ public class MenuConfig {
}
@Bean
public AnswerText textAddNewProject(
public AnswerText<Message> textAddNewProject(
AppSettingService settingService,
AnswerText addNewProject
AnswerText<Message> addNewProject
) {
return AnswerText.builder()
.boxAnswer(BoxAnswer.processing(settingService.getMessage("ui.menu.add_mr.text")))
@ -95,7 +96,7 @@ public class MenuConfig {
}
@Bean
public AnswerText addNewProject(
public AnswerText<Message> addNewProject(
AppSettingService settingService,
ProjectParser projectParser,
GitlabProperty gitlabProperty
@ -112,9 +113,9 @@ public class MenuConfig {
}
@Bean
public AnswerText settings(
public AnswerText<Message> settings(
AppSettingService settingService,
AnswerText settingsLanguage
AnswerText<Message> settingsLanguage
) {
return AnswerText.builder()
.boxAnswer(message ->
@ -128,7 +129,7 @@ public class MenuConfig {
}
@Bean
public AnswerText getTasks(
public AnswerText<Message> getTasks(
AppSettingService settingService,
PersonInformation personInformation,
NoteService noteService
@ -151,7 +152,7 @@ public class MenuConfig {
}
@Bean
public AnswerText getAssigneeMergeRequest(
public AnswerText<Message> getAssigneeMergeRequest(
MergeRequestsService mergeRequestsService,
PersonInformation personInformation,
AppSettingService settingService

View File

@ -8,6 +8,7 @@ import dev.struchkov.bot.gitlab.context.service.NoteService;
import dev.struchkov.bot.gitlab.core.service.parser.ProjectParser;
import dev.struchkov.godfather.context.domain.BoxAnswer;
import dev.struchkov.godfather.context.domain.content.Mail;
import dev.struchkov.godfather.context.domain.content.Message;
import dev.struchkov.godfather.context.domain.content.attachment.Attachment;
import dev.struchkov.godfather.context.domain.content.attachment.AttachmentType;
import dev.struchkov.godfather.context.domain.content.attachment.Link;
@ -40,7 +41,7 @@ public class UnitConfig {
@Bean
public AnswerCheck checkFirstStart(
AppSettingService settingService,
AnswerText textCheckLanguage,
AnswerText<Message> textCheckLanguage,
AnswerCheck checkMenuOrAnswer
) {
return AnswerCheck.builder()
@ -54,8 +55,8 @@ public class UnitConfig {
@Bean
public AnswerCheck checkMenuOrAnswer(
AnswerText menu,
AnswerText answerNote
AnswerText<Message> menu,
AnswerText<Message> answerNote
) {
return AnswerCheck.builder()
.check(
@ -76,7 +77,7 @@ public class UnitConfig {
}
@Bean
public AnswerText answerNote(
public AnswerText<Message> answerNote(
NoteService noteService,
DiscussionService discussionService
) {
@ -105,7 +106,7 @@ public class UnitConfig {
}
@Bean
public AnswerText textCheckLanguage(
public AnswerText<Message> textCheckLanguage(
AnswerProcessing checkLanguage
) {
return AnswerText.builder()
@ -122,7 +123,7 @@ public class UnitConfig {
@Bean
public AnswerProcessing checkLanguage(
AppSettingService settingService,
AnswerText textParserPrivateProject
AnswerText<Message> textParserPrivateProject
) {
return AnswerProcessing
.builder()
@ -140,7 +141,7 @@ public class UnitConfig {
}
@Bean
public AnswerText textParserPrivateProject(
public AnswerText<Message> textParserPrivateProject(
AnswerCheck checkParserPrivateProject,
AppSettingService settingService
) {
@ -162,7 +163,7 @@ public class UnitConfig {
public AnswerCheck checkParserPrivateProject(
AppSettingService appSettingService,
AnswerProcessing parserPrivateProject,
AnswerText textParseOwnerProject
AnswerText<Message> textParseOwnerProject
) {
return AnswerCheck.builder()
.check(
@ -177,7 +178,7 @@ public class UnitConfig {
public AnswerProcessing parserPrivateProject(
ProjectParser projectParser,
AppSettingService settingService,
AnswerText textParseOwnerProject
AnswerText<Message> textParseOwnerProject
) {
return AnswerProcessing.builder()
.processingData(message -> {
@ -189,7 +190,7 @@ public class UnitConfig {
}
@Bean
public AnswerText textParseOwnerProject(
public AnswerText<Message> textParseOwnerProject(
AppSettingService settingService,
AnswerCheck checkParseOwnerProject
) {

View File

@ -3,6 +3,7 @@ package dev.struchkov.bot.gitlab.telegram.unit.menu;
import dev.struchkov.bot.gitlab.context.domain.AppLocale;
import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import dev.struchkov.godfather.context.domain.BoxAnswer;
import dev.struchkov.godfather.context.domain.content.Message;
import dev.struchkov.godfather.context.utils.KeyBoards;
import dev.struchkov.godfather.core.domain.unit.AnswerText;
import org.springframework.context.annotation.Bean;
@ -17,9 +18,9 @@ import org.springframework.context.annotation.Configuration;
public class MenuSettingsConfig {
@Bean
public AnswerText settingsLanguage(
public AnswerText<Message> settingsLanguage(
AppSettingService settingService,
AnswerText setLanguage
AnswerText<Message> setLanguage
) {
return AnswerText.builder()
.boxAnswer(
@ -34,7 +35,7 @@ public class MenuSettingsConfig {
}
@Bean
public AnswerText setLanguage(
public AnswerText<Message> setLanguage(
AppSettingService settingService
) {
return AnswerText.builder()