From 8ba178f795c771fd84739f4ff5ce65f135ca69ca Mon Sep 17 00:00:00 2001
From: syuilo <syuilotan@yahoo.co.jp>
Date: Thu, 23 Aug 2018 03:19:57 +0900
Subject: [PATCH] =?UTF-8?q?=E3=82=B3=E3=83=B3=E3=83=88=E3=83=AD=E3=83=BC?=
 =?UTF-8?q?=E3=83=AB=E3=83=91=E3=83=8D=E3=83=AB=E3=81=8B=E3=82=89=E6=8B=9B?=
 =?UTF-8?q?=E5=BE=85=E5=88=B6=E3=81=AE=E3=82=AA=E3=83=B3=E3=82=AA=E3=83=95?=
 =?UTF-8?q?=E3=82=92=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E3=82=89=E3=82=8C?=
 =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../views/pages/admin/admin.dashboard.vue     | 14 +++++++
 src/server/api/endpoints/admin/update-meta.ts | 37 +++++++++++++++++++
 2 files changed, 51 insertions(+)
 create mode 100644 src/server/api/endpoints/admin/update-meta.ts

diff --git a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue
index 3567585cb8..e0d23331b8 100644
--- a/src/client/app/desktop/views/pages/admin/admin.dashboard.vue
+++ b/src/client/app/desktop/views/pages/admin/admin.dashboard.vue
@@ -11,6 +11,10 @@
 		<x-cpu-memory :connection="connection"/>
 	</div>
 	<div>
+		<label>
+			<input type="checkbox" v-model="disableRegistration" @change="updateMeta">
+			<span>disableRegistration</span>
+		</label>
 		<button class="ui" @click="invite">%i18n:@invite%</button>
 		<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
 	</div>
@@ -28,6 +32,7 @@ export default Vue.extend({
 	data() {
 		return {
 			stats: null,
+			disableRegistration: false,
 			inviteCode: null,
 			connection: null,
 			connectionId: null
@@ -37,6 +42,10 @@ export default Vue.extend({
 		this.connection = (this as any).os.streams.serverStatsStream.getConnection();
 		this.connectionId = (this as any).os.streams.serverStatsStream.use();
 
+		(this as any).os.getMeta().then(meta => {
+			this.disableRegistration = meta.disableRegistration;
+		});
+
 		(this as any).api('stats').then(stats => {
 			this.stats = stats;
 		});
@@ -49,6 +58,11 @@ export default Vue.extend({
 			(this as any).api('admin/invite').then(x => {
 				this.inviteCode = x.code;
 			});
+		},
+		updateMeta() {
+			(this as any).api('admin/update-meta', {
+				disableRegistration: this.disableRegistration
+			});
 		}
 	}
 });
diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts
new file mode 100644
index 0000000000..bfcab9d6a6
--- /dev/null
+++ b/src/server/api/endpoints/admin/update-meta.ts
@@ -0,0 +1,37 @@
+import $ from 'cafy';
+import Meta from '../../../../models/meta';
+import getParams from '../../get-params';
+
+export const meta = {
+	desc: {
+		ja: 'インスタンスの設定を更新します。'
+	},
+
+	requireCredential: true,
+	requireAdmin: true,
+
+	params: {
+		disableRegistration: $.bool.optional.nullable.note({
+			desc: {
+				ja: '招待制か否か'
+			}
+		}),
+	}
+};
+
+export default (params: any) => new Promise(async (res, rej) => {
+	const [ps, psErr] = getParams(meta, params);
+	if (psErr) return rej(psErr);
+
+	const set = {} as any;
+
+	if (ps.disableRegistration === true || ps.disableRegistration === false) {
+		set.disableRegistration = ps.disableRegistration;
+	}
+
+	await Meta.update({}, {
+		$set: set
+	}, { upsert: true });
+
+	res();
+});