summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-06-14 17:30:17 +0000
committerHazelnoot <acomputerdog@gmail.com>2025-06-14 17:30:17 +0000
commitf6964f6e27d91a7f172bf3cca6f48074d9cca26d (patch)
tree2cad26ff1cff8e98f67ff0ec22b2cd51896f35af
parentmerge: Don't unfollow suspended users (!1122) (diff)
parentfix TS errors (diff)
downloadsharkey-f6964f6e27d91a7f172bf3cca6f48074d9cca26d.tar.gz
sharkey-f6964f6e27d91a7f172bf3cca6f48074d9cca26d.tar.bz2
sharkey-f6964f6e27d91a7f172bf3cca6f48074d9cca26d.zip
merge: Show signup reason in user admin screen (resolves #1090) (!1114)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1114 Closes #1090 Approved-by: dakkar <dakkar@thenautilus.net> Approved-by: Marie <github@yuugi.dev>
-rw-r--r--locales/index.d.ts4
-rw-r--r--packages/backend/src/core/WebhookTestService.ts4
-rw-r--r--packages/backend/src/models/json-schema/user.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-user.ts4
-rw-r--r--packages/backend/test/utils.ts2
-rw-r--r--packages/frontend/src/components/SkApprovalUser.vue2
-rw-r--r--packages/frontend/src/pages/admin-user.vue5
-rw-r--r--packages/misskey-js/src/autogen/types.ts9
-rw-r--r--sharkey-locales/en-US.yml2
9 files changed, 36 insertions, 16 deletions
diff --git a/locales/index.d.ts b/locales/index.d.ts
index f9fcbdb238..a22a8e893e 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -13257,6 +13257,10 @@ export interface Locale extends ILocale {
* ActivityPub user data in its raw form. These fields are public and accessible to other instances.
*/
"rawApDescription": string;
+ /**
+ * Signup Reason
+ */
+ "signupReason": string;
}
declare const locales: {
[lang: string]: Locale;
diff --git a/packages/backend/src/core/WebhookTestService.ts b/packages/backend/src/core/WebhookTestService.ts
index c4b01d535b..8dc42e45c0 100644
--- a/packages/backend/src/core/WebhookTestService.ts
+++ b/packages/backend/src/core/WebhookTestService.ts
@@ -13,6 +13,7 @@ import { type WebhookEventTypes } from '@/models/Webhook.js';
import { CustomEmojiService } from '@/core/CustomEmojiService.js';
import { type UserWebhookPayload, UserWebhookService } from '@/core/UserWebhookService.js';
import { QueueService } from '@/core/QueueService.js';
+import { IdService } from '@/core/IdService.js';
import { ModeratorInactivityRemainingTime } from '@/queue/processors/CheckModeratorsActivityProcessorService.js';
const oneDayMillis = 24 * 60 * 60 * 1000;
@@ -166,6 +167,7 @@ export class WebhookTestService {
private userWebhookService: UserWebhookService,
private systemWebhookService: SystemWebhookService,
private queueService: QueueService,
+ private readonly idService: IdService,
) {
}
@@ -449,6 +451,8 @@ export class WebhookTestService {
offsetX: it.offsetX,
offsetY: it.offsetY,
})),
+ createdAt: this.idService.parse(user.id).date.toISOString(),
+ description: '',
isBot: user.isBot,
isCat: user.isCat,
emojis: await this.customEmojiService.populateEmojis(user.emojis, user.host),
diff --git a/packages/backend/src/models/json-schema/user.ts b/packages/backend/src/models/json-schema/user.ts
index 2e5364f404..1678cab067 100644
--- a/packages/backend/src/models/json-schema/user.ts
+++ b/packages/backend/src/models/json-schema/user.ts
@@ -73,6 +73,16 @@ export const packedUserLiteSchema = {
type: 'string',
nullable: true, optional: false,
},
+ description: {
+ type: 'string',
+ nullable: true, optional: false,
+ example: 'Hi masters, I am Ai!',
+ },
+ createdAt: {
+ type: 'string',
+ nullable: false, optional: false,
+ format: 'date-time',
+ },
avatarDecorations: {
type: 'array',
nullable: false, optional: false,
@@ -278,11 +288,6 @@ export const packedUserDetailedNotMeOnlySchema = {
nullable: false, optional: false,
},
},
- createdAt: {
- type: 'string',
- nullable: false, optional: false,
- format: 'date-time',
- },
updatedAt: {
type: 'string',
nullable: true, optional: false,
@@ -324,11 +329,6 @@ export const packedUserDetailedNotMeOnlySchema = {
nullable: false, optional: false,
example: false,
},
- description: {
- type: 'string',
- nullable: true, optional: false,
- example: 'Hi masters, I am Ai!',
- },
location: {
type: 'string',
nullable: true, optional: false,
diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts
index 6a77fc177f..6f0081f1f7 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts
@@ -221,6 +221,10 @@ export const meta = {
},
},
},
+ signupReason: {
+ type: 'string',
+ optional: false, nullable: true,
+ },
},
},
} as const;
diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts
index 5da5353e09..52cfb8ac93 100644
--- a/packages/backend/test/utils.ts
+++ b/packages/backend/test/utils.ts
@@ -652,7 +652,7 @@ export async function sendEnvResetRequest() {
// 与えられた値を強制的にエラーとみなす。この関数は型安全性を破壊するため、異常系のアサーション以外で用いられるべきではない。
// FIXME(misskey-js): misskey-jsがエラー情報を公開するようになったらこの関数を廃止する
-export function castAsError(obj: Record<string, unknown>): { error: ApiError } {
+export function castAsError(obj: object | null | undefined): { error: ApiError } {
return obj as { error: ApiError };
}
diff --git a/packages/frontend/src/components/SkApprovalUser.vue b/packages/frontend/src/components/SkApprovalUser.vue
index 310d044387..3f5bd345f2 100644
--- a/packages/frontend/src/components/SkApprovalUser.vue
+++ b/packages/frontend/src/components/SkApprovalUser.vue
@@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<div>{{ email }}</div>
</div>
<div>
- <div :class="$style.label">Reason</div>
+ <div :class="$style.label">{{ i18n.ts.signupReason }}</div>
<div>{{ reason }}</div>
</div>
</div>
diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue
index 840eff77dd..dc29ae2f80 100644
--- a/packages/frontend/src/pages/admin-user.vue
+++ b/packages/frontend/src/pages/admin-user.vue
@@ -130,6 +130,11 @@ SPDX-License-Identifier: AGPL-3.0-only
</div>
</FormSection>
+ <FormSection v-else-if="info.signupReason">
+ <template #label>{{ i18n.ts.signupReason }}</template>
+ {{ info.signupReason }}
+ </FormSection>
+
<FormSection v-if="!isSystem && user && iAmModerator">
<div class="_gaps">
<MkSwitch v-model="silenced" @update:modelValue="toggleSilence">{{ i18n.ts.silence }}</MkSwitch>
diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts
index 6cb52fcbea..8debdec9c1 100644
--- a/packages/misskey-js/src/autogen/types.ts
+++ b/packages/misskey-js/src/autogen/types.ts
@@ -4246,6 +4246,10 @@ export type components = {
/** Format: url */
avatarUrl: string | null;
avatarBlurhash: string | null;
+ /** @example Hi masters, I am Ai! */
+ description: string | null;
+ /** Format: date-time */
+ createdAt: string;
avatarDecorations: {
/** Format: id */
id: string;
@@ -4304,8 +4308,6 @@ export type components = {
movedTo: string | null;
alsoKnownAs: string[] | null;
/** Format: date-time */
- createdAt: string;
- /** Format: date-time */
updatedAt: string | null;
/** Format: date-time */
lastFetchedAt: string | null;
@@ -4319,8 +4321,6 @@ export type components = {
isSilenced: boolean;
/** @example false */
isSuspended: boolean;
- /** @example Hi masters, I am Ai! */
- description: string | null;
location: string | null;
/** @example 2018-03-12 */
birthday: string | null;
@@ -11236,6 +11236,7 @@ export type operations = {
remoteFollowing: number;
remoteFollowers: number;
};
+ signupReason: string | null;
};
};
};
diff --git a/sharkey-locales/en-US.yml b/sharkey-locales/en-US.yml
index 5ea562d262..3f5c82f2dc 100644
--- a/sharkey-locales/en-US.yml
+++ b/sharkey-locales/en-US.yml
@@ -628,3 +628,5 @@ noteFooterLabel: "Note controls"
rawUserDescription: "Packed user data in its raw form. Most of these fields are public and visible to all users."
rawInfoDescription: "Extended user data in its raw form. These fields are private and can only be accessed by moderators."
rawApDescription: "ActivityPub user data in its raw form. These fields are public and accessible to other instances."
+
+signupReason: "Signup Reason"