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()
.andQuery(QueryFactory.in("metadata.name", nameSet))
.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

View File

@ -22,6 +22,7 @@ import static org.mockito.Mockito.when;
import static run.halo.app.extension.GroupVersionKind.fromExtension;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.junit.jupiter.api.DisplayName;
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.UserPostCreatingHandler;
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.extension.ListOptions;
import run.halo.app.extension.Metadata;
@ -108,6 +110,19 @@ class UserServiceImplTest {
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
void shouldUpdatePasswordIfUserFoundInExtension() {
var fakeUser = new User();
@ -228,16 +243,20 @@ class UserServiceImplTest {
}
User createUser(String password) {
User createUser(String username, String password) {
var user = new User();
Metadata metadata = new Metadata();
metadata.setName("fake-user");
metadata.setName(username);
user.setMetadata(metadata);
user.setSpec(new User.UserSpec());
user.getSpec().setPassword(password);
return user;
}
User createUser(String password) {
return createUser("fake-user", password);
}
@Nested
class GrantRolesTest {
@ -496,4 +515,5 @@ class UserServiceImplTest {
.expectNext(true)
.verifyComplete();
}
}