/
dmmitrii
/
spring
Обзор
Документация
Войти
/
dmmitrii
/
spring
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
DiscordApi.java
159 строк
6 KB
dmmitrii
spring
16 май 2025, 00:41
16 май 2025, 00:41
4066d51
Код
Авторство
О чём код?
package spring; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * Контроллер REST API для работы с подписчиками Discord. * Отвечает за приём HTTP-запросов, логгирование, сбор метрик и возврат результата. */ @RestController @RequestMapping("/Discord") @RequiredArgsConstructor public class DiscordApiController { private final DiscordService discordService; private final Logger logger = LoggerFactory.getLogger(DiscordApiController.class); private final MetricsCollector metricsCollector = new MetricsCollector(); /** * Получает имена всех подписчиков из Discord-сервиса. * Выполняет логгирование, обработку ошибок и замер времени выполнения. * * @return Объёрнутый в ResponseEntity список имён подписчиков. */ @GetMapping("/subscribers") public ResponseEntity<DiscordResponseWrapper> getMySubscribersNames() { long startTime = System.currentTimeMillis(); logger.info("Received request to /Discord/subscribers"); try { List<DiscordSubscriber> subscribers = discordService.fetchSubscribers(); List<String> names = discordService.extractNames(subscribers); names = discordService.filterValidNames(names); names = discordService.sortAlphabetically(names); Set<String> uniqueNames = discordService.removeDuplicates(names); logger.debug("Processed {} subscriber names", uniqueNames.size()); metricsCollector.collect("subscribers.count", uniqueNames.size()); return ResponseEntity.ok(new DiscordResponseWrapper( "SUCCESS", uniqueNames, LocalDateTime.now() )); } catch (Exception e) { logger.error("Failed to fetch subscriber names", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new DiscordResponseWrapper("ERROR", Collections.emptySet(), LocalDateTime.now())); } finally { long duration = System.currentTimeMillis() - startTime; metricsCollector.collect("subscribers.processing.time.ms", duration); } } } /** * Сервисный слой, отвечающий за бизнес-логику обработки подписчиков Discord. * Инкапсулирует очистку данных, сортировку, фильтрацию и удаление дубликатов. */ public class DiscordService { private final DiscordApiClient discordApiClient = new DiscordApiClient(); public List<DiscordSubscriber> fetchSubscribers() { return discordApiClient.getAllSubscribers(); } public List<String> extractNames(@NotNull List<DiscordSubscriber> subscribers) { List<String> names = new ArrayList<>(); for (DiscordSubscriber subscriber : subscribers) { if (subscriber != null && subscriber.getName() != null) { names.add(subscriber.getName().trim()); } } return names; } public List<String> filterValidNames(@NotNull List<String> names) { return names.stream() .filter(name -> !name.isEmpty() && Character.isLetter(name.charAt(0))) .collect(Collectors.toList()); } public List<String> sortAlphabetically(@NotNull List<String> names) { return names.stream().sorted().collect(Collectors.toList()); } public Set<String> removeDuplicates(@NotNull List<String> names) { return new LinkedHashSet<>(names); } } /** * Обёртка ответа, возвращаемая клиенту. * Содержит статус, данные (имена), и метку времени. */ public class DiscordResponseWrapper { private String status; private Set<String> data; private LocalDateTime timestamp; public DiscordResponseWrapper(String status, Set<String> data, LocalDateTime timestamp) { this.status = status; this.data = data; this.timestamp = timestamp; } } /** * DTO-объект, представляющий одного подписчика Discord. * Используется как внутреннее представление данных, полученных из Discord API. */ public class DiscordSubscriber { private String name; private String id; private String email; public DiscordSubscriber(String name, String id, String email) { this.name = name; this.id = id; this.email = email; } public String getName() { return name; } } /** * Симулирует внешний API-клиент для получения списка подписчиков Discord. * В реальной системе будет содержать HTTP-вызовы, авторизацию и парсинг ответов. */ public class DiscordApiClient { public List<DiscordSubscriber> getAllSubscribers() { // Заглушка, имитирующая обращение к Discord API } } /** * Утилитный класс для сбора пользовательских метрик. * В реальной системе может интегрироваться с Prometheus */ public class MetricsCollector { public void collect(String metricName, long value) { System.out.println("[METRIC] " + metricName + ": " + value); } }