/* Şirkət digər bizneslər üçün kütləvi bildiriş göndərmə xidməti təqdim edir. Məhsul sahibi istifadəçi üstünlüklərini nəzərə alan bildiriş filtrləmə sisteminin yaradılmasını tapşırdı. ## Təriflər Bildiriş: - bildiriş ID-si - bildiriş növü (EMAIL, SMS, PUSH) - alıcı (istifadəçi ID-si) - mesaj mətni Alıcı istifadəçi üstünlüklərinə sahib ola bilər: - icazə verilən bildiriş kanalları (növlər siyahısı) - bloklanmış göndərənlər (göndərən ID-ləri siyahısı) Göndərilmiş bildirişlərin tarixi: - istifadəçiyə göndərilmiş bildirişlərin siyahısı ## Vacib İstifadəçi parametrləri və göndərilənlər tarixi digər sistem komponentləri tərəfindən təmin edilir. Bu məlumatları almaq üçün müqavilələr dizayn etməlisiniz. Yadda saxlamanın tətbiqi lazım deyil. ## Tapşırıq Bildirişləri filtrləyən sistem yazın ki: - filtr üçün bildirişlər siyahısı və göndərən ID-si alınır - istifadəçinin üstünlüklərinə uyğun olmayan bildirişləri istisna edir - eyni ID-ə malik və eyni istifadəçiyə göndərilən mesajlar daxil olmaqla, son 24 saatda göndərilən mesajlar da daxil olmaqla, təkrarlanan mesajlara qarşı qoruma tətbiq edir - göndərilməyə hazır, filtrlenmiş bildirişlər siyahısını qaytarır. Bildirişlərin göndərilməsi sizin vəzifəniz deyil; başqa bir komanda göndərmə ilə məşğul olacaq. Sizin vəzifəniz yalnız filtrasiya. */ class NotificationFilter { UserSettingsService userSettingsService; NotificationHistoryService notificationHistoryService; public ??? filter(??? senderId, List<???> msgs) { // TODO implement } } interface UserSettingsService { // TODO any functions } interface NotificationHistoryService { // TODO any functions }
AI-dan cavab
sobes.tech Süni İntellekt
java import java.time.Instant; import java.time.Duration; import java.util.*; import java.util.stream.Collectors;
class Notification { String id; NotificationType type; String recipientId; String text;
// Конструктор, геттеры, сеттеры
}
enum NotificationType { EMAIL, SMS, PUSH }
interface UserSettingsService { /** * Возвращает разрешённые каналы уведомлений для пользователя. */ Set<NotificationType> getAllowedChannels(String userId);
/**
* Возвращает список заблокированных отправителей для пользователя.
*/
Set<String> getBlockedSenders(String userId);
}
interface NotificationHistoryService { /** * Возвращает список уведомлений, отправленных пользователю за последние 24 часа. */ List<Notification> getNotificationsLast24h(String userId); }
class NotificationFilter { private final UserSettingsService userSettingsService; private final NotificationHistoryService notificationHistoryService;
public NotificationFilter(UserSettingsService userSettingsService, NotificationHistoryService notificationHistoryService) {
this.userSettingsService = userSettingsService;
this.notificationHistoryService = notificationHistoryService;
}
/**
* Фильтрует список уведомлений по предпочтениям пользователей и исключает дубликаты.
*
* @param senderId id отправителя
* @param msgs список уведомлений для фильтрации
* @return отфильтрованный список уведомлений
*/
public List<Notification> filter(String senderId, List<Notification> msgs) {
// Группируем уведомления по получателям
Map<String, List<Notification>> byRecipient = msgs.stream()
.collect(Collectors.groupingBy(n -> n.recipientId));
List<Notification> result = new ArrayList<>();
for (Map.Entry<String, List<Notification>> entry : byRecipient.entrySet()) {
String userId = entry.getKey();
List<Notification> userNotifications = entry.getValue();
Set<NotificationType> allowedChannels = userSettingsService.getAllowedChannels(userId);
Set<String> blockedSenders = userSettingsService.getBlockedSenders(userId);
// Если отправитель заблокирован, пропускаем все уведомления для этого пользователя
if (blockedSenders.contains(senderId)) {
continue;
}
// Получаем историю уведомлений за последние 24 часа
List<Notification> history = notificationHistoryService.getNotificationsLast24h(userId);
Set<String> recentNotificationIds = history.stream()
.map(n -> n.id)
.collect(Collectors.toSet());
// Для защиты от дубликатов учитываем также текущие уведомления
Set<String> currentNotificationIds = new HashSet<>();
for (Notification n : userNotifications) {
// Фильтрация по разрешённым каналам
if (!allowedChannels.contains(n.type)) {
continue;
}
// Проверка на дубликаты (id + пользователь)
if (recentNotificationIds.contains(n.id) || currentNotificationIds.contains(n.id)) {
continue;
}
currentNotificationIds.add(n.id);
result.add(n);
}
}
return result;
}
}
**Объяснение:**
- Интерфейсы `UserSettingsService` и `NotificationHistoryService` предоставляют методы для получения настроек пользователя и истории уведомлений.
- В методе `filter` уведомления группируются по получателям.
- Для каждого пользователя проверяется, разрешён ли канал уведомления и не заблокирован ли отправитель.
- Исключаются дубликаты, учитывая историю за последние 24 часа и текущие уведомления.
- Возвращается список уведомлений, соответствующих предпочтениям и без дубликатов.