refactor: hide essential notifications to prevent accidental disabling (#6972)

#### What type of PR is this?
/kind improvement
/area core
/milestone 2.20.x

#### What this PR does / why we need it:
隐藏关键通知项设置以避免用户意外禁用而无法收到通知

#### Which issue(s) this PR fixes:
Fixes #6967

#### Does this PR introduce a user-facing change?
```release-note
隐藏关键通知项设置以避免用户意外禁用而无法收到通知

```
pull/6981/head v2.20.8
guqing 2024-10-30 14:14:39 +08:00 committed by GitHub
parent 2c4e85f40b
commit 0d1a099223
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 20 additions and 5 deletions

View File

@ -8,6 +8,7 @@ public enum MetadataUtil {
; ;
public static final String SYSTEM_FINALIZER = "system-protection"; public static final String SYSTEM_FINALIZER = "system-protection";
public static final String HIDDEN_LABEL = "halo.run/hidden";
/** /**
* Gets extension metadata labels null safe. * Gets extension metadata labels null safe.

View File

@ -33,7 +33,9 @@ import run.halo.app.core.extension.endpoint.CustomEndpoint;
import run.halo.app.core.extension.notification.NotifierDescriptor; import run.halo.app.core.extension.notification.NotifierDescriptor;
import run.halo.app.core.extension.notification.ReasonType; import run.halo.app.core.extension.notification.ReasonType;
import run.halo.app.extension.Comparators; import run.halo.app.extension.Comparators;
import run.halo.app.extension.ExtensionUtil;
import run.halo.app.extension.GroupVersion; import run.halo.app.extension.GroupVersion;
import run.halo.app.extension.ListOptions;
import run.halo.app.extension.MetadataUtil; import run.halo.app.extension.MetadataUtil;
import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.infra.utils.JsonUtils; import run.halo.app.infra.utils.JsonUtils;
@ -140,7 +142,12 @@ public class UserNotificationPreferencesEndpoint implements CustomEndpoint {
} }
Mono<ReasonTypeNotifierMatrix> listReasonTypeNotifierMatrix(String username) { Mono<ReasonTypeNotifierMatrix> listReasonTypeNotifierMatrix(String username) {
return client.list(ReasonType.class, null, Comparators.defaultComparator()) var listOptions = ListOptions.builder()
.labelSelector()
.notExists(MetadataUtil.HIDDEN_LABEL)
.end()
.build();
return client.listAll(ReasonType.class, listOptions, ExtensionUtil.defaultSort())
.map(ReasonTypeInfo::from) .map(ReasonTypeInfo::from)
.collectList() .collectList()
.flatMap(reasonTypes -> client.list(NotifierDescriptor.class, null, .flatMap(reasonTypes -> client.list(NotifierDescriptor.class, null,

View File

@ -171,7 +171,7 @@ kind: ReasonType
metadata: metadata:
name: email-verification name: email-verification
labels: labels:
halo.run/hide: "true" halo.run/hidden: "true"
spec: spec:
displayName: "邮箱验证" displayName: "邮箱验证"
description: "当你的邮箱被用于注册账户时,会收到一条带有验证码的邮件,你需要点击邮件中的链接来验证邮箱是否属于你。" description: "当你的邮箱被用于注册账户时,会收到一条带有验证码的邮件,你需要点击邮件中的链接来验证邮箱是否属于你。"
@ -191,7 +191,7 @@ kind: ReasonType
metadata: metadata:
name: reset-password-by-email name: reset-password-by-email
labels: labels:
halo.run/hide: "true" halo.run/hidden: "true"
spec: spec:
displayName: "根据邮件地址重置密码" displayName: "根据邮件地址重置密码"
description: "当你通过邮件地址找回密码时,会收到一条带密码重置链接的邮件,你需要点击邮件中的链接来重置密码。" description: "当你通过邮件地址找回密码时,会收到一条带密码重置链接的邮件,你需要点击邮件中的链接来重置密码。"

View File

@ -1,6 +1,8 @@
package run.halo.app.notification.endpoint; package run.halo.app.notification.endpoint;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.assertArg;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -15,6 +17,7 @@ import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import run.halo.app.core.extension.notification.NotifierDescriptor; import run.halo.app.core.extension.notification.NotifierDescriptor;
import run.halo.app.core.extension.notification.ReasonType; import run.halo.app.core.extension.notification.ReasonType;
import run.halo.app.extension.ExtensionUtil;
import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.ReactiveExtensionClient;
import run.halo.app.notification.UserNotificationPreferenceService; import run.halo.app.notification.UserNotificationPreferenceService;
@ -43,11 +46,16 @@ class UserNotificationPreferencesEndpointTest {
webTestClient = WebTestClient webTestClient = WebTestClient
.bindToRouterFunction(userNotificationPreferencesEndpoint.endpoint()) .bindToRouterFunction(userNotificationPreferencesEndpoint.endpoint())
.build(); .build();
when(client.listAll(eq(ReasonType.class), assertArg(option ->
assertThat(option.toString())
.isEqualTo("labelSelector: (halo.run/hidden NOT_EXISTS)")),
eq(ExtensionUtil.defaultSort()))
).thenReturn(Flux.empty());
} }
@Test @Test
void listNotificationPreferences() { void listNotificationPreferences() {
when(client.list(eq(ReasonType.class), eq(null), any())).thenReturn(Flux.empty());
when(client.list(eq(NotifierDescriptor.class), eq(null), any())).thenReturn(Flux.empty()); when(client.list(eq(NotifierDescriptor.class), eq(null), any())).thenReturn(Flux.empty());
when(userNotificationPreferenceService.getByUser(any())).thenReturn(Mono.empty()); when(userNotificationPreferenceService.getByUser(any())).thenReturn(Mono.empty());
webTestClient.post() webTestClient.post()
@ -59,7 +67,6 @@ class UserNotificationPreferencesEndpointTest {
@Test @Test
void saveNotificationPreferences() { void saveNotificationPreferences() {
when(client.list(eq(ReasonType.class), eq(null), any())).thenReturn(Flux.empty());
when(client.list(eq(NotifierDescriptor.class), eq(null), any())).thenReturn(Flux.empty()); when(client.list(eq(NotifierDescriptor.class), eq(null), any())).thenReturn(Flux.empty());
when(userNotificationPreferenceService.getByUser(any())).thenReturn(Mono.empty()); when(userNotificationPreferenceService.getByUser(any())).thenReturn(Mono.empty());
webTestClient.post() webTestClient.post()