From b1865047187bf6fc9d4ad3b56a0d4eb6b2817c2b Mon Sep 17 00:00:00 2001
From: MeiMei <30769358+mei23@users.noreply.github.com>
Date: Wed, 17 Apr 2019 00:45:33 +0900
Subject: [PATCH] =?UTF-8?q?Meta=E3=81=AE=E3=82=A2=E3=82=AF=E3=82=BB?=
 =?UTF-8?q?=E3=82=B9=E3=81=A7=E3=83=88=E3=83=A9=E3=83=B3=E3=82=B6=E3=82=AF?=
 =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E5=BC=B5=E3=82=8B=E3=82=88?=
 =?UTF-8?q?=E3=81=86=E3=81=AB=20(#4720)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* admin/instanceでmetaをキャッシュしないように

* Metaのアクセスにトランザクションをかける
---
 src/client/app/admin/views/instance.vue       |  2 +-
 src/misc/fetch-meta.ts                        | 26 ++++++++++++-------
 src/server/api/endpoints/admin/update-meta.ts | 20 +++++++++-----
 3 files changed, 31 insertions(+), 17 deletions(-)

diff --git a/src/client/app/admin/views/instance.vue b/src/client/app/admin/views/instance.vue
index bc2a5fba85..cca4e5f669 100644
--- a/src/client/app/admin/views/instance.vue
+++ b/src/client/app/admin/views/instance.vue
@@ -195,7 +195,7 @@ export default Vue.extend({
 	},
 
 	created() {
-		this.$root.getMeta().then(meta => {
+		this.$root.getMeta(true).then(meta => {
 			this.maintainerName = meta.maintainerName;
 			this.maintainerEmail = meta.maintainerEmail;
 			this.disableRegistration = meta.disableRegistration;
diff --git a/src/misc/fetch-meta.ts b/src/misc/fetch-meta.ts
index a459f07729..800f0b9e63 100644
--- a/src/misc/fetch-meta.ts
+++ b/src/misc/fetch-meta.ts
@@ -1,13 +1,21 @@
 import { Meta } from '../models/entities/meta';
-import { Metas } from '../models';
+import { getConnection } from 'typeorm';
 
 export default async function(): Promise<Meta> {
-	const meta = await Metas.findOne();
-	if (meta) {
-		return meta;
-	} else {
-		return Metas.save({
-			id: 'x'
-		} as Meta);
-	}
+	return await getConnection().transaction(async transactionalEntityManager => {
+		// バグでレコードが複数出来てしまっている可能性があるので新しいIDを優先する
+		const meta = await transactionalEntityManager.findOne(Meta, {
+			order: {
+				id: 'DESC'
+			}
+		});
+
+		if (meta) {
+			return meta;
+		} else {
+			return await transactionalEntityManager.save(Meta, {
+				id: 'x'
+			}) as Meta;
+		}
+	});
 }
diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts
index e242ac71a1..3c6380acb4 100644
--- a/src/server/api/endpoints/admin/update-meta.ts
+++ b/src/server/api/endpoints/admin/update-meta.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import define from '../../define';
-import { Metas } from '../../../../models';
+import { getConnection } from 'typeorm';
 import { Meta } from '../../../../models/entities/meta';
 
 export const meta = {
@@ -505,11 +505,17 @@ export default define(meta, async (ps) => {
 		set.swPrivateKey = ps.swPrivateKey;
 	}
 
-	const meta = await Metas.findOne();
+	await getConnection().transaction(async transactionalEntityManager => {
+		const meta = await transactionalEntityManager.findOne(Meta, {
+			order: {
+				id: 'DESC'
+			}
+		});
 
-	if (meta) {
-		await Metas.update(meta.id, set);
-	} else {
-		await Metas.save(set);
-	}
+		if (meta) {
+			await transactionalEntityManager.update(Meta, meta.id, set);
+		} else {
+			await transactionalEntityManager.save(Meta, set);
+		}
+	});
 });