Рефакторинг по пакетам

This commit is contained in:
Struchkov Mark 2024-08-23 20:41:33 +03:00
parent 7b0019f4fe
commit d2e1fdbfcb
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
39 changed files with 286 additions and 185 deletions

View File

@ -0,0 +1,17 @@
package dev.struchkov.bot.gitlab.context.prop;
import lombok.Getter;
import lombok.Setter;
/**
* Основные настройки приложения.
*
* @author upagge 11.10.2020
*/
@Getter
@Setter
public class AppProperty {
private String version;
}

View File

@ -1,9 +1,7 @@
package dev.struchkov.bot.gitlab.core.config.properties; package dev.struchkov.bot.gitlab.context.prop;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/** /**
* Данные необходимые для взаимодействия с API GitLab. * Данные необходимые для взаимодействия с API GitLab.
@ -12,8 +10,6 @@ import org.springframework.stereotype.Component;
*/ */
@Getter @Getter
@Setter @Setter
@Component
@ConfigurationProperties("gitlab-bot.gitlab")
public class GitlabProperty { public class GitlabProperty {
private String baseUrl; private String baseUrl;

View File

@ -0,0 +1,17 @@
package dev.struchkov.bot.gitlab.context.prop;
import lombok.Getter;
import lombok.Setter;
/**
* @author upagge 15.01.2021
*/
@Getter
@Setter
public class PersonProperty {
private String token;
private String telegramId;
}

View File

@ -34,6 +34,10 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId> <artifactId>spring-boot-starter</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

View File

@ -1,16 +0,0 @@
package dev.struchkov.bot.gitlab.core.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.ForkJoinPool;
@Configuration
public class CoreConfig {
@Bean("parserPool")
public ForkJoinPool parserPool() {
return new ForkJoinPool(4);
}
}

View File

@ -1,21 +0,0 @@
package dev.struchkov.bot.gitlab.core.config.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* Основные настройки приложения.
*
* @author upagge 11.10.2020
*/
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "gitlab-bot")
public class AppProperty {
private String version;
}

View File

@ -1,21 +0,0 @@
package dev.struchkov.bot.gitlab.core.config.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author upagge 15.01.2021
*/
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "gitlab-bot.person")
public class PersonProperty {
private String token;
private String telegramId;
}

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.convert; package dev.struchkov.bot.gitlab.core.convert;
import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion;
import dev.struchkov.bot.gitlab.sdk.domain.DiscussionJson; import dev.struchkov.bot.gitlab.sdk.domain.DiscussionJson;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.convert; package dev.struchkov.bot.gitlab.core.convert;
import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState;
import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.convert; package dev.struchkov.bot.gitlab.core.convert;
import dev.struchkov.bot.gitlab.context.domain.entity.Note; import dev.struchkov.bot.gitlab.context.domain.entity.Note;
import dev.struchkov.bot.gitlab.sdk.domain.NoteJson; import dev.struchkov.bot.gitlab.sdk.domain.NoteJson;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.convert; package dev.struchkov.bot.gitlab.core.convert;
import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.bot.gitlab.sdk.domain.PersonJson; import dev.struchkov.bot.gitlab.sdk.domain.PersonJson;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.convert; package dev.struchkov.bot.gitlab.core.convert;
import dev.struchkov.bot.gitlab.context.domain.PipelineStatus; 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;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.convert; package dev.struchkov.bot.gitlab.core.convert;
import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.domain.entity.Project;
import dev.struchkov.bot.gitlab.sdk.domain.ProjectJson; import dev.struchkov.bot.gitlab.sdk.domain.ProjectJson;

View File

