add global event "usersUpdated" for bulk user updates
This commit is contained in:
parent
097d3fe39d
commit
01bb4dc541
2 changed files with 74 additions and 26 deletions
|
|
@ -356,6 +356,7 @@ export class CacheService implements OnApplicationShutdown {
|
||||||
// TODO bulk fetcher
|
// TODO bulk fetcher
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.internalEventService.on('usersUpdated', this.onBulkUserEvent);
|
||||||
this.internalEventService.on('userChangeSuspendedState', this.onUserEvent);
|
this.internalEventService.on('userChangeSuspendedState', this.onUserEvent);
|
||||||
this.internalEventService.on('userChangeDeletedState', this.onUserEvent);
|
this.internalEventService.on('userChangeDeletedState', this.onUserEvent);
|
||||||
this.internalEventService.on('remoteUserUpdated', this.onUserEvent);
|
this.internalEventService.on('remoteUserUpdated', this.onUserEvent);
|
||||||
|
|
@ -375,44 +376,89 @@ export class CacheService implements OnApplicationShutdown {
|
||||||
this.internalEventService.on('userListMemberBulkRemoved', this.onListMemberEvent, { ignoreRemote: true });
|
this.internalEventService.on('userListMemberBulkRemoved', this.onListMemberEvent, { ignoreRemote: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
private async onBulkUserEvent<E extends 'usersUpdated'>(body: InternalEventTypes[E], _: E, isLocal: boolean): Promise<void> {
|
||||||
|
if (body.ids.length === 0) return;
|
||||||
|
|
||||||
|
// Update quantum caches
|
||||||
|
if (isLocal) {
|
||||||
|
// Contains IDs of all lists where this user is a member.
|
||||||
|
const userListMemberships = this.listUserMembershipsCache
|
||||||
|
.entries()
|
||||||
|
.filter(e => body.ids.some(id => e[1].has(id)))
|
||||||
|
.map(e => e[0])
|
||||||
|
.toArray();
|
||||||
|
|
||||||
|
await Promise.all([
|
||||||
|
this.userProfileCache.deleteMany(body.ids),
|
||||||
|
this.userMutingsCache.deleteMany(body.ids),
|
||||||
|
this.userMutedCache.deleteMany(body.ids),
|
||||||
|
this.userBlockingCache.deleteMany(body.ids),
|
||||||
|
this.userBlockedCache.deleteMany(body.ids),
|
||||||
|
this.renoteMutingsCache.deleteMany(body.ids),
|
||||||
|
this.userFollowingsCache.deleteMany(body.ids),
|
||||||
|
this.userFollowersCache.deleteMany(body.ids),
|
||||||
|
this.hibernatedUserCache.deleteMany(body.ids),
|
||||||
|
this.threadMutingsCache.deleteMany(body.ids),
|
||||||
|
this.noteMutingsCache.deleteMany(body.ids),
|
||||||
|
this.userListMembershipsCache.deleteMany(body.ids),
|
||||||
|
this.listUserMembershipsCache.deleteMany(userListMemberships),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update other caches
|
||||||
|
const users = await this.usersRepository.findBy({ id: In(body.ids) });
|
||||||
|
for (const id of body.ids) {
|
||||||
|
const user = users.find(u => u.id === id);
|
||||||
|
this.updateMkUserCaches({ id }, user ?? null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async onUserEvent<E extends 'userChangeSuspendedState' | 'userChangeDeletedState' | 'remoteUserUpdated' | 'localUserUpdated'>(body: InternalEventTypes[E], _: E, isLocal: boolean): Promise<void> {
|
private async onUserEvent<E extends 'userChangeSuspendedState' | 'userChangeDeletedState' | 'remoteUserUpdated' | 'localUserUpdated'>(body: InternalEventTypes[E], _: E, isLocal: boolean): Promise<void> {
|
||||||
|
// Update quantum caches
|
||||||
|
if (isLocal) {
|
||||||
|
// Contains IDs of all lists where this user is a member.
|
||||||
|
const userListMemberships = this.listUserMembershipsCache
|
||||||
|
.entries()
|
||||||
|
.filter(e => e[1].has(body.id))
|
||||||
|
.map(e => e[0])
|
||||||
|
.toArray();
|
||||||
|
|
||||||
|
await Promise.all([
|
||||||
|
this.userProfileCache.delete(body.id),
|
||||||
|
this.userMutingsCache.delete(body.id),
|
||||||
|
this.userBlockingCache.delete(body.id),
|
||||||
|
this.userBlockedCache.delete(body.id),
|
||||||
|
this.renoteMutingsCache.delete(body.id),
|
||||||
|
this.userFollowingsCache.delete(body.id),
|
||||||
|
this.userFollowersCache.delete(body.id),
|
||||||
|
this.hibernatedUserCache.delete(body.id),
|
||||||
|
this.threadMutingsCache.delete(body.id),
|
||||||
|
this.noteMutingsCache.delete(body.id),
|
||||||
|
this.userListMembershipsCache.delete(body.id),
|
||||||
|
this.listUserMembershipsCache.deleteMany(userListMemberships),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update other caches
|
||||||
|
const user = await this.usersRepository.findOneBy({ id: body.id });
|
||||||
|
this.updateMkUserCaches(body, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is here purely to help git line up MK's original code with our changes
|
||||||
|
@bindThis
|
||||||
|
private updateMkUserCaches(body: { id: string }, user: MiUser | null): void {
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
const user = await this.usersRepository.findOneBy({ id: body.id });
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
this.userByIdCache.delete(body.id);
|
this.userByIdCache.delete(body.id);
|
||||||
this.localUserByIdCache.delete(body.id);
|
|
||||||
for (const [k, v] of this.uriPersonCache.entries) {
|
for (const [k, v] of this.uriPersonCache.entries) {
|
||||||
if (v.value?.id === body.id) {
|
if (v.value?.id === body.id) {
|
||||||
this.uriPersonCache.delete(k);
|
this.uriPersonCache.delete(k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Contains IDs of all lists where this user is a member.
|
|
||||||
const userListMemberships = this.listUserMembershipsCache
|
|
||||||
.entries()
|
|
||||||
.filter(e => e[1].has(body.id))
|
|
||||||
.map(e => e[0])
|
|
||||||
.toArray();
|
|
||||||
|
|
||||||
if (isLocal) {
|
|
||||||
await Promise.all([
|
|
||||||
this.userProfileCache.delete(body.id),
|
|
||||||
this.userMutingsCache.delete(body.id),
|
|
||||||
this.userBlockingCache.delete(body.id),
|
|
||||||
this.userBlockedCache.delete(body.id),
|
|
||||||
this.renoteMutingsCache.delete(body.id),
|
|
||||||
this.userFollowingsCache.delete(body.id),
|
|
||||||
this.userFollowersCache.delete(body.id),
|
|
||||||
this.hibernatedUserCache.delete(body.id),
|
|
||||||
this.threadMutingsCache.delete(body.id),
|
|
||||||
this.noteMutingsCache.delete(body.id),
|
|
||||||
this.userListMembershipsCache.delete(body.id),
|
|
||||||
this.listUserMembershipsCache.deleteMany(userListMemberships),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
this.userByIdCache.set(user.id, user);
|
this.userByIdCache.set(user.id, user);
|
||||||
for (const [k, v] of this.uriPersonCache.entries) {
|
for (const [k, v] of this.uriPersonCache.entries) {
|
||||||
|
|
@ -665,6 +711,7 @@ export class CacheService implements OnApplicationShutdown {
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public dispose(): void {
|
public dispose(): void {
|
||||||
|
this.internalEventService.off('usersUpdated', this.onBulkUserEvent);
|
||||||
this.internalEventService.off('userChangeSuspendedState', this.onUserEvent);
|
this.internalEventService.off('userChangeSuspendedState', this.onUserEvent);
|
||||||
this.internalEventService.off('userChangeDeletedState', this.onUserEvent);
|
this.internalEventService.off('userChangeDeletedState', this.onUserEvent);
|
||||||
this.internalEventService.off('remoteUserUpdated', this.onUserEvent);
|
this.internalEventService.off('remoteUserUpdated', this.onUserEvent);
|
||||||
|
|
|
||||||
|
|
@ -237,6 +237,7 @@ export interface InternalEventTypes {
|
||||||
userTokenRegenerated: { id: MiUser['id']; oldToken: string; newToken: string; };
|
userTokenRegenerated: { id: MiUser['id']; oldToken: string; newToken: string; };
|
||||||
remoteUserUpdated: { id: MiUser['id']; };
|
remoteUserUpdated: { id: MiUser['id']; };
|
||||||
localUserUpdated: { id: MiUser['id']; };
|
localUserUpdated: { id: MiUser['id']; };
|
||||||
|
usersUpdated: { ids: MiUser['id'][]; };
|
||||||
follow: { followerId: MiUser['id']; followeeId: MiUser['id']; };
|
follow: { followerId: MiUser['id']; followeeId: MiUser['id']; };
|
||||||
unfollow: { followerId: MiUser['id']; followeeId: MiUser['id']; };
|
unfollow: { followerId: MiUser['id']; followeeId: MiUser['id']; };
|
||||||
blockingCreated: { blockerId: MiUser['id']; blockeeId: MiUser['id']; };
|
blockingCreated: { blockerId: MiUser['id']; blockeeId: MiUser['id']; };
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue