Большой рефакторинг 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; import java.util.Locale;
/** /**
* // TODO: 16.01.2021 Добавить описание. * Список локализаций приложения.
* *
* @author upagge 16.01.2021 * @author upagge 16.01.2021
*/ */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,6 @@
package dev.struchkov.bot.gitlab.context.domain.filter; package dev.struchkov.bot.gitlab.context.domain.filter;
import dev.struchkov.bot.gitlab.context.domain.entity.Pipeline;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
@ -10,7 +11,7 @@ import lombok.Setter;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
* // TODO: 08.02.2021 Добавить описание. * Объект фильтра для {@link Pipeline}.
* *
* @author upagge 08.02.2021 * @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.MessageUtils;
import dev.struchkov.bot.gitlab.context.utils.Smile; import dev.struchkov.bot.gitlab.context.utils.Smile;
import lombok.Builder; import lombok.Builder;
import lombok.Getter;
import java.util.List; import java.util.List;
@ -14,28 +13,17 @@ import java.util.List;
* *
* @author upagge 20.09.2020 * @author upagge 20.09.2020
*/ */
@Getter
//TODO [28.01.2022]: Решить доработать и оставить или удалить. //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 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 @Builder
protected GoodMorningNotify( public GoodMorningNotify {
List<MergeRequest> mergeRequestsReviews,
List<MergeRequest> mergeRequestsNeedWork,
String personName,
String version
) {
this.mergeRequestsReviews = mergeRequestsReviews;
this.mergeRequestsNeedWork = mergeRequestsNeedWork;
this.personName = personName;
this.version = version;
} }
@Override @Override

View File

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

View File

