From 03c824f89348f39447a2240980b80095eeb34d3a Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 24 Apr 2018 10:08:15 +0900
Subject: [PATCH] wip

---
 src/models/user-list.ts | 40 ++++++++++++++++++++++++++++++++++++++++
 src/models/user.ts      | 15 +++++++++++++++
 2 files changed, 55 insertions(+)
 create mode 100644 src/models/user-list.ts

diff --git a/src/models/user-list.ts b/src/models/user-list.ts
new file mode 100644
index 000000000..66e2afe21
--- /dev/null
+++ b/src/models/user-list.ts
@@ -0,0 +1,40 @@
+import * as mongo from 'mongodb';
+import db from '../db/mongodb';
+
+const UserList = db.get<IUserList>('userList');
+export default UserList;
+
+export interface IUserList {
+	_id: mongo.ObjectID;
+	createdAt: Date;
+	title: string;
+	userId: mongo.ObjectID;
+	userIds: mongo.ObjectID[];
+}
+
+/**
+ * UserListを物理削除します
+ */
+export async function deleteUserList(userList: string | mongo.ObjectID | IUserList) {
+	let u: IUserList;
+
+	// Populate
+	if (mongo.ObjectID.prototype.isPrototypeOf(userList)) {
+		u = await UserList.findOne({
+			_id: userList
+		});
+	} else if (typeof userList === 'string') {
+		u = await UserList.findOne({
+			_id: new mongo.ObjectID(userList)
+		});
+	} else {
+		u = userList as IUserList;
+	}
+
+	if (u == null) return;
+
+	// このUserListを削除
+	await UserList.remove({
+		_id: u._id
+	});
+}
diff --git a/src/models/user.ts b/src/models/user.ts
index ca1ca2893..44f41d22f 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -20,6 +20,7 @@ import FollowingLog, { deleteFollowingLog } from './following-log';
 import FollowedLog, { deleteFollowedLog } from './followed-log';
 import SwSubscription, { deleteSwSubscription } from './sw-subscription';
 import Notification, { deleteNotification } from './notification';
+import UserList, { deleteUserList } from './user-list';
 
 const User = db.get<IUser>('users');
 
@@ -260,6 +261,20 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) {
 		await Notification.find({ notifierId: u._id })
 	).map(x => deleteNotification(x)));
 
+	// このユーザーのUserListをすべて削除
+	await Promise.all((
+		await UserList.find({ userId: u._id })
+	).map(x => deleteUserList(x)));
+
+	// このユーザーの入っているすべてのUserListからこのユーザーを削除
+	await Promise.all((
+		await UserList.find({ userIds: u._id })
+	).map(x =>
+		UserList.update({ _id: x._id }, {
+			$pull: { userIds: u._id }
+		})
+	));
+
 	// このユーザーを削除
 	await User.remove({
 		_id: u._id