From 37999f4af7ac88e57ae814d64e7e4cb67194fcc6 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Tue, 6 Nov 2018 14:58:20 +0900
Subject: [PATCH] [API] Implement notes/watching/

---
 .../api/endpoints/notes/watching/create.ts    | 44 +++++++++++++++++++
 .../api/endpoints/notes/watching/delete.ts    | 44 +++++++++++++++++++
 src/services/note/unwatch.ts                  |  9 ++++
 3 files changed, 97 insertions(+)
 create mode 100644 src/server/api/endpoints/notes/watching/create.ts
 create mode 100644 src/server/api/endpoints/notes/watching/delete.ts
 create mode 100644 src/services/note/unwatch.ts

diff --git a/src/server/api/endpoints/notes/watching/create.ts b/src/server/api/endpoints/notes/watching/create.ts
new file mode 100644
index 0000000000..7660e651fb
--- /dev/null
+++ b/src/server/api/endpoints/notes/watching/create.ts
@@ -0,0 +1,44 @@
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
+import Note from '../../../../../models/note';
+import define from '../../../define';
+import watch from '../../../../../services/note/watch';
+
+export const meta = {
+	stability: 'stable',
+
+	desc: {
+		'ja-JP': '指定した投稿をウォッチします。',
+		'en-US': 'Watch a note.'
+	},
+
+	requireCredential: true,
+
+	kind: 'account-write',
+
+	params: {
+		noteId: {
+			validator: $.type(ID),
+			transform: transform,
+			desc: {
+				'ja-JP': '対象の投稿のID',
+				'en-US': 'Target note ID.'
+			}
+		}
+	}
+};
+
+export default define(meta, (ps, user) => new Promise(async (res, rej) => {
+	// Get note
+	const note = await Note.findOne({
+		_id: ps.noteId
+	});
+
+	if (note === null) {
+		return rej('note not found');
+	}
+
+	await watch(user._id, note);
+
+	// Send response
+	res();
+}));
diff --git a/src/server/api/endpoints/notes/watching/delete.ts b/src/server/api/endpoints/notes/watching/delete.ts
new file mode 100644
index 0000000000..97804e3bac
--- /dev/null
+++ b/src/server/api/endpoints/notes/watching/delete.ts
@@ -0,0 +1,44 @@
+import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id';
+import Note from '../../../../../models/note';
+import define from '../../../define';
+import unwatch from '../../../../../services/note/unwatch';
+
+export const meta = {
+	stability: 'stable',
+
+	desc: {
+		'ja-JP': '指定した投稿のウォッチを解除します。',
+		'en-US': 'Unwatch a note.'
+	},
+
+	requireCredential: true,
+
+	kind: 'account-write',
+
+	params: {
+		noteId: {
+			validator: $.type(ID),
+			transform: transform,
+			desc: {
+				'ja-JP': '対象の投稿のID',
+				'en-US': 'Target note ID.'
+			}
+		}
+	}
+};
+
+export default define(meta, (ps, user) => new Promise(async (res, rej) => {
+	// Get note
+	const note = await Note.findOne({
+		_id: ps.noteId
+	});
+
+	if (note === null) {
+		return rej('note not found');
+	}
+
+	await unwatch(user._id, note);
+
+	// Send response
+	res();
+}));
diff --git a/src/services/note/unwatch.ts b/src/services/note/unwatch.ts
new file mode 100644
index 0000000000..ef5783231b
--- /dev/null
+++ b/src/services/note/unwatch.ts
@@ -0,0 +1,9 @@
+import * as mongodb from 'mongodb';
+import Watching from '../../models/note-watching';
+
+export default async (me: mongodb.ObjectID, note: object) => {
+	await Watching.remove({
+		noteId: (note as any)._id,
+		userId: me
+	});
+};