@ -2,21 +2,14 @@ package dev.struchkov.bot.gitlab.context.domain.notify;
import dev.struchkov.bot.gitlab.context.service.AppSettingService; import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import lombok.Builder; import lombok.Builder;
import lombok.Getter;
/** /**
* // TODO: 20.09.2020 Добавить описание.
*
* @author upagge 20.09.2020 * @author upagge 20.09.2020
*/ */
@Getter public record SimpleTextNotify(String message) implements Notify {
public class SimpleTextNotify implements Notify {
private final String message;
@Builder @Builder
private SimpleTextNotify(String message) { public SimpleTextNotify {
this.message = message;
} }
@Override @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.service.AppSettingService;
import dev.struchkov.bot.gitlab.context.utils.Smile; import dev.struchkov.bot.gitlab.context.utils.Smile;
import lombok.Builder; import lombok.Builder;
import lombok.Getter;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown; import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
@Getter public record CommentNotify(
public class CommentNotify implements Notify { String url,
String authorName,
private final String authorName; String message
private final String message; ) implements Notify {
private final String url;
@Builder @Builder
private CommentNotify( public CommentNotify {
String url,
String authorName,
String message
) {
this.authorName = authorName;
this.message = message;
this.url = url;
} }
@Override @Override

View File

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

View File

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

View File

@ -8,8 +8,6 @@ import lombok.Getter;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown; import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
/** /**
* // TODO: 10.09.2020 Добавить описание.
*
* @author upagge 10.09.2020 * @author upagge 10.09.2020
*/ */
@Getter @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; import dev.struchkov.haiti.context.repository.SimpleManagerRepository;
/** /**
* // TODO: 16.01.2021 Добавить описание.
*
* @author upagge 16.01.2021 * @author upagge 16.01.2021
*/ */
public interface AppSettingRepository extends SimpleManagerRepository<AppSetting, Long> { public interface AppSettingRepository extends SimpleManagerRepository<AppSetting, Long> {

View File

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

View File

@ -9,8 +9,6 @@ import lombok.NonNull;
import java.util.List; import java.util.List;
/** /**
* // TODO: 08.09.2020 Добавить описание.
*
* @author upagge 08.09.2020 * @author upagge 08.09.2020
*/ */
public interface NoteRepository extends SimpleManagerRepository<Note, Long> { 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; import dev.struchkov.haiti.context.repository.SimpleManagerRepository;
/** /**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021 * @author upagge 15.01.2021
*/ */
public interface PersonRepository extends SimpleManagerRepository<Person, Long> { public interface PersonRepository extends SimpleManagerRepository<Person, Long> {

View File

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

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@ import lombok.NonNull;
import java.util.Set; import java.util.Set;
/** /**
* // TODO: 17.01.2021 Добавить описание. * Сервис для работы с пайплайнами
* *
* @author upagge 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; import dev.struchkov.haiti.context.service.SimpleManagerService;
/** /**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021 * @author upagge 14.01.2021
*/ */
public interface ProjectService extends SimpleManagerService<Project, Long> { 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; import org.springframework.context.annotation.Configuration;
/** /**
* // TODO: 11.10.2020 Добавить описание. * Основные настройки приложения.
* *
* @author upagge 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; import org.springframework.context.annotation.Configuration;
/** /**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 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.core.convert.converter.Converter;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.stream.Collectors;
/** /**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021 * @author upagge 11.02.2021
*/ */
@Component @Component

View File

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

View File

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

View File

@ -6,8 +6,6 @@ import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021 * @author upagge 15.01.2021
*/ */
@Component @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; import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.WAITING_FOR_RESOURCE;
/** /**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021 * @author upagge 17.01.2021
*/ */
@Component @Component

View File

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

View File

@ -15,7 +15,7 @@ import java.util.Locale;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
* // TODO: 16.01.2021 Добавить описание. * Сервис отвечает за пользовательские настройки приложения.
* *
* @author upagge 16.01.2021 * @author upagge 16.01.2021
*/ */
@ -31,26 +31,20 @@ public class AppSettingServiceImpl implements AppSettingService {
@Override @Override
public boolean isFirstStart() { public boolean isFirstStart() {
return appSettingRepository.findById(KEY) return getAppSetting().isFirstStart();
.orElseThrow(NOT_FOUND_SETTINGS)
.isFirstStart();
} }
@Override @Override
public void disableFirstStart() { public void disableFirstStart() {
final AppSetting appSetting = appSettingRepository.findById(KEY).orElseThrow(NOT_FOUND_SETTINGS); final AppSetting appSetting = getAppSetting();
appSetting.setFirstStart(false); appSetting.setFirstStart(false);
appSettingRepository.save(appSetting); appSettingRepository.save(appSetting);
} }
@Override @Override
public String getMessage(@NonNull String label) { public String getMessage(@NonNull String label) {
final Locale value = appSettingRepository.findById(KEY) final Locale value = getAppSetting().getAppLocale().getValue();
.orElseThrow(NOT_FOUND_SETTINGS) return messageSource.getMessage(label, null, value);
.getAppLocale().getValue();
return messageSource.getMessage(
label, null, value
);
} }
@Override @Override
@ -59,17 +53,20 @@ public class AppSettingServiceImpl implements AppSettingService {
return messageSource.getMessage( return messageSource.getMessage(
label, label,
paramsArray, paramsArray,
appSettingRepository.findById(KEY) getAppSetting().getAppLocale().getValue()
.orElseThrow(NOT_FOUND_SETTINGS)
.getAppLocale().getValue()
); );
} }
@Override @Override
public void setLocale(@NonNull AppLocale appLocale) { public void setLocale(@NonNull AppLocale appLocale) {
final AppSetting appSetting = appSettingRepository.findById(KEY).orElseThrow(NOT_FOUND_SETTINGS); final AppSetting appSetting = getAppSetting();
appSetting.setAppLocale(appLocale); appSetting.setAppLocale(appLocale);
appSettingRepository.save(appSetting); 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.time.LocalDateTime;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; 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.CLOSED;
import static dev.struchkov.bot.gitlab.context.domain.MergeRequestState.MERGED; import static dev.struchkov.bot.gitlab.context.domain.MergeRequestState.MERGED;
/** /**
* // TODO: 08.02.2021 Добавить описание. * Реализация сервиса очистки данных.
* *
* @author upagge 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 { public class CleanServiceImpl implements CleanService {
private static final int COUNT = 1000; 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)) .states(Set.of(MERGED, CLOSED))
.build(); .build();
@ -38,9 +37,9 @@ public class CleanServiceImpl implements CleanService {
private final PipelineService pipelineService; private final PipelineService pipelineService;
@Override @Override
public void cleanMergedPullRequests() { public void cleanOldMergedRequests() {
int page = 0; 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()) { while (mergeRequestSheet.hasContent()) {
final Set<Long> ids = mergeRequestSheet.getContent().stream() final Set<Long> ids = mergeRequestSheet.getContent().stream()
@ -49,7 +48,7 @@ public class CleanServiceImpl implements CleanService {
mergeRequestsService.deleteAllById(ids); 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.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static java.lang.Boolean.FALSE;
/** /**
* // TODO: 11.02.2021 Добавить описание. * Сервис для работы с дискуссиями.
* *
* @author upagge 11.02.2021 * @author upagge 11.02.2021
*/ */
@ -69,7 +71,7 @@ public class DiscussionServiceImpl extends AbstractSimpleManagerService<Discussi
public Discussion create(@NonNull Discussion discussion) { public Discussion create(@NonNull Discussion discussion) {
discussion.getNotes().forEach(note -> personService.create(note.getAuthor())); discussion.getNotes().forEach(note -> personService.create(note.getAuthor()));
discussion.getNotes().forEach(this::notificationPersonal); 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() final boolean resolved = discussion.getNotes().stream()
.allMatch(note -> note.isResolvable() && note.getResolved()); .allMatch(note -> note.isResolvable() && note.getResolved());
@ -77,13 +79,11 @@ public class DiscussionServiceImpl extends AbstractSimpleManagerService<Discussi
return discussionRepository.save(discussion); return discussionRepository.save(discussion);
} }
private void notifyNewTask(Note note, Discussion discussion) { /**
if (note.isResolvable() * <p>Уведомляет пользователя, если появился новый комментарий</p>
&& personInformation.getId().equals(discussion.getResponsible().getId()) */
&& !personInformation.getId().equals(note.getAuthor().getId()) private void notifyNewNote(Note note, Discussion discussion) {
&& note.getResolved() != null if (isNeedNotifyNewNote(note, discussion)) {
&& !note.getResolved()
) {
notifyService.send( notifyService.send(
TaskNewNotify.builder() TaskNewNotify.builder()
.authorName(note.getAuthor().getName()) .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 @Override
public Discussion update(@NonNull Discussion discussion) { public Discussion update(@NonNull Discussion discussion) {
final Discussion oldDiscussion = discussionRepository.findById(discussion.getId()) final Discussion oldDiscussion = discussionRepository.findById(discussion.getId())
.orElseThrow(NotFoundException.supplier("Дискуссия не найдена")); .orElseThrow(NotFoundException.supplier("Дискуссия не найдена"));
final Map<Long, Note> noteMap = oldDiscussion final Map<Long, Note> idAndNoteMap = oldDiscussion
.getNotes().stream() .getNotes().stream()
.collect(Collectors.toMap(Note::getId, note -> note)); .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())); .anyMatch(note -> personInformation.getId().equals(note.getAuthor().getId()));
discussion.setMergeRequest(oldDiscussion.getMergeRequest()); discussion.setMergeRequest(oldDiscussion.getMergeRequest());
discussion.setResponsible(oldDiscussion.getResponsible()); 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() final boolean resolved = discussion.getNotes().stream()
.allMatch(note -> note.isResolvable() && note.getResolved()); .allMatch(note -> note.isResolvable() && note.getResolved());
discussion.setResolved(resolved); discussion.setResolved(resolved);
return discussionRepository.save(discussion); return discussionRepository.save(discussion);
} }
@ -205,9 +217,12 @@ public class DiscussionServiceImpl extends AbstractSimpleManagerService<Discussi
return discussionRepository.findAllByMergeRequestId(mergeRequestId); return discussionRepository.findAllByMergeRequestId(mergeRequestId);
} }
/**
* Уведомляет пользователя, если его никнейм упоминается в комментарии.
*/
protected void notificationPersonal(@NonNull Note note) { protected void notificationPersonal(@NonNull Note note) {
Matcher matcher = PATTERN.matcher(note.getBody()); final Matcher matcher = PATTERN.matcher(note.getBody());
Set<String> recipientsLogins = new HashSet<>(); final Set<String> recipientsLogins = new HashSet<>();
while (matcher.find()) { while (matcher.find()) {
final String login = matcher.group(0).replace("@", ""); final String login = matcher.group(0).replace("@", "");
recipientsLogins.add(login); recipientsLogins.add(login);

View File

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

View File

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

View File

@ -13,7 +13,7 @@ import lombok.NonNull;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
* // TODO: 08.02.2021 Добавить описание. * Сервис фильтрации пайплайнов.
* *
* @author upagge 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.Discussion;
import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; 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.DiscussionService;
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService; 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.GitlabProperty;
import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty; 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.bot.gitlab.sdk.domain.DiscussionJson;
import dev.struchkov.haiti.context.domain.ExistsContainer; import dev.struchkov.haiti.context.domain.ExistsContainer;
import dev.struchkov.haiti.context.page.Sheet; import dev.struchkov.haiti.context.page.Sheet;
@ -20,12 +20,14 @@ import java.text.MessageFormat;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Collectors; 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; import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT;
/** /**
* // TODO: 11.02.2021 Добавить описание. * Парсер обсуждений.
* *
* @author upagge 11.02.2021 * @author upagge 11.02.2021
*/ */
@ -33,7 +35,7 @@ import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT;
@RequiredArgsConstructor @RequiredArgsConstructor
public class DiscussionParser { public class DiscussionParser {
public static final int COUNT = 100; public static final int COUNT = 500;
private final DiscussionService discussionService; private final DiscussionService discussionService;
private final MergeRequestsService mergeRequestsService; private final MergeRequestsService mergeRequestsService;
@ -42,19 +44,16 @@ public class DiscussionParser {
private final GitlabProperty gitlabProperty; private final GitlabProperty gitlabProperty;
private final PersonProperty personProperty; private final PersonProperty personProperty;
/**
* Поиск новых обсуждений
*/
public void scanNewDiscussion() { public void scanNewDiscussion() {
int page = 0; int page = 0;
Sheet<MergeRequest> mergeRequestSheet = mergeRequestsService.getAll(PaginationImpl.of(page, COUNT)); Sheet<MergeRequest> mergeRequestSheet = mergeRequestsService.getAll(PaginationImpl.of(page, COUNT));
while (mergeRequestSheet.hasContent()) { while (mergeRequestSheet.hasContent()) {
mergeRequestSheet.getContent()
final List<MergeRequest> mergeRequests = mergeRequestSheet.getContent(); .forEach(this::processingMergeRequest);
for (MergeRequest mergeRequest : mergeRequests) {
processingMergeRequest(mergeRequest);
}
mergeRequestSheet = mergeRequestsService.getAll(PaginationImpl.of(++page, COUNT)); mergeRequestSheet = mergeRequestsService.getAll(PaginationImpl.of(++page, COUNT));
} }
} }
@ -72,11 +71,11 @@ public class DiscussionParser {
} }
private void createNewDiscussion(List<DiscussionJson> discussionJson, MergeRequest mergeRequest) { private void createNewDiscussion(List<DiscussionJson> discussionJson, MergeRequest mergeRequest) {
final Set<String> jsonIds = discussionJson.stream() final Set<String> discussionIds = discussionJson.stream()
.map(DiscussionJson::getId) .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()) { if (!existsContainer.isAllFound()) {
final List<Discussion> newDiscussions = discussionJson.stream() final List<Discussion> newDiscussions = discussionJson.stream()
.filter(json -> existsContainer.getIdNoFound().contains(json.getId())) .filter(json -> existsContainer.getIdNoFound().contains(json.getId()))
@ -84,12 +83,7 @@ public class DiscussionParser {
final Discussion discussion = conversionService.convert(json, Discussion.class); final Discussion discussion = conversionService.convert(json, Discussion.class);
discussion.setMergeRequest(mergeRequest); discussion.setMergeRequest(mergeRequest);
discussion.setResponsible(mergeRequest.getAuthor()); discussion.setResponsible(mergeRequest.getAuthor());
discussion.getNotes().forEach( discussion.getNotes().forEach(createNoteLink(mergeRequest));
note -> {
final String url = MessageFormat.format(gitlabProperty.getUrlNote(), mergeRequest.getWebUrl(), note.getId());
note.setWebUrl(url);
}
);
return discussion; return discussion;
}) })
.filter(discussion -> discussion.getNotes() != null && !discussion.getNotes().isEmpty()) .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() { public void scanOldDiscussions() {
int page = 0; int page = 0;
Sheet<Discussion> discussionSheet = discussionService.getAll(PaginationImpl.of(page, 100)); Sheet<Discussion> discussionSheet = discussionService.getAll(PaginationImpl.of(page, COUNT));
while (discussionSheet.hasContent()) { while (discussionSheet.hasContent()) {
final List<Discussion> discussions = discussionSheet.getContent(); final List<Discussion> discussions = discussionSheet.getContent();
for (Discussion discussion : discussions) { for (Discussion discussion : discussions) {
if (discussion.getMergeRequest() != null) { 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(ACCEPT)
.header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken()) .header(H_PRIVATE_TOKEN, personProperty.getToken())
.execute(DiscussionJson.class) .execute(DiscussionJson.class)
.map(json -> { .map(json -> {
final Discussion newDiscussion = conversionService.convert(json, Discussion.class); final Discussion newDiscussion = conversionService.convert(json, Discussion.class);
newDiscussion.getNotes().forEach( newDiscussion.getNotes().forEach(createNoteLink(discussion.getMergeRequest()));
note -> {
final String url = MessageFormat.format(gitlabProperty.getUrlNote(), discussion.getMergeRequest().getWebUrl(), note.getId());
note.setWebUrl(url);
}
);
return newDiscussion; return newDiscussion;
}); });
optNewDiscussion.ifPresent(discussionService::update); 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.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; 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.CREATED;
import static dev.struchkov.bot.gitlab.context.domain.PipelineStatus.MANUAL; 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; import static dev.struchkov.haiti.utils.network.HttpParse.ACCEPT;
/** /**
* // TODO: 17.01.2021 Добавить описание. * Парсер пайплайнов.
* *
* @author upagge 17.01.2021 * @author upagge 17.01.2021
*/ */
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class PipelineParser { public class PipelineParser {
@ -101,7 +99,7 @@ public class PipelineParser {
pipeline.setProject(project); pipeline.setProject(project);
return pipeline; return pipeline;
}) })
.orElseThrow(() -> new ConvertException("Ошибка обновления Pipelines")); .orElseThrow(ConvertException.supplier("Ошибка обновления Pipelines"));
pipelineService.create(newPipeline); pipelineService.create(newPipeline);
} }
@ -136,7 +134,7 @@ public class PipelineParser {
.header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken()) .header(StringUtils.H_PRIVATE_TOKEN, personProperty.getToken())
.execute(PipelineJson.class) .execute(PipelineJson.class)
.map(json -> conversionService.convert(json, Pipeline.class)) .map(json -> conversionService.convert(json, Pipeline.class))
.orElseThrow(() -> new ConvertException("Ошибка обновления Pipelines")); .orElseThrow(ConvertException.supplier("Ошибка обновления Pipelines"));
pipelineService.update(newPipeline); pipelineService.update(newPipeline);
} }

View File

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

View File

@ -4,7 +4,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* // TODO: 29.09.2020 Добавить описание. * Утилитарный класс для работы со сторками.
* *
* @author upagge 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; import org.springframework.stereotype.Repository;
/** /**
* // TODO: 16.01.2021 Добавить описание.
*
* @author upagge 16.01.2021 * @author upagge 16.01.2021
*/ */
@Repository @Repository

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,12 +6,13 @@ import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List; import java.util.List;
/** /**
* // TODO: 11.02.2021 Добавить описание.
*
* @author upagge 11.02.2021 * @author upagge 11.02.2021
*/ */
public interface DiscussionJpaRepository extends JpaRepository<Discussion, String> { public interface DiscussionJpaRepository extends JpaRepository<Discussion, String> {
/**
* Находит все обсуждения MR
*/
List<Discussion> findAllByMergeRequestId(Long mergeRequestId); 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; import org.springframework.data.jpa.repository.JpaRepository;
/** /**
* // TODO: 15.01.2021 Добавить описание.
*
* @author upagge 15.01.2021 * @author upagge 15.01.2021
*/ */
public interface PersonJpaRepository extends JpaRepository<Person, Long> { 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; import java.util.Set;
/** /**
* // TODO: 17.01.2021 Добавить описание.
*
* @author upagge 17.01.2021 * @author upagge 17.01.2021
*/ */
public interface PipelineJpaRepository extends JpaRepositoryImplementation<Pipeline, Long> { 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; import org.springframework.data.jpa.repository.JpaRepository;
/** /**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021 * @author upagge 14.01.2021
*/ */
public interface ProjectJpaRepository extends JpaRepository<Project, Long> { public interface ProjectJpaRepository extends JpaRepository<Project, Long> {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -10,8 +10,6 @@ import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
* // TODO: 14.01.2021 Добавить описание.
*
* @author upagge 14.01.2021 * @author upagge 14.01.2021
*/ */
@Data @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; import lombok.Data;
/** /**
* TODO: Добавить описание класса.
*
* @author upagge [31.01.2020] * @author upagge [31.01.2020]
*/ */
@Data @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; import java.util.Collections;
/** /**
* TODO: Добавить описание класса.
*
* @author upagge [30.01.2020] * @author upagge [30.01.2020]
*/ */
@Configuration @Configuration

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -7,8 +7,6 @@ import dev.struchkov.godfather.context.service.usercode.ProcessingData;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
/** /**
* // TODO: 17.09.2020 Добавить описание.
*
* @author upagge 17.09.2020 * @author upagge 17.09.2020
*/ */
//@Component //@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.config.properties.GitlabProperty;
import dev.struchkov.bot.gitlab.core.service.parser.ProjectParser; import dev.struchkov.bot.gitlab.core.service.parser.ProjectParser;
import dev.struchkov.godfather.context.domain.BoxAnswer; 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.KeyBoard;
import dev.struchkov.godfather.context.domain.keyboard.KeyBoardLine; import dev.struchkov.godfather.context.domain.keyboard.KeyBoardLine;
import dev.struchkov.godfather.context.domain.keyboard.button.KeyBoardButtonText; import dev.struchkov.godfather.context.domain.keyboard.button.KeyBoardButtonText;
@ -35,12 +36,12 @@ import java.util.stream.Collectors;
public class MenuConfig { public class MenuConfig {
@Bean @Bean
public AnswerText menu( public AnswerText<Message> menu(
AppSettingService settingService, AppSettingService settingService,
AnswerText settings, AnswerText<Message> settings,
AnswerText textAddNewProject, AnswerText<Message> textAddNewProject,
AnswerText getTasks, AnswerText<Message> getTasks,
AnswerText getAssigneeMergeRequest AnswerText<Message> getAssigneeMergeRequest
) { ) {
return AnswerText.builder() return AnswerText.builder()
.boxAnswer(message -> .boxAnswer(message ->
@ -83,9 +84,9 @@ public class MenuConfig {
} }
@Bean @Bean
public AnswerText textAddNewProject( public AnswerText<Message> textAddNewProject(
AppSettingService settingService, AppSettingService settingService,
AnswerText addNewProject AnswerText<Message> addNewProject
) { ) {
return AnswerText.builder() return AnswerText.builder()
.boxAnswer(BoxAnswer.processing(settingService.getMessage("ui.menu.add_mr.text"))) .boxAnswer(BoxAnswer.processing(settingService.getMessage("ui.menu.add_mr.text")))
@ -95,7 +96,7 @@ public class MenuConfig {
} }
@Bean @Bean
public AnswerText addNewProject( public AnswerText<Message> addNewProject(
AppSettingService settingService, AppSettingService settingService,
ProjectParser projectParser, ProjectParser projectParser,
GitlabProperty gitlabProperty GitlabProperty gitlabProperty
@ -112,9 +113,9 @@ public class MenuConfig {
} }
@Bean @Bean
public AnswerText settings( public AnswerText<Message> settings(
AppSettingService settingService, AppSettingService settingService,
AnswerText settingsLanguage AnswerText<Message> settingsLanguage
) { ) {
return AnswerText.builder() return AnswerText.builder()
.boxAnswer(message -> .boxAnswer(message ->
@ -128,7 +129,7 @@ public class MenuConfig {
} }
@Bean @Bean
public AnswerText getTasks( public AnswerText<Message> getTasks(
AppSettingService settingService, AppSettingService settingService,
PersonInformation personInformation, PersonInformation personInformation,
NoteService noteService NoteService noteService
@ -151,7 +152,7 @@ public class MenuConfig {
} }
@Bean @Bean
public AnswerText getAssigneeMergeRequest( public AnswerText<Message> getAssigneeMergeRequest(
MergeRequestsService mergeRequestsService, MergeRequestsService mergeRequestsService,
PersonInformation personInformation, PersonInformation personInformation,
AppSettingService settingService 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.bot.gitlab.core.service.parser.ProjectParser;
import dev.struchkov.godfather.context.domain.BoxAnswer; import dev.struchkov.godfather.context.domain.BoxAnswer;
import dev.struchkov.godfather.context.domain.content.Mail; 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.Attachment;
import dev.struchkov.godfather.context.domain.content.attachment.AttachmentType; import dev.struchkov.godfather.context.domain.content.attachment.AttachmentType;
import dev.struchkov.godfather.context.domain.content.attachment.Link; import dev.struchkov.godfather.context.domain.content.attachment.Link;
@ -40,7 +41,7 @@ public class UnitConfig {
@Bean @Bean
public AnswerCheck checkFirstStart( public AnswerCheck checkFirstStart(
AppSettingService settingService, AppSettingService settingService,
AnswerText textCheckLanguage, AnswerText<Message> textCheckLanguage,
AnswerCheck checkMenuOrAnswer AnswerCheck checkMenuOrAnswer
) { ) {
return AnswerCheck.builder() return AnswerCheck.builder()
@ -54,8 +55,8 @@ public class UnitConfig {
@Bean @Bean
public AnswerCheck checkMenuOrAnswer( public AnswerCheck checkMenuOrAnswer(
AnswerText menu, AnswerText<Message> menu,
AnswerText answerNote AnswerText<Message> answerNote
) { ) {
return AnswerCheck.builder() return AnswerCheck.builder()
.check( .check(
@ -76,7 +77,7 @@ public class UnitConfig {
} }
@Bean @Bean
public AnswerText answerNote( public AnswerText<Message> answerNote(
NoteService noteService, NoteService noteService,
DiscussionService discussionService DiscussionService discussionService
) { ) {
@ -105,7 +106,7 @@ public class UnitConfig {
} }
@Bean @Bean
public AnswerText textCheckLanguage( public AnswerText<Message> textCheckLanguage(
AnswerProcessing checkLanguage AnswerProcessing checkLanguage
) { ) {
return AnswerText.builder() return AnswerText.builder()
@ -122,7 +123,7 @@ public class UnitConfig {
@Bean @Bean
public AnswerProcessing checkLanguage( public AnswerProcessing checkLanguage(
AppSettingService settingService, AppSettingService settingService,
AnswerText textParserPrivateProject AnswerText<Message> textParserPrivateProject
) { ) {
return AnswerProcessing return AnswerProcessing
.builder() .builder()
@ -140,7 +141,7 @@ public class UnitConfig {
} }
@Bean @Bean
public AnswerText textParserPrivateProject( public AnswerText<Message> textParserPrivateProject(
AnswerCheck checkParserPrivateProject, AnswerCheck checkParserPrivateProject,
AppSettingService settingService AppSettingService settingService
) { ) {
@ -162,7 +163,7 @@ public class UnitConfig {
public AnswerCheck checkParserPrivateProject( public AnswerCheck checkParserPrivateProject(
AppSettingService appSettingService, AppSettingService appSettingService,
AnswerProcessing parserPrivateProject, AnswerProcessing parserPrivateProject,
AnswerText textParseOwnerProject AnswerText<Message> textParseOwnerProject
) { ) {
return AnswerCheck.builder() return AnswerCheck.builder()
.check( .check(
@ -177,7 +178,7 @@ public class UnitConfig {
public AnswerProcessing parserPrivateProject( public AnswerProcessing parserPrivateProject(
ProjectParser projectParser, ProjectParser projectParser,
AppSettingService settingService, AppSettingService settingService,
AnswerText textParseOwnerProject AnswerText<Message> textParseOwnerProject
) { ) {
return AnswerProcessing.builder() return AnswerProcessing.builder()
.processingData(message -> { .processingData(message -> {
@ -189,7 +190,7 @@ public class UnitConfig {
} }
@Bean @Bean
public AnswerText textParseOwnerProject( public AnswerText<Message> textParseOwnerProject(
AppSettingService settingService, AppSettingService settingService,
AnswerCheck checkParseOwnerProject 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.domain.AppLocale;
import dev.struchkov.bot.gitlab.context.service.AppSettingService; import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import dev.struchkov.godfather.context.domain.BoxAnswer; 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.context.utils.KeyBoards;
import dev.struchkov.godfather.core.domain.unit.AnswerText; import dev.struchkov.godfather.core.domain.unit.AnswerText;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -17,9 +18,9 @@ import org.springframework.context.annotation.Configuration;
public class MenuSettingsConfig { public class MenuSettingsConfig {
@Bean @Bean
public AnswerText settingsLanguage( public AnswerText<Message> settingsLanguage(
AppSettingService settingService, AppSettingService settingService,
AnswerText setLanguage AnswerText<Message> setLanguage
) { ) {
return AnswerText.builder() return AnswerText.builder()
.boxAnswer( .boxAnswer(
@ -34,7 +35,7 @@ public class MenuSettingsConfig {
} }
@Bean @Bean
public AnswerText setLanguage( public AnswerText<Message> setLanguage(
AppSettingService settingService AppSettingService settingService
) { ) {
return AnswerText.builder() return AnswerText.builder()