summaryrefslogtreecommitdiff
path: root/src/services/note
diff options
context:
space:
mode:
authorDW <36347199+chocological00@users.noreply.github.com>2020-02-13 09:08:33 -0500
committerGitHub <noreply@github.com>2020-02-13 23:08:33 +0900
commitf40dcbfe136f015f57a7d4f8894ebb5cf0c3ff3d (patch)
tree60ca1f45efffa210229d63ee24abf9ab5a16f314 /src/services/note
parentFix bug (diff)
downloadsharkey-f40dcbfe136f015f57a7d4f8894ebb5cf0c3ff3d.tar.gz
sharkey-f40dcbfe136f015f57a7d4f8894ebb5cf0c3ff3d.tar.bz2
sharkey-f40dcbfe136f015f57a7d4f8894ebb5cf0c3ff3d.zip
Fix for CASCADE DELETE not being federated (#5812)
* Fix for CASCADE DELETE not being federated * Use JOIN to get user * fix typo
Diffstat (limited to 'src/services/note')
-rw-r--r--src/services/note/delete.ts38
1 files changed, 33 insertions, 5 deletions
diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts
index 73cb0f4117..29b9c576da 100644
--- a/src/services/note/delete.ts
+++ b/src/services/note/delete.ts
@@ -20,11 +20,6 @@ import { deliverToFollowers } from '../../remote/activitypub/deliver-manager';
export default async function(user: User, note: Note, quiet = false) {
const deletedAt = new Date();
- await Notes.delete({
- id: note.id,
- userId: user.id
- });
-
if (note.renoteId) {
Notes.decrement({ id: note.renoteId }, 'renoteCount', 1);
Notes.decrement({ id: note.renoteId }, 'score', 1);
@@ -39,6 +34,7 @@ export default async function(user: User, note: Note, quiet = false) {
if (Users.isLocalUser(user)) {
let renote: Note | undefined;
+ // if deletd note is renote
if (note.renoteId && note.text == null && !note.hasPoll && (note.fileIds == null || note.fileIds.length == 0)) {
renote = await Notes.findOne({
id: note.renoteId
@@ -51,6 +47,15 @@ export default async function(user: User, note: Note, quiet = false) {
deliverToFollowers(user, content);
}
+
+ // also deliever delete activity to cascaded notes
+ const cascadingNotes = (await findCascadingNotes(note)).filter(note => !note.localOnly); // filter out local-only notes
+ for (const cascadingNote of cascadingNotes) {
+ if (!cascadingNote.user) continue;
+ if (!Users.isLocalUser(cascadingNote.user)) continue;
+ const content = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${cascadingNote.id}`), cascadingNote.user));
+ deliverToFollowers(cascadingNote.user, content);
+ }
//#endregion
// 統計を更新
@@ -64,4 +69,27 @@ export default async function(user: User, note: Note, quiet = false) {
});
}
}
+
+ await Notes.delete({
+ id: note.id,
+ userId: user.id
+ });
+}
+
+async function findCascadingNotes(note: Note) {
+ const cascadingNotes: Note[] = [];
+
+ const recursive = async (noteId: string) => {
+ const query = Notes.createQueryBuilder('note')
+ .where('note.replyId = :noteId', { noteId })
+ .leftJoinAndSelect('note.user', 'user');
+ const replies = await query.getMany();
+ for (const reply of replies) {
+ cascadingNotes.push(reply);
+ await recursive(reply.id);
+ }
+ };
+ await recursive(note.id);
+
+ return cascadingNotes.filter(note => note.userHost === null); // filter out non-local users
}