@ -1,14 +1,14 @@
package dev.struchkov.bot.gitlab.core.service.parser; package dev.struchkov.bot.gitlab.core.parser;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.entity.Discussion; import dev.struchkov.bot.gitlab.context.domain.entity.Discussion;
import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequestForDiscussion; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequestForDiscussion;
import dev.struchkov.bot.gitlab.context.domain.entity.Note; import dev.struchkov.bot.gitlab.context.domain.entity.Note;
import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.bot.gitlab.context.prop.GitlabProperty;
import dev.struchkov.bot.gitlab.context.prop.PersonProperty;
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.PersonProperty;
import dev.struchkov.bot.gitlab.core.utils.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.sdk.domain.DiscussionJson; import dev.struchkov.bot.gitlab.sdk.domain.DiscussionJson;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@ -1,16 +1,16 @@
package dev.struchkov.bot.gitlab.core.service.parser; package dev.struchkov.bot.gitlab.core.parser;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.IdAndStatusPr; import dev.struchkov.bot.gitlab.context.domain.IdAndStatusPr;
import dev.struchkov.bot.gitlab.context.domain.MergeRequestState; import dev.struchkov.bot.gitlab.context.domain.MergeRequestState;
import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest; import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequest;
import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.bot.gitlab.context.prop.GitlabProperty;
import dev.struchkov.bot.gitlab.context.prop.PersonProperty;
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService; import dev.struchkov.bot.gitlab.context.service.MergeRequestsService;
import dev.struchkov.bot.gitlab.context.service.ProjectService; import dev.struchkov.bot.gitlab.context.service.ProjectService;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.core.parser.forktask.GetAllMergeRequestForProjectTask;
import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty; import dev.struchkov.bot.gitlab.core.parser.forktask.GetSingleMergeRequestTask;
import dev.struchkov.bot.gitlab.core.service.parser.forktask.GetAllMergeRequestForProjectTask;
import dev.struchkov.bot.gitlab.core.service.parser.forktask.GetSingleMergeRequestTask;
import dev.struchkov.bot.gitlab.core.utils.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.core.utils.StringUtils;
import dev.struchkov.bot.gitlab.sdk.domain.ApprovalContainerJson; import dev.struchkov.bot.gitlab.sdk.domain.ApprovalContainerJson;

View File

@ -1,14 +1,14 @@
package dev.struchkov.bot.gitlab.core.service.parser; package dev.struchkov.bot.gitlab.core.parser;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.PipelineStatus; 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.bot.gitlab.context.prop.GitlabProperty;
import dev.struchkov.bot.gitlab.context.prop.PersonProperty;
import dev.struchkov.bot.gitlab.context.service.PipelineService; import dev.struchkov.bot.gitlab.context.service.PipelineService;
import dev.struchkov.bot.gitlab.context.service.ProjectService; import dev.struchkov.bot.gitlab.context.service.ProjectService;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.core.parser.forktask.GetPipelineShortTask;
import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty; import dev.struchkov.bot.gitlab.core.parser.forktask.GetPipelineTask;
import dev.struchkov.bot.gitlab.core.service.parser.forktask.GetPipelineShortTask;
import dev.struchkov.bot.gitlab.core.service.parser.forktask.GetPipelineTask;
import dev.struchkov.bot.gitlab.sdk.domain.PipelineJson; import dev.struchkov.bot.gitlab.sdk.domain.PipelineJson;
import dev.struchkov.bot.gitlab.sdk.domain.PipelineShortJson; import dev.struchkov.bot.gitlab.sdk.domain.PipelineShortJson;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@ -1,13 +1,13 @@
package dev.struchkov.bot.gitlab.core.service.parser; package dev.struchkov.bot.gitlab.core.parser;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.domain.entity.Project;
import dev.struchkov.bot.gitlab.context.prop.GitlabProperty;
import dev.struchkov.bot.gitlab.context.prop.PersonProperty;
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService; import dev.struchkov.bot.gitlab.context.service.MergeRequestsService;
import dev.struchkov.bot.gitlab.context.service.PersonService; import dev.struchkov.bot.gitlab.context.service.PersonService;
import dev.struchkov.bot.gitlab.context.service.ProjectService; import dev.struchkov.bot.gitlab.context.service.ProjectService;
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.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.core.utils.StringUtils;
import dev.struchkov.bot.gitlab.sdk.domain.PersonJson; import dev.struchkov.bot.gitlab.sdk.domain.PersonJson;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.parser.forktask; package dev.struchkov.bot.gitlab.core.parser.forktask;
import dev.struchkov.bot.gitlab.core.utils.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.sdk.domain.DiscussionJson; import dev.struchkov.bot.gitlab.sdk.domain.DiscussionJson;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.parser.forktask; package dev.struchkov.bot.gitlab.core.parser.forktask;
import dev.struchkov.bot.gitlab.core.utils.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.core.utils.StringUtils;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.parser.forktask; package dev.struchkov.bot.gitlab.core.parser.forktask;
import dev.struchkov.bot.gitlab.core.utils.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.core.utils.StringUtils;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.parser.forktask; package dev.struchkov.bot.gitlab.core.parser.forktask;
import dev.struchkov.bot.gitlab.core.utils.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.core.utils.StringUtils;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.parser.forktask; package dev.struchkov.bot.gitlab.core.parser.forktask;
import dev.struchkov.bot.gitlab.core.utils.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.core.utils.StringUtils;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.impl; package dev.struchkov.bot.gitlab.core.service;
import dev.struchkov.bot.gitlab.context.domain.entity.AppSetting; import dev.struchkov.bot.gitlab.context.domain.entity.AppSetting;
import dev.struchkov.bot.gitlab.context.domain.notify.level.DiscussionLevel; import dev.struchkov.bot.gitlab.context.domain.notify.level.DiscussionLevel;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.impl; package dev.struchkov.bot.gitlab.core.service;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.PersonInformation;
@ -10,12 +10,12 @@ import dev.struchkov.bot.gitlab.context.domain.notify.comment.NewCommentNotify;
import dev.struchkov.bot.gitlab.context.domain.notify.level.DiscussionLevel; import dev.struchkov.bot.gitlab.context.domain.notify.level.DiscussionLevel;
import dev.struchkov.bot.gitlab.context.domain.notify.task.DiscussionNewNotify; import dev.struchkov.bot.gitlab.context.domain.notify.task.DiscussionNewNotify;
import dev.struchkov.bot.gitlab.context.domain.notify.task.ThreadCloseNotify; import dev.struchkov.bot.gitlab.context.domain.notify.task.ThreadCloseNotify;
import dev.struchkov.bot.gitlab.context.prop.GitlabProperty;
import dev.struchkov.bot.gitlab.context.prop.PersonProperty;
import dev.struchkov.bot.gitlab.context.repository.DiscussionRepository; import dev.struchkov.bot.gitlab.context.repository.DiscussionRepository;
import dev.struchkov.bot.gitlab.context.service.AppSettingService; import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import dev.struchkov.bot.gitlab.context.service.DiscussionService; import dev.struchkov.bot.gitlab.context.service.DiscussionService;
import dev.struchkov.bot.gitlab.context.service.NotifyService; import dev.struchkov.bot.gitlab.context.service.NotifyService;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty;
import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty;
import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.core.utils.StringUtils;
import dev.struchkov.haiti.utils.container.Pair; import dev.struchkov.haiti.utils.container.Pair;
import lombok.NonNull; import lombok.NonNull;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.impl; package dev.struchkov.bot.gitlab.core.service;
import dev.struchkov.bot.gitlab.context.domain.AssigneeChanged; import dev.struchkov.bot.gitlab.context.domain.AssigneeChanged;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.impl.note; package dev.struchkov.bot.gitlab.core.service;
import dev.struchkov.bot.gitlab.context.domain.entity.Note; import dev.struchkov.bot.gitlab.context.domain.entity.Note;
import dev.struchkov.bot.gitlab.context.repository.NoteRepository; import dev.struchkov.bot.gitlab.context.repository.NoteRepository;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.impl; package dev.struchkov.bot.gitlab.core.service;
import dev.struchkov.bot.gitlab.context.domain.notify.Notify; 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;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.impl; package dev.struchkov.bot.gitlab.core.service;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Person;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.impl; package dev.struchkov.bot.gitlab.core.service;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.PersonInformation;

View File

@ -1,4 +1,4 @@
package dev.struchkov.bot.gitlab.core.service.impl; package dev.struchkov.bot.gitlab.core.service;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.domain.entity.Project;

View File

@ -2,124 +2,98 @@ package dev.struchkov.bot.gitlab.core.utils;
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import dev.struchkov.haiti.utils.Inspector;
import jakarta.validation.constraints.NotNull;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.TimeUnit;
import static dev.struchkov.haiti.utils.Checker.checkNotNull; @Component
import static dev.struchkov.haiti.utils.Inspector.isNotNull;
/**
* Утилитарный класс для работы с web.
*
* @author upagge 30.09.2020
*/
public class HttpParse { public class HttpParse {
private static final Logger log = LoggerFactory.getLogger(HttpParse.class); private static final Logger log = LoggerFactory.getLogger(HttpParse.class);
public static final HttpHeader ACCEPT = HttpHeader.of("Accept", "text/html,application/xhtml+xml,application/json");
private static final ObjectMapper objectMapper; private static final ObjectMapper objectMapper;
private final HttpHeaders headers = new HttpHeaders();
private final Request.Builder requestBuilder = new Request.Builder(); private final UriComponentsBuilder uriBuilder;
private final HttpUrl.Builder httpUrlBuilder;
static { static {
objectMapper = new ObjectMapper(); objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
} }
public HttpParse(String url) { private final RestTemplate restTemplate;
Inspector.isNotNull(url);
httpUrlBuilder = HttpUrl.parse(url).newBuilder(); public HttpParse(String url, RestTemplate restTemplate) {
this.restTemplate = restTemplate;
this.uriBuilder = UriComponentsBuilder.fromHttpUrl(url);
} }
public static HttpParse request(String url) { public static HttpParse request(String url, RestTemplate restTemplate) {
Inspector.isNotNull(url); return new HttpParse(url, restTemplate);
return new HttpParse(url);
} }
public HttpParse header(String name, String value) { public HttpParse header(String name, String value) {
isNotNull(name); if (name != null && value != null) {
if (value != null) { headers.add(name, value);
requestBuilder.header(name, value);
} }
return this; return this;
} }
public HttpParse header(HttpHeader header) { public HttpParse header(HttpHeader header) {
isNotNull(header); if (header != null) {
requestBuilder.header(header.getName(), header.getValue()); headers.add(header.getName(), header.getValue());
}
return this; return this;
} }
public HttpParse getParameter(String name, String value) { public HttpParse getParameter(String name, String value) {
isNotNull(name); if (name != null && value != null) {
if (value != null) { uriBuilder.queryParam(name, value);
httpUrlBuilder.addQueryParameter(name, value);
} }
return this; return this;
} }
public <T> Optional<T> execute(Class<T> classOfT) { public <T> Optional<T> execute(Class<T> classOfT) {
isNotNull(classOfT); try {
final HttpUrl url = httpUrlBuilder.build(); String url = uriBuilder.toUriString();
final Request request = requestBuilder.url(url).build(); log.trace("Выполняется RestTemplate запрос | {}", url);
log.trace("Выполняется okhttp3 запрос | {}", url); HttpEntity<String> entity = new HttpEntity<>(headers);
final OkHttpClient httpClient = getNewClient(); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
try (final Response execute = httpClient.newCall(request).execute()) {
log.trace("Запрос выполнен | {}", url); log.trace("Запрос выполнен | {}", url);
if (execute.isSuccessful() && checkNotNull(execute.body())) { if (response.getStatusCode().is2xxSuccessful() && response.hasBody()) {
final String string = execute.body().string(); String body = response.getBody();
return Optional.ofNullable(objectMapper.readValue(string, classOfT)); return Optional.ofNullable(objectMapper.readValue(body, classOfT));
} }
} catch (IOException e) { } catch (IOException e) {
log.error("Ошибка выполнения okhttp3", e); log.error("Ошибка выполнения RestTemplate", e);
} }
return Optional.empty(); return Optional.empty();
} }
//TODO [16.01.2023|uPagge]: Okhttp Client создается на каждый запрос, что не рационально по потреблению ресурсов и производительности, но позволяет обойти ограничение со стороны гитлаба, при котором один и тот же клиент отбрасывался спустя 1000 запросов. Возможно стоит заменить OkHttp на что-то другое, например, RestTemplate
public <T> List<T> executeList(Class<T> classOfT) { public <T> List<T> executeList(Class<T> classOfT) {
isNotNull(classOfT); try {
final HttpUrl url = httpUrlBuilder.build(); String url = uriBuilder.toUriString();
final Request request = requestBuilder.url(url).build(); log.trace("Выполняется RestTemplate запрос | {}", url);
log.trace("Выполняется okhttp3 запрос | {}", url); HttpEntity<String> entity = new HttpEntity<>(headers);
final OkHttpClient httpClient = getNewClient(); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
try (Response execute = httpClient.newCall(request).execute()) {
log.trace("Запрос выполнен | {}", url); log.trace("Запрос выполнен | {}", url);
ResponseBody body = execute.body(); if (response.getStatusCode().is2xxSuccessful() && response.hasBody()) {
if (execute.isSuccessful() && checkNotNull(body)) { String body = response.getBody();
final String stringBody = body.string(); return objectMapper.readValue(body, objectMapper.getTypeFactory().constructCollectionType(List.class, classOfT));
final List<T> list = objectMapper.readValue(stringBody, objectMapper.getTypeFactory().constructCollectionType(List.class, classOfT));
return (list == null || list.isEmpty()) ? Collections.emptyList() : list;
} }
} catch (IOException e) { } catch (IOException e) {
log.error("Ошибка выполнения okhttp3", e); log.error("Ошибка выполнения RestTemplate", e);
} }
return Collections.emptyList(); return Collections.emptyList();
} }
@NotNull
private static OkHttpClient getNewClient() {
return new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build();
} }
}

View File

@ -0,0 +1,125 @@
//package dev.struchkov.bot.gitlab.core.utils;
//
//import com.fasterxml.jackson.databind.DeserializationFeature;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import dev.struchkov.haiti.utils.Inspector;
//import jakarta.validation.constraints.NotNull;
//import okhttp3.HttpUrl;
//import okhttp3.OkHttpClient;
//import okhttp3.Request;
//import okhttp3.Response;
//import okhttp3.ResponseBody;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.IOException;
//import java.util.Collections;
//import java.util.List;
//import java.util.Optional;
//import java.util.concurrent.TimeUnit;
//
//import static dev.struchkov.haiti.utils.Checker.checkNotNull;
//import static dev.struchkov.haiti.utils.Inspector.isNotNull;
//
///**
// * Утилитарный класс для работы с web.
// *
// * @author upagge 30.09.2020
// */
//public class HttpParse {
//
// private static final Logger log = LoggerFactory.getLogger(HttpParse.class);
//
// public static final HttpHeader ACCEPT = HttpHeader.of("Accept", "text/html,application/xhtml+xml,application/json");
//
// private static final ObjectMapper objectMapper;
//
// private final Request.Builder requestBuilder = new Request.Builder();
// private final HttpUrl.Builder httpUrlBuilder;
//
// static {
// objectMapper = new ObjectMapper();
// objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// }
//
// public HttpParse(String url) {
// Inspector.isNotNull(url);
// httpUrlBuilder = HttpUrl.parse(url).newBuilder();
// }
//
// public static HttpParse request(String url) {
// Inspector.isNotNull(url);
// return new HttpParse(url);
// }
//
// public HttpParse header(String name, String value) {
// isNotNull(name);
// if (value != null) {
// requestBuilder.header(name, value);
// }
// return this;
// }
//
// public HttpParse header(HttpHeader header) {
// isNotNull(header);
// requestBuilder.header(header.getName(), header.getValue());
// return this;
// }
//
// public HttpParse getParameter(String name, String value) {
// isNotNull(name);
// if (value != null) {
// httpUrlBuilder.addQueryParameter(name, value);
// }
// return this;
// }
//
// public <T> Optional<T> execute(Class<T> classOfT) {
// isNotNull(classOfT);
// final HttpUrl url = httpUrlBuilder.build();
// final Request request = requestBuilder.url(url).build();
// log.trace("Выполняется okhttp3 запрос | {}", url);
// final OkHttpClient httpClient = getNewClient();
// try (final Response execute = httpClient.newCall(request).execute()) {
// log.trace("Запрос выполнен | {}", url);
// if (execute.isSuccessful() && checkNotNull(execute.body())) {
// final String string = execute.body().string();
// return Optional.ofNullable(objectMapper.readValue(string, classOfT));
// }
// } catch (IOException e) {
// log.error("Ошибка выполнения okhttp3", e);
// }
// return Optional.empty();
// }
//
// //TODO [16.01.2023|uPagge]: Okhttp Client создается на каждый запрос, что не рационально по потреблению ресурсов и производительности, но позволяет обойти ограничение со стороны гитлаба, при котором один и тот же клиент отбрасывался спустя 1000 запросов. Возможно стоит заменить OkHttp на что-то другое, например, RestTemplate
// public <T> List<T> executeList(Class<T> classOfT) {
// isNotNull(classOfT);
// final HttpUrl url = httpUrlBuilder.build();
// final Request request = requestBuilder.url(url).build();
// log.trace("Выполняется okhttp3 запрос | {}", url);
// final OkHttpClient httpClient = getNewClient();
// try (Response execute = httpClient.newCall(request).execute()) {
// log.trace("Запрос выполнен | {}", url);
// ResponseBody body = execute.body();
// if (execute.isSuccessful() && checkNotNull(body)) {
// final String stringBody = body.string();
// final List<T> list = objectMapper.readValue(stringBody, objectMapper.getTypeFactory().constructCollectionType(List.class, classOfT));
// return (list == null || list.isEmpty()) ? Collections.emptyList() : list;
// }
// } catch (IOException e) {
// log.error("Ошибка выполнения okhttp3", e);
// }
// return Collections.emptyList();
// }
//
// @NotNull
// private static OkHttpClient getNewClient() {
// return new OkHttpClient().newBuilder()
// .connectTimeout(30, TimeUnit.SECONDS)
// .readTimeout(30, TimeUnit.SECONDS)
// .writeTimeout(30, TimeUnit.SECONDS)
// .build();
// }
//
//}

