From d0a346ed8ab3fd879d0e1d2635df0b77a9b0bc05 Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Fri, 25 Mar 2022 01:50:28 +0900
Subject: [PATCH] refactor: separate meta api for admin or not

---
 .../src/server/api/endpoints/admin/meta.ts    | 401 ++++++++++++++++++
 .../backend/src/server/api/endpoints/meta.ts  | 184 --------
 .../client/src/pages/admin/bot-protection.vue |   2 +-
 .../client/src/pages/admin/email-settings.vue |   2 +-
 .../client/src/pages/admin/instance-block.vue |   2 +-
 .../src/pages/admin/integrations.discord.vue  |   2 +-
 .../src/pages/admin/integrations.github.vue   |   2 +-
 .../src/pages/admin/integrations.twitter.vue  |   2 +-
 .../client/src/pages/admin/integrations.vue   |   2 +-
 .../client/src/pages/admin/object-storage.vue |   2 +-
 .../client/src/pages/admin/other-settings.vue |   2 +-
 .../client/src/pages/admin/proxy-account.vue  |   2 +-
 packages/client/src/pages/admin/security.vue  |   2 +-
 packages/client/src/pages/admin/settings.vue  |   2 +-
 14 files changed, 413 insertions(+), 196 deletions(-)
 create mode 100644 packages/backend/src/server/api/endpoints/admin/meta.ts

diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
new file mode 100644
index 0000000000..8d50486ef6
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -0,0 +1,401 @@
+import config from '@/config/index.js';
+import define from '../../define.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
+import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
+
+export const meta = {
+	tags: ['meta'],
+
+	requireCredential: true,
+	requireAdmin: true,
+
+	res: {
+		type: 'object',
+		optional: false, nullable: false,
+		properties: {
+			driveCapacityPerLocalUserMb: {
+				type: 'number',
+				optional: false, nullable: false,
+			},
+			driveCapacityPerRemoteUserMb: {
+				type: 'number',
+				optional: false, nullable: false,
+			},
+			cacheRemoteFiles: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			emailRequiredForSignup: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			enableHcaptcha: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			hcaptchaSiteKey: {
+				type: 'string',
+				optional: false, nullable: true,
+			},
+			enableRecaptcha: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			recaptchaSiteKey: {
+				type: 'string',
+				optional: false, nullable: true,
+			},
+			swPublickey: {
+				type: 'string',
+				optional: false, nullable: true,
+			},
+			mascotImageUrl: {
+				type: 'string',
+				optional: false, nullable: false,
+				default: '/assets/ai.png',
+			},
+			bannerUrl: {
+				type: 'string',
+				optional: false, nullable: false,
+			},
+			errorImageUrl: {
+				type: 'string',
+				optional: false, nullable: false,
+				default: 'https://xn--931a.moe/aiart/yubitun.png',
+			},
+			iconUrl: {
+				type: 'string',
+				optional: false, nullable: true,
+			},
+			maxNoteTextLength: {
+				type: 'number',
+				optional: false, nullable: false,
+			},
+			emojis: {
+				type: 'array',
+				optional: false, nullable: false,
+				items: {
+					type: 'object',
+					optional: false, nullable: false,
+					properties: {
+						id: {
+							type: 'string',
+							optional: false, nullable: false,
+							format: 'id',
+						},
+						aliases: {
+							type: 'array',
+							optional: false, nullable: false,
+							items: {
+								type: 'string',
+								optional: false, nullable: false,
+							},
+						},
+						category: {
+							type: 'string',
+							optional: false, nullable: true,
+						},
+						host: {
+							type: 'string',
+							optional: false, nullable: true,
+						},
+						url: {
+							type: 'string',
+							optional: false, nullable: false,
+							format: 'url',
+						},
+					},
+				},
+			},
+			ads: {
+				type: 'array',
+				optional: false, nullable: false,
+				items: {
+					type: 'object',
+					optional: false, nullable: false,
+					properties: {
+						place: {
+							type: 'string',
+							optional: false, nullable: false,
+						},
+						url: {
+							type: 'string',
+							optional: false, nullable: false,
+							format: 'url',
+						},
+						imageUrl: {
+							type: 'string',
+							optional: false, nullable: false,
+							format: 'url',
+						},
+					},
+				},
+			},
+			enableEmail: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			enableTwitterIntegration: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			enableGithubIntegration: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			enableDiscordIntegration: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			enableServiceWorker: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			translatorAvailable: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			proxyAccountName: {
+				type: 'string',
+				optional: false, nullable: true,
+			},
+			userStarForReactionFallback: {
+				type: 'boolean',
+				optional: true, nullable: false,
+			},
+			pinnedUsers: {
+				type: 'array',
+				optional: true, nullable: false,
+				items: {
+					type: 'string',
+					optional: false, nullable: false,
+				},
+			},
+			hiddenTags: {
+				type: 'array',
+				optional: true, nullable: false,
+				items: {
+					type: 'string',
+					optional: false, nullable: false,
+				},
+			},
+			blockedHosts: {
+				type: 'array',
+				optional: true, nullable: false,
+				items: {
+					type: 'string',
+					optional: false, nullable: false,
+				},
+			},
+			hcaptchaSecretKey: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			recaptchaSecretKey: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			proxyAccountId: {
+				type: 'string',
+				optional: true, nullable: true,
+				format: 'id',
+			},
+			twitterConsumerKey: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			twitterConsumerSecret: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			githubClientId: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			githubClientSecret: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			discordClientId: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			discordClientSecret: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			summaryProxy: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			email: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			smtpSecure: {
+				type: 'boolean',
+				optional: true, nullable: false,
+			},
+			smtpHost: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			smtpPort: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			smtpUser: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			smtpPass: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			swPrivateKey: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			useObjectStorage: {
+				type: 'boolean',
+				optional: true, nullable: false,
+			},
+			objectStorageBaseUrl: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			objectStorageBucket: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			objectStoragePrefix: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			objectStorageEndpoint: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			objectStorageRegion: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			objectStoragePort: {
+				type: 'number',
+				optional: true, nullable: true,
+			},
+			objectStorageAccessKey: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			objectStorageSecretKey: {
+				type: 'string',
+				optional: true, nullable: true,
+			},
+			objectStorageUseSSL: {
+				type: 'boolean',
+				optional: true, nullable: false,
+			},
+			objectStorageUseProxy: {
+				type: 'boolean',
+				optional: true, nullable: false,
+			},
+			objectStorageSetPublicRead: {
+				type: 'boolean',
+				optional: true, nullable: false,
+			},
+		},
+	},
+} as const;
+
+export const paramDef = {
+	type: 'object',
+	properties: {
+	},
+	required: [],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps, me) => {
+	const instance = await fetchMeta(true);
+
+	return {
+		maintainerName: instance.maintainerName,
+		maintainerEmail: instance.maintainerEmail,
+		version: config.version,
+		name: instance.name,
+		uri: config.url,
+		description: instance.description,
+		langs: instance.langs,
+		tosUrl: instance.ToSUrl,
+		repositoryUrl: instance.repositoryUrl,
+		feedbackUrl: instance.feedbackUrl,
+		disableRegistration: instance.disableRegistration,
+		disableLocalTimeline: instance.disableLocalTimeline,
+		disableGlobalTimeline: instance.disableGlobalTimeline,
+		driveCapacityPerLocalUserMb: instance.localDriveCapacityMb,
+		driveCapacityPerRemoteUserMb: instance.remoteDriveCapacityMb,
+		emailRequiredForSignup: instance.emailRequiredForSignup,
+		enableHcaptcha: instance.enableHcaptcha,
+		hcaptchaSiteKey: instance.hcaptchaSiteKey,
+		enableRecaptcha: instance.enableRecaptcha,
+		recaptchaSiteKey: instance.recaptchaSiteKey,
+		swPublickey: instance.swPublicKey,
+		themeColor: instance.themeColor,
+		mascotImageUrl: instance.mascotImageUrl,
+		bannerUrl: instance.bannerUrl,
+		errorImageUrl: instance.errorImageUrl,
+		iconUrl: instance.iconUrl,
+		backgroundImageUrl: instance.backgroundImageUrl,
+		logoImageUrl: instance.logoImageUrl,
+		maxNoteTextLength: MAX_NOTE_TEXT_LENGTH, // 後方互換性のため
+		defaultLightTheme: instance.defaultLightTheme,
+		defaultDarkTheme: instance.defaultDarkTheme,
+		enableEmail: instance.enableEmail,
+		enableTwitterIntegration: instance.enableTwitterIntegration,
+		enableGithubIntegration: instance.enableGithubIntegration,
+		enableDiscordIntegration: instance.enableDiscordIntegration,
+		enableServiceWorker: instance.enableServiceWorker,
+		translatorAvailable: instance.deeplAuthKey != null,
+		pinnedPages: instance.pinnedPages,
+		pinnedClipId: instance.pinnedClipId,
+		cacheRemoteFiles: instance.cacheRemoteFiles,
+
+		useStarForReactionFallback: instance.useStarForReactionFallback,
+		pinnedUsers: instance.pinnedUsers,
+		hiddenTags: instance.hiddenTags,
+		blockedHosts: instance.blockedHosts,
+		hcaptchaSecretKey: instance.hcaptchaSecretKey,
+		recaptchaSecretKey: instance.recaptchaSecretKey,
+		proxyAccountId: instance.proxyAccountId,
+		twitterConsumerKey: instance.twitterConsumerKey,
+		twitterConsumerSecret: instance.twitterConsumerSecret,
+		githubClientId: instance.githubClientId,
+		githubClientSecret: instance.githubClientSecret,
+		discordClientId: instance.discordClientId,
+		discordClientSecret: instance.discordClientSecret,
+		summalyProxy: instance.summalyProxy,
+		email: instance.email,
+		smtpSecure: instance.smtpSecure,
+		smtpHost: instance.smtpHost,
+		smtpPort: instance.smtpPort,
+		smtpUser: instance.smtpUser,
+		smtpPass: instance.smtpPass,
+		swPrivateKey: instance.swPrivateKey,
+		useObjectStorage: instance.useObjectStorage,
+		objectStorageBaseUrl: instance.objectStorageBaseUrl,
+		objectStorageBucket: instance.objectStorageBucket,
+		objectStoragePrefix: instance.objectStoragePrefix,
+		objectStorageEndpoint: instance.objectStorageEndpoint,
+		objectStorageRegion: instance.objectStorageRegion,
+		objectStoragePort: instance.objectStoragePort,
+		objectStorageAccessKey: instance.objectStorageAccessKey,
+		objectStorageSecretKey: instance.objectStorageSecretKey,
+		objectStorageUseSSL: instance.objectStorageUseSSL,
+		objectStorageUseProxy: instance.objectStorageUseProxy,
+		objectStorageSetPublicRead: instance.objectStorageSetPublicRead,
+		objectStorageS3ForcePathStyle: instance.objectStorageS3ForcePathStyle,
+		deeplAuthKey: instance.deeplAuthKey,
+		deeplIsPro: instance.deeplIsPro,
+	};
+});
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index 1aff1f63fb..79f20cf710 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -290,151 +290,6 @@ export const meta = {
 					},
 				},
 			},
