View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/415 Approved-by: Marie <marie@kaifa.ch> Approved-by: Amelia Yukii <amelia.yukii@shourai.de>
This commit is contained in:
commit
8b90c6c045
1 changed files with 59 additions and 16 deletions
|
@ -64,21 +64,38 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
packedNotes: Map<MiNote['id'], Packed<'Note'>>;
|
packedNotes: Map<MiNote['id'], Packed<'Note'>>;
|
||||||
packedUsers: Map<MiUser['id'], Packed<'UserLite'>>;
|
packedUsers: Map<MiUser['id'], Packed<'UserLite'>>;
|
||||||
},
|
},
|
||||||
): Promise<Packed<'Notification'>> {
|
): Promise<Packed<'Notification'> | null> {
|
||||||
const notification = src;
|
const notification = src;
|
||||||
const noteIfNeed = NOTE_REQUIRED_NOTIFICATION_TYPES.has(notification.type) && 'noteId' in notification ? (
|
const needsNote = NOTE_REQUIRED_NOTIFICATION_TYPES.has(notification.type) && 'noteId' in notification;
|
||||||
|
const noteIfNeed = needsNote ? (
|
||||||
hint?.packedNotes != null
|
hint?.packedNotes != null
|
||||||
? hint.packedNotes.get(notification.noteId)
|
? hint.packedNotes.get(notification.noteId)
|
||||||
: this.noteEntityService.pack(notification.noteId, { id: meId }, {
|
: this.noteEntityService.pack(notification.noteId, { id: meId }, {
|
||||||
detail: true,
|
detail: true,
|
||||||
})
|
})
|
||||||
) : undefined;
|
) : undefined;
|
||||||
const userIfNeed = 'notifierId' in notification ? (
|
// if the note has been deleted, don't show this notification
|
||||||
|
if (needsNote && !noteIfNeed) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const needsUser = 'notifierId' in notification;
|
||||||
|
const userIfNeed = needsUser ? (
|
||||||
hint?.packedUsers != null
|
hint?.packedUsers != null
|
||||||
? hint.packedUsers.get(notification.notifierId)
|
? hint.packedUsers.get(notification.notifierId)
|
||||||
: this.userEntityService.pack(notification.notifierId, { id: meId })
|
: this.userEntityService.pack(notification.notifierId, { id: meId })
|
||||||
) : undefined;
|
) : undefined;
|
||||||
const role = notification.type === 'roleAssigned' ? await this.roleEntityService.pack(notification.roleId) : undefined;
|
// if the user has been deleted, don't show this notification
|
||||||
|
if (needsUser && !userIfNeed) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const needsRole = notification.type === 'roleAssigned';
|
||||||
|
const role = needsRole ? await this.roleEntityService.pack(notification.roleId) : undefined;
|
||||||
|
// if the role has been deleted, don't show this notification
|
||||||
|
if (needsRole && !role) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: notification.id,
|
id: notification.id,
|
||||||
|
@ -141,10 +158,10 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
validNotifications = validNotifications.filter(x => (x.type !== 'receiveFollowRequest') || reqs.some(r => r.followerId === x.notifierId));
|
validNotifications = validNotifications.filter(x => (x.type !== 'receiveFollowRequest') || reqs.some(r => r.followerId === x.notifierId));
|
||||||
}
|
}
|
||||||
|
|
||||||
return await Promise.all(validNotifications.map(x => this.pack(x, meId, {}, {
|
return (await Promise.all(validNotifications.map(x => this.pack(x, meId, {}, {
|
||||||
packedNotes,
|
packedNotes,
|
||||||
packedUsers,
|
packedUsers,
|
||||||
})));
|
})))).filter(n => n);
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
@ -159,23 +176,34 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
packedNotes: Map<MiNote['id'], Packed<'Note'>>;
|
packedNotes: Map<MiNote['id'], Packed<'Note'>>;
|
||||||
packedUsers: Map<MiUser['id'], Packed<'UserLite'>>;
|
packedUsers: Map<MiUser['id'], Packed<'UserLite'>>;
|
||||||
},
|
},
|
||||||
): Promise<Packed<'Notification'>> {
|
): Promise<Packed<'Notification'> | null> {
|
||||||
const notification = src;
|
const notification = src;
|
||||||
const noteIfNeed = NOTE_REQUIRED_GROUPED_NOTIFICATION_TYPES.has(notification.type) && 'noteId' in notification ? (
|
const needsNote = NOTE_REQUIRED_GROUPED_NOTIFICATION_TYPES.has(notification.type) && 'noteId' in notification;
|
||||||
|
const noteIfNeed = needsNote ? (
|
||||||
hint?.packedNotes != null
|
hint?.packedNotes != null
|
||||||
? hint.packedNotes.get(notification.noteId)
|
? hint.packedNotes.get(notification.noteId)
|
||||||
: this.noteEntityService.pack(notification.noteId, { id: meId }, {
|
: this.noteEntityService.pack(notification.noteId, { id: meId }, {
|
||||||
detail: true,
|
detail: true,
|
||||||
})
|
})
|
||||||
) : undefined;
|
) : undefined;
|
||||||
const userIfNeed = 'notifierId' in notification ? (
|
// if the note has been deleted, don't show this notification
|
||||||
|
if (needsNote && !noteIfNeed) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const needsUser = 'notifierId' in notification;
|
||||||
|
const userIfNeed = needsUser ? (
|
||||||
hint?.packedUsers != null
|
hint?.packedUsers != null
|
||||||
? hint.packedUsers.get(notification.notifierId)
|
? hint.packedUsers.get(notification.notifierId)
|
||||||
: this.userEntityService.pack(notification.notifierId, { id: meId })
|
: this.userEntityService.pack(notification.notifierId, { id: meId })
|
||||||
) : undefined;
|
) : undefined;
|
||||||
|
// if the user has been deleted, don't show this notification
|
||||||
|
if (needsUser && !userIfNeed) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
if (notification.type === 'reaction:grouped') {
|
if (notification.type === 'reaction:grouped') {
|
||||||
const reactions = await Promise.all(notification.reactions.map(async reaction => {
|
const reactions = (await Promise.all(notification.reactions.map(async reaction => {
|
||||||
const user = hint?.packedUsers != null
|
const user = hint?.packedUsers != null
|
||||||
? hint.packedUsers.get(reaction.userId)!
|
? hint.packedUsers.get(reaction.userId)!
|
||||||
: await this.userEntityService.pack(reaction.userId, { id: meId });
|
: await this.userEntityService.pack(reaction.userId, { id: meId });
|
||||||
|
@ -183,7 +211,12 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
user,
|
user,
|
||||||
reaction: reaction.reaction,
|
reaction: reaction.reaction,
|
||||||
};
|
};
|
||||||
}));
|
}))).filter(r => r.user);
|
||||||
|
// if all users have been deleted, don't show this notification
|
||||||
|
if (!reactions.length) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: notification.id,
|
id: notification.id,
|
||||||
createdAt: new Date(notification.createdAt).toISOString(),
|
createdAt: new Date(notification.createdAt).toISOString(),
|
||||||
|
@ -192,14 +225,19 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
reactions,
|
reactions,
|
||||||
});
|
});
|
||||||
} else if (notification.type === 'renote:grouped') {
|
} else if (notification.type === 'renote:grouped') {
|
||||||
const users = await Promise.all(notification.userIds.map(userId => {
|
const users = (await Promise.all(notification.userIds.map(userId => {
|
||||||
const packedUser = hint?.packedUsers != null ? hint.packedUsers.get(userId) : null;
|
const packedUser = hint?.packedUsers != null ? hint.packedUsers.get(userId) : null;
|
||||||
if (packedUser) {
|
if (packedUser) {
|
||||||
return packedUser;
|
return packedUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.userEntityService.pack(userId, { id: meId });
|
return this.userEntityService.pack(userId, { id: meId });
|
||||||
}));
|
}))).filter(u => u);
|
||||||
|
// if all users have been deleted, don't show this notification
|
||||||
|
if (!users.length) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: notification.id,
|
id: notification.id,
|
||||||
createdAt: new Date(notification.createdAt).toISOString(),
|
createdAt: new Date(notification.createdAt).toISOString(),
|
||||||
|
@ -209,7 +247,12 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const role = notification.type === 'roleAssigned' ? await this.roleEntityService.pack(notification.roleId) : undefined;
|
const needsRole = notification.type === 'roleAssigned';
|
||||||
|
const role = needsRole ? await this.roleEntityService.pack(notification.roleId) : undefined;
|
||||||
|
// if the role has been deleted, don't show this notification
|
||||||
|
if (needsRole && !role) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: notification.id,
|
id: notification.id,
|
||||||
|
@ -277,9 +320,9 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
validNotifications = validNotifications.filter(x => (x.type !== 'receiveFollowRequest') || reqs.some(r => r.followerId === x.notifierId));
|
validNotifications = validNotifications.filter(x => (x.type !== 'receiveFollowRequest') || reqs.some(r => r.followerId === x.notifierId));
|
||||||
}
|
}
|
||||||
|
|
||||||
return await Promise.all(validNotifications.map(x => this.packGrouped(x, meId, {}, {
|
return (await Promise.all(validNotifications.map(x => this.packGrouped(x, meId, {}, {
|
||||||
packedNotes,
|
packedNotes,
|
||||||
packedUsers,
|
packedUsers,
|
||||||
})));
|
})))).filter(n => n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue