From 0d272b1fb05c4098c31feb92ade9efa3bdfc9675 Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Fri, 23 Nov 2018 08:13:17 +0900
Subject: [PATCH] Resolve #3376

---
 .config/example.yml                           |  3 ---
 src/client/app/admin/views/instance.vue       |  9 ++++++++-
 src/config/types.ts                           |  2 --
 src/models/meta.ts                            |  2 ++
 src/server/api/endpoints/admin/update-meta.ts | 11 +++++++++++
 src/server/api/endpoints/meta.ts              |  1 +
 src/server/web/url-preview.ts                 |  7 +++++--
 7 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/.config/example.yml b/.config/example.yml
index 3eb5bf0b11..1019f7b44b 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -118,6 +118,3 @@ autoAdmin: true
 
 # Clustering
 #clusterLimit: 1
-
-# Summaly proxy
-#summalyProxy: "http://example.com"
diff --git a/src/client/app/admin/views/instance.vue b/src/client/app/admin/views/instance.vue
index 7252a4c7ea..88738717a4 100644
--- a/src/client/app/admin/views/instance.vue
+++ b/src/client/app/admin/views/instance.vue
@@ -42,6 +42,10 @@
 		<section>
 			<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
 		</section>
+		<section>
+			<header>summaly Proxy</header>
+			<ui-input v-model="summalyProxy">URL</ui-input>
+		</section>
 		<section>
 			<header><fa :icon="faUserPlus"/> {{ $t('user-recommendation-config') }}</header>
 			<ui-switch v-model="enableExternalUserRecommendation">{{ $t('enable-external-user-recommendation') }}</ui-switch>
@@ -138,6 +142,7 @@ export default Vue.extend({
 			enableExternalUserRecommendation: false,
 			externalUserRecommendationEngine: null,
 			externalUserRecommendationTimeout: null,
+			summalyProxy: null,
 			faHeadset, faShieldAlt, faGhost, faUserPlus
 		};
 	},
@@ -170,6 +175,7 @@ export default Vue.extend({
 			this.enableExternalUserRecommendation = meta.enableExternalUserRecommendation;
 			this.externalUserRecommendationEngine = meta.externalUserRecommendationEngine;
 			this.externalUserRecommendationTimeout = meta.externalUserRecommendationTimeout;
+			this.summalyProxy = meta.summalyProxy;
 		});
 	},
 
@@ -214,7 +220,8 @@ export default Vue.extend({
 				discordClientSecret: this.discordClientSecret,
 				enableExternalUserRecommendation: this.enableExternalUserRecommendation,
 				externalUserRecommendationEngine: this.externalUserRecommendationEngine,
-				externalUserRecommendationTimeout: parseInt(this.externalUserRecommendationTimeout, 10)
+				externalUserRecommendationTimeout: parseInt(this.externalUserRecommendationTimeout, 10),
+				summalyProxy: this.summalyProxy
 			}).then(() => {
 				this.$root.alert({
 					type: 'success',
diff --git a/src/config/types.ts b/src/config/types.ts
index f9cb9d8659..a08b90fec3 100644
--- a/src/config/types.ts
+++ b/src/config/types.ts
@@ -37,8 +37,6 @@ export type Source = {
 
 	proxy?: string;
 
-	summalyProxy?: string;
-
 	accesslog?: string;
 
 	github_bot?: {
diff --git a/src/models/meta.ts b/src/models/meta.ts
index c91e66ce2d..99d770366d 100644
--- a/src/models/meta.ts
+++ b/src/models/meta.ts
@@ -197,6 +197,8 @@ export type IMeta = {
 	 */
 	maxNoteTextLength?: number;
 
+	summalyProxy?: string;
+
 	enableTwitterIntegration?: boolean;
 	twitterConsumerKey?: string;
 	twitterConsumerSecret?: string;
diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts
index edbb51e3dc..cff9ff8e52 100644
--- a/src/server/api/endpoints/admin/update-meta.ts
+++ b/src/server/api/endpoints/admin/update-meta.ts
@@ -139,6 +139,13 @@ export const meta = {
 			}
 		},
 
+		summalyProxy: {
+			validator: $.str.optional.nullable,
+			desc: {
+				'ja-JP': 'summalyプロキシURL'
+			}
+		},
+
 		enableTwitterIntegration: {
 			validator: $.bool.optional,
 			desc: {
@@ -300,6 +307,10 @@ export default define(meta, (ps) => new Promise(async (res, rej) => {
 		set.langs = ps.langs;
 	}
 
+	if (ps.summalyProxy !== undefined) {
+		set.summalyProxy = ps.summalyProxy;
+	}
+
 	if (ps.enableTwitterIntegration !== undefined) {
 		set.enableTwitterIntegration = ps.enableTwitterIntegration;
 	}
diff --git a/src/server/api/endpoints/meta.ts b/src/server/api/endpoints/meta.ts
index faee9423d8..49ce41c7da 100644
--- a/src/server/api/endpoints/meta.ts
+++ b/src/server/api/endpoints/meta.ts
@@ -107,6 +107,7 @@ export default define(meta, (ps, me) => new Promise(async (res, rej) => {
 		response.githubClientSecret = instance.githubClientSecret;
 		response.discordClientId = instance.discordClientId;
 		response.discordClientSecret = instance.discordClientSecret;
+		response.summalyProxy = instance.summalyProxy;
 	}
 
 	res(response);
diff --git a/src/server/web/url-preview.ts b/src/server/web/url-preview.ts
index eb835b05ac..7be9a75765 100644
--- a/src/server/web/url-preview.ts
+++ b/src/server/web/url-preview.ts
@@ -2,11 +2,14 @@ import * as Koa from 'koa';
 import * as request from 'request-promise-native';
 import summaly from 'summaly';
 import config from '../../config';
+import fetchMeta from '../../misc/fetch-meta';
 
 module.exports = async (ctx: Koa.Context) => {
+	const meta = await fetchMeta();
+
 	try {
-		const summary = config.summalyProxy ? await request.get({
-			url: config.summalyProxy,
+		const summary = meta.summalyProxy ? await request.get({
+			url: meta.summalyProxy,
 			proxy: config.proxy,
 			qs: {
 				url: ctx.query.url