-			userStarForReactionFallback: {
-				type: 'boolean',
-				optional: true, nullable: false,
-			},
-			pinnedUsers: {
-				type: 'array',
-				optional: true, nullable: false,
-				items: {
-					type: 'string',
-					optional: false, nullable: false,
-				},
-			},
-			hiddenTags: {
-				type: 'array',
-				optional: true, nullable: false,
-				items: {
-					type: 'string',
-					optional: false, nullable: false,
-				},
-			},
-			blockedHosts: {
-				type: 'array',
-				optional: true, nullable: false,
-				items: {
-					type: 'string',
-					optional: false, nullable: false,
-				},
-			},
-			hcaptchaSecretKey: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			recaptchaSecretKey: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			proxyAccountId: {
-				type: 'string',
-				optional: true, nullable: true,
-				format: 'id',
-			},
-			twitterConsumerKey: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			twitterConsumerSecret: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			githubClientId: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			githubClientSecret: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			discordClientId: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			discordClientSecret: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			summaryProxy: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			email: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			smtpSecure: {
-				type: 'boolean',
-				optional: true, nullable: false,
-			},
-			smtpHost: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			smtpPort: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			smtpUser: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			smtpPass: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			swPrivateKey: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			useObjectStorage: {
-				type: 'boolean',
-				optional: true, nullable: false,
-			},
-			objectStorageBaseUrl: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			objectStorageBucket: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			objectStoragePrefix: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			objectStorageEndpoint: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			objectStorageRegion: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			objectStoragePort: {
-				type: 'number',
-				optional: true, nullable: true,
-			},
-			objectStorageAccessKey: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			objectStorageSecretKey: {
-				type: 'string',
-				optional: true, nullable: true,
-			},
-			objectStorageUseSSL: {
-				type: 'boolean',
-				optional: true, nullable: false,
-			},
-			objectStorageUseProxy: {
-				type: 'boolean',
-				optional: true, nullable: false,
-			},
-			objectStorageSetPublicRead: {
-				type: 'boolean',
-				optional: true, nullable: false,
-			},
 		},
 	},
 } as const;
@@ -552,45 +407,6 @@ export default define(meta, paramDef, async (ps, me) => {
 			serviceWorker: instance.enableServiceWorker,
 			miauth: true,
 		};
-
-		if (me && me.isAdmin) {
-			response.useStarForReactionFallback = instance.useStarForReactionFallback;
-			response.pinnedUsers = instance.pinnedUsers;
-			response.hiddenTags = instance.hiddenTags;
-			response.blockedHosts = instance.blockedHosts;
-			response.hcaptchaSecretKey = instance.hcaptchaSecretKey;
-			response.recaptchaSecretKey = instance.recaptchaSecretKey;
-			response.proxyAccountId = instance.proxyAccountId;
-			response.twitterConsumerKey = instance.twitterConsumerKey;
-			response.twitterConsumerSecret = instance.twitterConsumerSecret;
-			response.githubClientId = instance.githubClientId;
-			response.githubClientSecret = instance.githubClientSecret;
-			response.discordClientId = instance.discordClientId;
-			response.discordClientSecret = instance.discordClientSecret;
-			response.summalyProxy = instance.summalyProxy;
-			response.email = instance.email;
-			response.smtpSecure = instance.smtpSecure;
-			response.smtpHost = instance.smtpHost;
-			response.smtpPort = instance.smtpPort;
-			response.smtpUser = instance.smtpUser;
-			response.smtpPass = instance.smtpPass;
-			response.swPrivateKey = instance.swPrivateKey;
-			response.useObjectStorage = instance.useObjectStorage;
-			response.objectStorageBaseUrl = instance.objectStorageBaseUrl;
-			response.objectStorageBucket = instance.objectStorageBucket;
-			response.objectStoragePrefix = instance.objectStoragePrefix;
-			response.objectStorageEndpoint = instance.objectStorageEndpoint;
-			response.objectStorageRegion = instance.objectStorageRegion;
-			response.objectStoragePort = instance.objectStoragePort;
-			response.objectStorageAccessKey = instance.objectStorageAccessKey;
-			response.objectStorageSecretKey = instance.objectStorageSecretKey;
-			response.objectStorageUseSSL = instance.objectStorageUseSSL;
-			response.objectStorageUseProxy = instance.objectStorageUseProxy;
-			response.objectStorageSetPublicRead = instance.objectStorageSetPublicRead;
-			response.objectStorageS3ForcePathStyle = instance.objectStorageS3ForcePathStyle;
-			response.deeplAuthKey = instance.deeplAuthKey;
-			response.deeplIsPro = instance.deeplIsPro;
-		}
 	}
 
 	return response;
diff --git a/packages/client/src/pages/admin/bot-protection.vue b/packages/client/src/pages/admin/bot-protection.vue
index 82ab155317..5e0cdd96a5 100644
--- a/packages/client/src/pages/admin/bot-protection.vue
+++ b/packages/client/src/pages/admin/bot-protection.vue
@@ -84,7 +84,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.enableHcaptcha = meta.enableHcaptcha;
 			this.hcaptchaSiteKey = meta.hcaptchaSiteKey;
 			this.hcaptchaSecretKey = meta.hcaptchaSecretKey;
diff --git a/packages/client/src/pages/admin/email-settings.vue b/packages/client/src/pages/admin/email-settings.vue
index 6491a453ab..7df0b6db1c 100644
--- a/packages/client/src/pages/admin/email-settings.vue
+++ b/packages/client/src/pages/admin/email-settings.vue
@@ -95,7 +95,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.enableEmail = meta.enableEmail;
 			this.email = meta.email;
 			this.smtpSecure = meta.smtpSecure;
diff --git a/packages/client/src/pages/admin/instance-block.vue b/packages/client/src/pages/admin/instance-block.vue
index 6cadc7df39..4cb8dc604e 100644
--- a/packages/client/src/pages/admin/instance-block.vue
+++ b/packages/client/src/pages/admin/instance-block.vue
@@ -42,7 +42,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.blockedHosts = meta.blockedHosts.join('\n');
 		},
 
