diff --git a/src/models/note.ts b/src/models/note.ts index 6d315db4cf..1dcc70c175 100644 --- a/src/models/note.ts +++ b/src/models/note.ts @@ -5,13 +5,13 @@ import db from '../db/mongodb'; import { IUser, pack as packUser } from './user'; import { pack as packApp } from './app'; import { pack as packChannel } from './channel'; -import Vote, { deletePollVote } from './poll-vote'; +import PollVote, { deletePollVote } from './poll-vote'; import Reaction, { deleteNoteReaction } from './note-reaction'; import { pack as packFile } from './drive-file'; import NoteWatching, { deleteNoteWatching } from './note-watching'; import NoteReaction from './note-reaction'; import Favorite, { deleteFavorite } from './favorite'; -import PollVote from './poll-vote'; +import Notification, { deleteNotification } from './notification'; const Note = db.get('notes'); @@ -123,6 +123,11 @@ export async function deleteNote(note: string | mongo.ObjectID | INote) { await Favorite.find({ noteId: n._id }) ).map(x => deleteFavorite(x))); + // この投稿に対するNotificationをすべて削除 + await Promise.all(( + await Notification.find({ noteId: n._id }) + ).map(x => deleteNotification(x))); + // このNoteを削除 await Note.remove({ _id: n._id @@ -258,7 +263,7 @@ export const pack = async ( // Poll if (meId && _note.poll) { _note.poll = (async (poll) => { - const vote = await Vote + const vote = await PollVote .findOne({ userId: meId, noteId: id diff --git a/src/models/notification.ts b/src/models/notification.ts index d5ca7135b7..76871166a9 100644 --- a/src/models/notification.ts +++ b/src/models/notification.ts @@ -49,6 +49,33 @@ export interface INotification { isRead: Boolean; } +/** + * Notificationを物理削除します + */ +export async function deleteNotification(notification: string | mongo.ObjectID | INotification) { + let n: INotification; + + // Populate + if (mongo.ObjectID.prototype.isPrototypeOf(notification)) { + n = await Notification.findOne({ + _id: notification + }); + } else if (typeof notification === 'string') { + n = await Notification.findOne({ + _id: new mongo.ObjectID(notification) + }); + } else { + n = notification as INotification; + } + + if (n == null) return; + + // このNotificationを削除 + await Notification.remove({ + _id: n._id + }); +} + /** * Pack a notification for API response */ diff --git a/src/models/user.ts b/src/models/user.ts index 686bcc5ec5..56ca0c625f 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -19,6 +19,7 @@ import PollVote, { deletePollVote } from './poll-vote'; import FollowingLog, { deleteFollowingLog } from './following-log'; import FollowedLog, { deleteFollowedLog } from './followed-log'; import SwSubscription, { deleteSwSubscription } from './sw-subscription'; +import Notification, { deleteNotification } from './notification'; const User = db.get('users'); @@ -246,6 +247,16 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) { await SwSubscription.find({ userId: u._id }) ).map(x => deleteSwSubscription(x))); + // このユーザーのNotificationをすべて削除 + await Promise.all(( + await Notification.find({ notifieeId: u._id }) + ).map(x => deleteNotification(x))); + + // このユーザーが原因となったNotificationをすべて削除 + await Promise.all(( + await Notification.find({ notifierId: u._id }) + ).map(x => deleteNotification(x))); + // このユーザーを削除 }