Handle ghost users in user retrieval logic

bug/appear-ghost-user-in-posts
John Niang 2025-09-09 15:56:27 +08:00
parent bdbbbdf3af
commit 0b275dfe81
No known key found for this signature in database
GPG Key ID: D7363C015BBCAA59
2 changed files with 31 additions and 3 deletions

View File

@ -105,7 +105,15 @@ public class UserServiceImpl implements UserService {
var options = ListOptions.builder() var options = ListOptions.builder()
.andQuery(QueryFactory.in("metadata.name", nameSet)) .andQuery(QueryFactory.in("metadata.name", nameSet))
.build(); .build();
return client.listAll(User.class, options, defaultSort()); return client.listAll(User.class, options, defaultSort())
.collectMap(u -> u.getMetadata().getName())
.map(map -> {
var ghost = map.get(GHOST_USER_NAME);
return names.stream()
.map(name -> map.getOrDefault(name, ghost))
.toList();
})
.flatMapMany(Flux::fromIterable);
} }
@Override @Override

View File

@ -22,6 +22,7 @@ import static org.mockito.Mockito.when;
import static run.halo.app.extension.GroupVersionKind.fromExtension; import static run.halo.app.extension.GroupVersionKind.fromExtension;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Set; import java.util.Set;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
@ -46,6 +47,7 @@ import run.halo.app.core.user.service.RoleService;
import run.halo.app.core.user.service.SignUpData; import run.halo.app.core.user.service.SignUpData;
import run.halo.app.core.user.service.UserPostCreatingHandler; import run.halo.app.core.user.service.UserPostCreatingHandler;
import run.halo.app.core.user.service.UserPreCreatingHandler; import run.halo.app.core.user.service.UserPreCreatingHandler;
import run.halo.app.core.user.service.UserService;
import run.halo.app.event.user.PasswordChangedEvent; import run.halo.app.event.user.PasswordChangedEvent;
import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListOptions;
import run.halo.app.extension.Metadata; import run.halo.app.extension.Metadata;
@ -108,6 +110,19 @@ class UserServiceImplTest {
verify(client, times(1)).get(eq(User.class), eq("faker")); verify(client, times(1)).get(eq(User.class), eq("faker"));
} }
@Test
void shouldGetGhostsIfUsersContainDeleted() {
var fakeUser1 = createUser("fake-user1", "fake-password");
var fakeUser2 = createUser("fake-user2", "fake-password");
var ghost = createUser(UserService.GHOST_USER_NAME, "fake-password");
when(client.listAll(eq(User.class), any(ListOptions.class), any(Sort.class)))
.thenReturn(Flux.just(fakeUser1, fakeUser2, ghost));
userService.getUsersOrGhosts(List.of("fake-user1", "deleted-user", "fake-user2"))
.as(StepVerifier::create)
.expectNext(fakeUser1, ghost, fakeUser2)
.verifyComplete();
}
@Test @Test
void shouldUpdatePasswordIfUserFoundInExtension() { void shouldUpdatePasswordIfUserFoundInExtension() {
var fakeUser = new User(); var fakeUser = new User();
@ -228,16 +243,20 @@ class UserServiceImplTest {
} }
User createUser(String password) { User createUser(String username, String password) {
var user = new User(); var user = new User();
Metadata metadata = new Metadata(); Metadata metadata = new Metadata();
metadata.setName("fake-user"); metadata.setName(username);
user.setMetadata(metadata); user.setMetadata(metadata);
user.setSpec(new User.UserSpec()); user.setSpec(new User.UserSpec());
user.getSpec().setPassword(password); user.getSpec().setPassword(password);
return user; return user;
} }
User createUser(String password) {
return createUser("fake-user", password);
}
@Nested @Nested
class GrantRolesTest { class GrantRolesTest {
@ -496,4 +515,5 @@ class UserServiceImplTest {
.expectNext(true) .expectNext(true)
.verifyComplete(); .verifyComplete();
} }
} }