diff --git a/packages/client/src/pages/admin/integrations.discord.vue b/packages/client/src/pages/admin/integrations.discord.vue
index 8fc340150a..6b50f1b0a9 100644
--- a/packages/client/src/pages/admin/integrations.discord.vue
+++ b/packages/client/src/pages/admin/integrations.discord.vue
@@ -60,7 +60,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.uri = meta.uri;
 			this.enableDiscordIntegration = meta.enableDiscordIntegration;
 			this.discordClientId = meta.discordClientId;
diff --git a/packages/client/src/pages/admin/integrations.github.vue b/packages/client/src/pages/admin/integrations.github.vue
index d9db9c00f1..67f299e1bc 100644
--- a/packages/client/src/pages/admin/integrations.github.vue
+++ b/packages/client/src/pages/admin/integrations.github.vue
@@ -60,7 +60,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.uri = meta.uri;
 			this.enableGithubIntegration = meta.enableGithubIntegration;
 			this.githubClientId = meta.githubClientId;
diff --git a/packages/client/src/pages/admin/integrations.twitter.vue b/packages/client/src/pages/admin/integrations.twitter.vue
index 1f8074535a..a389c71506 100644
--- a/packages/client/src/pages/admin/integrations.twitter.vue
+++ b/packages/client/src/pages/admin/integrations.twitter.vue
@@ -60,7 +60,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.uri = meta.uri;
 			this.enableTwitterIntegration = meta.enableTwitterIntegration;
 			this.twitterConsumerKey = meta.twitterConsumerKey;
diff --git a/packages/client/src/pages/admin/integrations.vue b/packages/client/src/pages/admin/integrations.vue
index 91d03fef31..4db8a9e0a9 100644
--- a/packages/client/src/pages/admin/integrations.vue
+++ b/packages/client/src/pages/admin/integrations.vue
@@ -62,7 +62,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.enableTwitterIntegration = meta.enableTwitterIntegration;
 			this.enableGithubIntegration = meta.enableGithubIntegration;
 			this.enableDiscordIntegration = meta.enableDiscordIntegration;
diff --git a/packages/client/src/pages/admin/object-storage.vue b/packages/client/src/pages/admin/object-storage.vue
index 6c5be220f8..a1ee0761c8 100644
--- a/packages/client/src/pages/admin/object-storage.vue
+++ b/packages/client/src/pages/admin/object-storage.vue
@@ -120,7 +120,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.useObjectStorage = meta.useObjectStorage;
 			this.objectStorageBaseUrl = meta.objectStorageBaseUrl;
 			this.objectStorageBucket = meta.objectStorageBucket;
diff --git a/packages/client/src/pages/admin/other-settings.vue b/packages/client/src/pages/admin/other-settings.vue
index 6b588e88aa..99ea6a5f32 100644
--- a/packages/client/src/pages/admin/other-settings.vue
+++ b/packages/client/src/pages/admin/other-settings.vue
@@ -44,7 +44,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 		},
 		save() {
 			os.apiWithDialog('admin/update-meta', {
diff --git a/packages/client/src/pages/admin/proxy-account.vue b/packages/client/src/pages/admin/proxy-account.vue
index 5c4fbffa0c..00f14a176f 100644
--- a/packages/client/src/pages/admin/proxy-account.vue
+++ b/packages/client/src/pages/admin/proxy-account.vue
@@ -46,7 +46,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.proxyAccountId = meta.proxyAccountId;
 			if (this.proxyAccountId) {
 				this.proxyAccount = await os.api('users/show', { userId: this.proxyAccountId });
diff --git a/packages/client/src/pages/admin/security.vue b/packages/client/src/pages/admin/security.vue
index d069891647..d1c979b3e0 100644
--- a/packages/client/src/pages/admin/security.vue
+++ b/packages/client/src/pages/admin/security.vue
@@ -72,7 +72,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.summalyProxy = meta.summalyProxy;
 			this.enableHcaptcha = meta.enableHcaptcha;
 			this.enableRecaptcha = meta.enableRecaptcha;
diff --git a/packages/client/src/pages/admin/settings.vue b/packages/client/src/pages/admin/settings.vue
index abd73fd98c..f2970d0459 100644
--- a/packages/client/src/pages/admin/settings.vue
+++ b/packages/client/src/pages/admin/settings.vue
@@ -210,7 +210,7 @@ export default defineComponent({
 
 	methods: {
 		async init() {
-			const meta = await os.api('meta', { detail: true });
+			const meta = await os.api('admin/meta');
 			this.name = meta.name;
 			this.description = meta.description;
 			this.tosUrl = meta.tosUrl;