From bc1698e755cbfa33257360f5bdff781e8ecef517 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 9 Feb 2017 00:11:16 +0900
Subject: [PATCH] nanka iroiro

---
 src/api/endpoints.ts                          |  1 +
 src/api/endpoints/i/authorized_apps.js        | 60 +++++++++++++++++++
 src/web/app/common/tags/authorized-apps.tag   | 34 +++++++++++
 src/web/app/common/tags/index.js              |  1 +
 src/web/app/desktop/tags/settings.tag         |  5 ++
 src/web/app/mobile/router.ls                  |  3 +
 src/web/app/mobile/tags/index.js              |  1 +
 src/web/app/mobile/tags/page/settings.tag     |  1 +
 .../tags/page/settings/authorized-apps.tag    | 16 +++++
 9 files changed, 122 insertions(+)
 create mode 100644 src/api/endpoints/i/authorized_apps.js
 create mode 100644 src/web/app/common/tags/authorized-apps.tag
 create mode 100644 src/web/app/mobile/tags/page/settings/authorized-apps.tag

diff --git a/src/api/endpoints.ts b/src/api/endpoints.ts
index ad45f42bc..e4abc06f5 100644
--- a/src/api/endpoints.ts
+++ b/src/api/endpoints.ts
@@ -46,6 +46,7 @@ export default [
 	{ name: 'i/appdata/get',    shouldBeSignin: true },
 	{ name: 'i/appdata/set',    shouldBeSignin: true },
 	{ name: 'i/signin_history', shouldBeSignin: true, kind: 'account-read' },
+	{ name: 'i/authorized_apps', shouldBeSignin: true, secure: true },
 
 	{ name: 'i/notifications',                shouldBeSignin: true, kind: 'notification-read' },
 	{ name: 'notifications/delete',           shouldBeSignin: true, kind: 'notification-write' },
diff --git a/src/api/endpoints/i/authorized_apps.js b/src/api/endpoints/i/authorized_apps.js
new file mode 100644
index 000000000..17f971af2
--- /dev/null
+++ b/src/api/endpoints/i/authorized_apps.js
@@ -0,0 +1,60 @@
+'use strict';
+
+/**
+ * Module dependencies
+ */
+import * as mongo from 'mongodb';
+import AccessToken from '../../models/access-token';
+import App from '../../models/app';
+import serialize from '../../serializers/app';
+
+/**
+ * Get authorized apps of my account
+ *
+ * @param {Object} params
+ * @param {Object} user
+ * @return {Promise<object>}
+ */
+module.exports = (params, user) =>
+	new Promise(async (res, rej) =>
+{
+	// Get 'limit' parameter
+	let limit = params.limit;
+	if (limit !== undefined && limit !== null) {
+		limit = parseInt(limit, 10);
+
+		// From 1 to 100
+		if (!(1 <= limit && limit <= 100)) {
+			return rej('invalid limit range');
+		}
+	} else {
+		limit = 10;
+	}
+
+	// Get 'offset' parameter
+	let offset = params.offset;
+	if (offset !== undefined && offset !== null) {
+		offset = parseInt(offset, 10);
+	} else {
+		offset = 0;
+	}
+
+	// Get 'sort' parameter
+	let sort = params.sort || 'desc';
+
+	// Get tokens
+	const tokens = await AccessToken
+		.find({
+			user_id: user._id
+		}, {
+			limit: limit,
+			skip: offset,
+			sort: {
+				_id: sort == 'asc' ? 1 : -1
+			}
+		});
+
+	// Serialize
+	res(await Promise.all(tokens.map(async token =>
+		await serialize(token.app_id))));
+});
diff --git a/src/web/app/common/tags/authorized-apps.tag b/src/web/app/common/tags/authorized-apps.tag
new file mode 100644
index 000000000..aedfc78fd
--- /dev/null
+++ b/src/web/app/common/tags/authorized-apps.tag
@@ -0,0 +1,34 @@
+<mk-authorized-apps>
+	<p class="none" if={ apps.length == 0 }>連携しているアプリケーションはありません。</p>
+	<div class="apps" if={ apps.length != 0 }>
+		<div each={ apps }>
+			<p><b>{ app.name }</b></p>
+			<p>{ app.description }</p>
+		</div>
+	</div>
+	<style type="stylus">
+		:scope
+			display block
+
+			> .apps
+				> div
+					padding 16px 0 0 0
+					border-bottom solid 1px #eee
+
+	</style>
+	<script>
+		@mixin \api
+
+		@apps = []
+		@fetching = true
+
+		@on \mount ~>
+			@api \i/authorized_apps
+			.then (apps) ~>
+				@apps = apps
+				@fetching = false
+				@update!
+			.catch (err) ~>
+				console.error err
+	</script>
+</mk-authorized-apps>
diff --git a/src/web/app/common/tags/index.js b/src/web/app/common/tags/index.js
index a27dc1198..ef61d51ba 100644
--- a/src/web/app/common/tags/index.js
+++ b/src/web/app/common/tags/index.js
@@ -17,3 +17,4 @@ require('./copyright.tag');
 require('./signin-history.tag');
 require('./api-info.tag');
 require('./twitter-setting.tag');
+require('./authorized-apps.tag');
diff --git a/src/web/app/desktop/tags/settings.tag b/src/web/app/desktop/tags/settings.tag
index f446440dc..3f8f759b4 100644
--- a/src/web/app/desktop/tags/settings.tag
+++ b/src/web/app/desktop/tags/settings.tag
@@ -63,6 +63,11 @@
 			</label>
 		</section>
 
+		<section class="apps" show={ page == 'apps' }>
+			<h1>アプリケーション</h1>
+			<mk-authorized-apps></mk-authorized-apps>
+		</section>
+
 		<section class="twitter" show={ page == 'twitter' }>
 			<h1>Twitter</h1>
 			<mk-twitter-setting></mk-twitter-setting>
diff --git a/src/web/app/mobile/router.ls b/src/web/app/mobile/router.ls
index 500f19e9a..ae68f2177 100644
--- a/src/web/app/mobile/router.ls
+++ b/src/web/app/mobile/router.ls
@@ -19,6 +19,7 @@ module.exports = (me) ~>
 	route \/i/settings/signin-history settings-signin
 	route \/i/settings/api settings-api
 	route \/i/settings/twitter settings-twitter
+	route \/i/settings/authorized-apps settings-authorized-apps
 	route \/post/new new-post
 	route \/post::post post
 	route \/search::query search
@@ -61,6 +62,8 @@ module.exports = (me) ~>
 		mount document.create-element \mk-api-info-page
 	function settings-twitter
 		mount document.create-element \mk-twitter-setting-page
+	function settings-authorized-apps
+		mount document.create-element \mk-authorized-apps-page
 
 	# 検索
 	function search ctx
diff --git a/src/web/app/mobile/tags/index.js b/src/web/app/mobile/tags/index.js
index eb0f10cf7..a4374d4e1 100644
--- a/src/web/app/mobile/tags/index.js
+++ b/src/web/app/mobile/tags/index.js
@@ -17,6 +17,7 @@ require('./page/search.tag');
 require('./page/settings.tag');
 require('./page/settings/signin.tag');
 require('./page/settings/api.tag');
+require('./page/settings/authorized-apps.tag');
 require('./page/settings/twitter.tag');
 require('./home.tag');
 require('./home-timeline.tag');
diff --git a/src/web/app/mobile/tags/page/settings.tag b/src/web/app/mobile/tags/page/settings.tag
index 77bf36dbb..18f03b303 100644
--- a/src/web/app/mobile/tags/page/settings.tag
+++ b/src/web/app/mobile/tags/page/settings.tag
@@ -2,6 +2,7 @@
 	<mk-ui ref="ui">
 		<ul>
 			<li><a><i class="fa fa-user"></i>プロフィール</a></li>
+			<li><a href="./settings/authorized-apps"><i class="fa fa-puzzle-piece"></i>アプリケーション</a></li>
 			<li><a href="./settings/twitter"><i class="fa fa-twitter"></i>Twitter連携</a></li>
 			<li><a href="./settings/signin-history"><i class="fa fa-sign-in"></i>ログイン履歴</a></li>
 			<li><a href="./settings/api"><i class="fa fa-key"></i>API</a></li>
diff --git a/src/web/app/mobile/tags/page/settings/authorized-apps.tag b/src/web/app/mobile/tags/page/settings/authorized-apps.tag
new file mode 100644
index 000000000..a1385c493
--- /dev/null
+++ b/src/web/app/mobile/tags/page/settings/authorized-apps.tag
@@ -0,0 +1,16 @@
+<mk-authorized-apps-page>
+	<mk-ui ref="ui">
+		<mk-authorized-apps></mk-authorized-apps>
+	</mk-ui>
+	<style type="stylus">
+		:scope
+			display block
+	</style>
+	<script>
+		@mixin \ui
+
+		@on \mount ~>
+			document.title = 'Misskey | アプリケーション'
+			@ui.trigger \title '<i class="fa fa-puzzle-piece"></i>アプリケーション'
+	</script>
+</mk-authorized-apps-page>