View File

@ -1,10 +1,12 @@
package dev.struchkov.bot.gitlab.config; package dev.struchkov.bot.gitlab.config;
import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.PersonInformation;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.context.prop.AppProperty;
import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty; import dev.struchkov.bot.gitlab.context.prop.GitlabProperty;
import dev.struchkov.bot.gitlab.context.prop.PersonProperty;
import dev.struchkov.bot.gitlab.core.utils.HttpParse; import dev.struchkov.bot.gitlab.core.utils.HttpParse;
import dev.struchkov.bot.gitlab.core.utils.StringUtils; import dev.struchkov.bot.gitlab.core.utils.StringUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
@ -13,6 +15,7 @@ import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;
import static dev.struchkov.bot.gitlab.core.utils.HttpParse.ACCEPT; import static dev.struchkov.bot.gitlab.core.utils.HttpParse.ACCEPT;
import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException; import static dev.struchkov.haiti.context.exception.NotFoundException.notFoundException;
@ -36,6 +39,29 @@ public class AppConfig {
// return taskScheduler; // return taskScheduler;
// } // }
@Bean
@ConfigurationProperties(prefix = "gitlab-bot")
public AppProperty appProperty() {
return new AppProperty();
}
@Bean
@ConfigurationProperties("gitlab-bot.gitlab")
public GitlabProperty gitlabProperty() {
return new GitlabProperty();
}
@Bean
@ConfigurationProperties(prefix = "gitlab-bot.person")
public PersonProperty personProperty() {
return new PersonProperty();
}
@Bean("parserPool")
public ForkJoinPool parserPool() {
return new ForkJoinPool(4);
}
@Bean @Bean
public ConversionService conversionService(Converter... converters) { public ConversionService conversionService(Converter... converters) {
final DefaultConversionService defaultConversionService = new DefaultConversionService(); final DefaultConversionService defaultConversionService = new DefaultConversionService();

View File

@ -4,10 +4,10 @@ import dev.struchkov.bot.gitlab.context.service.AppSettingService;
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.context.service.PipelineService; import dev.struchkov.bot.gitlab.context.service.PipelineService;
import dev.struchkov.bot.gitlab.core.service.parser.DiscussionParser; import dev.struchkov.bot.gitlab.core.parser.DiscussionParser;
import dev.struchkov.bot.gitlab.core.service.parser.MergeRequestParser; import dev.struchkov.bot.gitlab.core.parser.MergeRequestParser;
import dev.struchkov.bot.gitlab.core.service.parser.PipelineParser; import dev.struchkov.bot.gitlab.core.parser.PipelineParser;
import dev.struchkov.bot.gitlab.core.service.parser.ProjectParser; import dev.struchkov.bot.gitlab.core.parser.ProjectParser;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;

View File

@ -1,6 +1,6 @@
package dev.struchkov.bot.gitlab.telegram.service; package dev.struchkov.bot.gitlab.telegram.service;
import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty; import dev.struchkov.bot.gitlab.context.prop.PersonProperty;
import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.godfather.main.domain.content.Message;
import dev.struchkov.godfather.simple.context.service.ErrorHandler; import dev.struchkov.godfather.simple.context.service.ErrorHandler;
import dev.struchkov.godfather.simple.domain.BoxAnswer; import dev.struchkov.godfather.simple.domain.BoxAnswer;

View File

@ -1,6 +1,6 @@
package dev.struchkov.bot.gitlab.telegram.service; package dev.struchkov.bot.gitlab.telegram.service;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.context.prop.GitlabProperty;
import dev.struchkov.godfather.simple.domain.BoxAnswer; import dev.struchkov.godfather.simple.domain.BoxAnswer;
import dev.struchkov.godfather.simple.domain.action.PreSendProcessing; import dev.struchkov.godfather.simple.domain.action.PreSendProcessing;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@ -1,9 +1,9 @@
package dev.struchkov.bot.gitlab.telegram.service; package dev.struchkov.bot.gitlab.telegram.service;
import dev.struchkov.bot.gitlab.context.prop.AppProperty;
import dev.struchkov.bot.gitlab.context.prop.PersonProperty;
import dev.struchkov.bot.gitlab.context.service.AppSettingService; import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import dev.struchkov.bot.gitlab.context.utils.Icons; import dev.struchkov.bot.gitlab.context.utils.Icons;
import dev.struchkov.bot.gitlab.core.config.properties.AppProperty;
import dev.struchkov.bot.gitlab.core.config.properties.PersonProperty;
import dev.struchkov.godfather.simple.domain.BoxAnswer; import dev.struchkov.godfather.simple.domain.BoxAnswer;
import dev.struchkov.godfather.telegram.domain.ClientBotCommand; import dev.struchkov.godfather.telegram.domain.ClientBotCommand;
import dev.struchkov.godfather.telegram.simple.context.service.TelegramSending; import dev.struchkov.godfather.telegram.simple.context.service.TelegramSending;

View File

@ -3,13 +3,13 @@ package dev.struchkov.bot.gitlab.telegram.unit;
import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.PersonInformation;
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.Project; import dev.struchkov.bot.gitlab.context.domain.entity.Project;
import dev.struchkov.bot.gitlab.context.prop.GitlabProperty;
import dev.struchkov.bot.gitlab.context.service.AppSettingService; import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService; import dev.struchkov.bot.gitlab.context.service.MergeRequestsService;
import dev.struchkov.bot.gitlab.context.service.NoteService; import dev.struchkov.bot.gitlab.context.service.NoteService;
import dev.struchkov.bot.gitlab.context.service.ProjectService; import dev.struchkov.bot.gitlab.context.service.ProjectService;
import dev.struchkov.bot.gitlab.context.utils.Icons; import dev.struchkov.bot.gitlab.context.utils.Icons;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.core.parser.ProjectParser;
import dev.struchkov.bot.gitlab.core.service.parser.ProjectParser;
import dev.struchkov.bot.gitlab.telegram.utils.UnitName; import dev.struchkov.bot.gitlab.telegram.utils.UnitName;
import dev.struchkov.godfather.main.domain.annotation.Unit; import dev.struchkov.godfather.main.domain.annotation.Unit;
import dev.struchkov.godfather.main.domain.content.Mail; import dev.struchkov.godfather.main.domain.content.Mail;

View File

@ -7,10 +7,10 @@ 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.context.service.PipelineService; import dev.struchkov.bot.gitlab.context.service.PipelineService;
import dev.struchkov.bot.gitlab.context.service.ProjectService; import dev.struchkov.bot.gitlab.context.service.ProjectService;
import dev.struchkov.bot.gitlab.core.service.parser.DiscussionParser; import dev.struchkov.bot.gitlab.core.parser.DiscussionParser;
import dev.struchkov.bot.gitlab.core.service.parser.MergeRequestParser; import dev.struchkov.bot.gitlab.core.parser.MergeRequestParser;
import dev.struchkov.bot.gitlab.core.service.parser.PipelineParser; import dev.struchkov.bot.gitlab.core.parser.PipelineParser;
import dev.struchkov.bot.gitlab.core.service.parser.ProjectParser; import dev.struchkov.bot.gitlab.core.parser.ProjectParser;
import dev.struchkov.godfather.main.domain.annotation.Unit; import dev.struchkov.godfather.main.domain.annotation.Unit;
import dev.struchkov.godfather.main.domain.content.Mail; import dev.struchkov.godfather.main.domain.content.Mail;
import dev.struchkov.godfather.main.domain.content.Message; import dev.struchkov.godfather.main.domain.content.Message;