Resolve #4870
This commit is contained in:
parent
9e20fc5c88
commit
168de3c316
11 changed files with 2 additions and 174 deletions
|
@ -263,7 +263,6 @@ common:
|
||||||
update-available-title: "更新があります"
|
update-available-title: "更新があります"
|
||||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||||
verified-user: "公式アカウント"
|
|
||||||
hide-password: "パスワードを隠す"
|
hide-password: "パスワードを隠す"
|
||||||
show-password: "パスワードを表示する"
|
show-password: "パスワードを表示する"
|
||||||
|
|
||||||
|
@ -339,7 +338,6 @@ auth/views/index.vue:
|
||||||
sign-in: "サインインしてください"
|
sign-in: "サインインしてください"
|
||||||
|
|
||||||
common/views/pages/explore.vue:
|
common/views/pages/explore.vue:
|
||||||
verified-users: "公式アカウント"
|
|
||||||
popular-users: "人気のユーザー"
|
popular-users: "人気のユーザー"
|
||||||
recently-updated-users: "最近投稿したユーザー"
|
recently-updated-users: "最近投稿したユーザー"
|
||||||
recently-registered-users: "新規ユーザー"
|
recently-registered-users: "新規ユーザー"
|
||||||
|
@ -1351,12 +1349,6 @@ admin/views/users.vue:
|
||||||
silence-confirm: "サイレンスしますか?"
|
silence-confirm: "サイレンスしますか?"
|
||||||
unmake-silence: "サイレンスの解除"
|
unmake-silence: "サイレンスの解除"
|
||||||
unsilence-confirm: "サイレンスを解除しますか?"
|
unsilence-confirm: "サイレンスを解除しますか?"
|
||||||
verify: "公式アカウントにする"
|
|
||||||
verify-confirm: "公式アカウントにしますか?"
|
|
||||||
verified: "公式アカウントにしました"
|
|
||||||
unverify: "公式アカウントを解除する"
|
|
||||||
unverify-confirm: "公式アカウントを解除しますか?"
|
|
||||||
unverified: "公式アカウントを解除しました"
|
|
||||||
update-remote-user: "リモートユーザー情報の更新"
|
update-remote-user: "リモートユーザー情報の更新"
|
||||||
remote-user-updated: "リモートユーザー情報を更新しました"
|
remote-user-updated: "リモートユーザー情報を更新しました"
|
||||||
users:
|
users:
|
||||||
|
@ -1373,7 +1365,6 @@ admin/views/users.vue:
|
||||||
admin: "管理者"
|
admin: "管理者"
|
||||||
moderator: "モデレーター"
|
moderator: "モデレーター"
|
||||||
adminOrModerator: "管理者+モデレーター"
|
adminOrModerator: "管理者+モデレーター"
|
||||||
verified: "公式アカウント"
|
|
||||||
silenced: "サイレンス済み"
|
silenced: "サイレンス済み"
|
||||||
suspended: "凍結済み"
|
suspended: "凍結済み"
|
||||||
origin:
|
origin:
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
<span class="username">@{{ user | acct }}</span>
|
<span class="username">@{{ user | acct }}</span>
|
||||||
<span class="is-admin" v-if="user.isAdmin">admin</span>
|
<span class="is-admin" v-if="user.isAdmin">admin</span>
|
||||||
<span class="is-moderator" v-if="user.isModerator">moderator</span>
|
<span class="is-moderator" v-if="user.isModerator">moderator</span>
|
||||||
<span class="is-verified" v-if="user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
|
|
||||||
<span class="is-silenced" v-if="user.isSilenced" :title="$t('@.silenced-user')"><fa :icon="faMicrophoneSlash"/></span>
|
<span class="is-silenced" v-if="user.isSilenced" :title="$t('@.silenced-user')"><fa :icon="faMicrophoneSlash"/></span>
|
||||||
<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
|
<span class="is-suspended" v-if="user.isSuspended" :title="$t('@.suspended-user')"><fa :icon="faSnowflake"/></span>
|
||||||
</header>
|
</header>
|
||||||
|
@ -77,7 +76,6 @@ export default Vue.extend({
|
||||||
background var(--noteHeaderAdminBg)
|
background var(--noteHeaderAdminBg)
|
||||||
color var(--noteHeaderAdminFg)
|
color var(--noteHeaderAdminFg)
|
||||||
|
|
||||||
> .is-verified
|
|
||||||
> .is-silenced
|
> .is-silenced
|
||||||
> .is-suspended
|
> .is-suspended
|
||||||
margin 0 0 0 .5em
|
margin 0 0 0 .5em
|
||||||
|
|
|
@ -12,10 +12,6 @@
|
||||||
<x-user :user='user'/>
|
<x-user :user='user'/>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<ui-button @click="resetPassword"><fa :icon="faKey"/> {{ $t('reset-password') }}</ui-button>
|
<ui-button @click="resetPassword"><fa :icon="faKey"/> {{ $t('reset-password') }}</ui-button>
|
||||||
<ui-horizon-group>
|
|
||||||
<ui-button @click="verifyUser" :disabled="verifying"><fa :icon="faCertificate"/> {{ $t('verify') }}</ui-button>
|
|
||||||
<ui-button @click="unverifyUser" :disabled="unverifying">{{ $t('unverify') }}</ui-button>
|
|
||||||
</ui-horizon-group>
|
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-button @click="silenceUser"><fa :icon="faMicrophoneSlash"/> {{ $t('make-silence') }}</ui-button>
|
<ui-button @click="silenceUser"><fa :icon="faMicrophoneSlash"/> {{ $t('make-silence') }}</ui-button>
|
||||||
<ui-button @click="unsilenceUser">{{ $t('unmake-silence') }}</ui-button>
|
<ui-button @click="unsilenceUser">{{ $t('unmake-silence') }}</ui-button>
|
||||||
|
@ -47,7 +43,6 @@
|
||||||
<option value="all">{{ $t('users.state.all') }}</option>
|
<option value="all">{{ $t('users.state.all') }}</option>
|
||||||
<option value="admin">{{ $t('users.state.admin') }}</option>
|
<option value="admin">{{ $t('users.state.admin') }}</option>
|
||||||
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
<option value="moderator">{{ $t('users.state.moderator') }}</option>
|
||||||
<option value="verified">{{ $t('users.state.verified') }}</option>
|
|
||||||
<option value="silenced">{{ $t('users.state.silenced') }}</option>
|
<option value="silenced">{{ $t('users.state.silenced') }}</option>
|
||||||
<option value="suspended">{{ $t('users.state.suspended') }}</option>
|
<option value="suspended">{{ $t('users.state.suspended') }}</option>
|
||||||
</ui-select>
|
</ui-select>
|
||||||
|
@ -71,7 +66,7 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
import parseAcct from "../../../../misc/acct/parse";
|
import parseAcct from "../../../../misc/acct/parse";
|
||||||
import { faCertificate, faUsers, faTerminal, faSearch, faKey, faSync, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
|
import { faUsers, faTerminal, faSearch, faKey, faSync, faMicrophoneSlash } from '@fortawesome/free-solid-svg-icons';
|
||||||
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
import { faSnowflake } from '@fortawesome/free-regular-svg-icons';
|
||||||
import XUser from './users.user.vue';
|
import XUser from './users.user.vue';
|
||||||
|
|
||||||
|
@ -84,8 +79,6 @@ export default Vue.extend({
|
||||||
return {
|
return {
|
||||||
user: null,
|
user: null,
|
||||||
target: null,
|
target: null,
|
||||||
verifying: false,
|
|
||||||
unverifying: false,
|
|
||||||
suspending: false,
|
suspending: false,
|
||||||
unsuspending: false,
|
unsuspending: false,
|
||||||
sort: '+createdAt',
|
sort: '+createdAt',
|
||||||
|
@ -95,7 +88,7 @@ export default Vue.extend({
|
||||||
offset: 0,
|
offset: 0,
|
||||||
users: [],
|
users: [],
|
||||||
existMore: false,
|
existMore: false,
|
||||||
faTerminal, faCertificate, faUsers, faSnowflake, faSearch, faKey, faSync, faMicrophoneSlash
|
faTerminal, faUsers, faSnowflake, faSearch, faKey, faSync, faMicrophoneSlash
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -181,56 +174,6 @@ export default Vue.extend({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
async verifyUser() {
|
|
||||||
if (!await this.getConfirmed(this.$t('verify-confirm'))) return;
|
|
||||||
|
|
||||||
this.verifying = true;
|
|
||||||
|
|
||||||
const process = async () => {
|
|
||||||
await this.$root.api('admin/verify-user', { userId: this.user.id });
|
|
||||||
this.$root.dialog({
|
|
||||||
type: 'success',
|
|
||||||
text: this.$t('verified')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
await process().catch(e => {
|
|
||||||
this.$root.dialog({
|
|
||||||
type: 'error',
|
|
||||||
text: e.toString()
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.verifying = false;
|
|
||||||
|
|
||||||
this.refreshUser();
|
|
||||||
},
|
|
||||||
|
|
||||||
async unverifyUser() {
|
|
||||||
if (!await this.getConfirmed(this.$t('unverify-confirm'))) return;
|
|
||||||
|
|
||||||
this.unverifying = true;
|
|
||||||
|
|
||||||
const process = async () => {
|
|
||||||
await this.$root.api('admin/unverify-user', { userId: this.user.id });
|
|
||||||
this.$root.dialog({
|
|
||||||
type: 'success',
|
|
||||||
text: this.$t('unverified')
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
await process().catch(e => {
|
|
||||||
this.$root.dialog({
|
|
||||||
type: 'error',
|
|
||||||
text: e.toString()
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.unverifying = false;
|
|
||||||
|
|
||||||
this.refreshUser();
|
|
||||||
},
|
|
||||||
|
|
||||||
async silenceUser() {
|
async silenceUser() {
|
||||||
if (!await this.getConfirmed(this.$t('silence-confirm'))) return;
|
if (!await this.getConfirmed(this.$t('silence-confirm'))) return;
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
||||||
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
||||||
<span class="username"><mk-acct :user="note.user"/></span>
|
<span class="username"><mk-acct :user="note.user"/></span>
|
||||||
<span class="is-verified" v-if="note.user.isVerified" :title="$t('@.verified-user')"><fa icon="star"/></span>
|
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span class="app" v-if="note.app && !mini && $store.state.settings.showVia">via <b>{{ note.app.name }}</b></span>
|
<span class="app" v-if="note.app && !mini && $store.state.settings.showVia">via <b>{{ note.app.name }}</b></span>
|
||||||
<span class="mobile" v-if="note.viaMobile"><fa icon="mobile-alt"/></span>
|
<span class="mobile" v-if="note.viaMobile"><fa icon="mobile-alt"/></span>
|
||||||
|
@ -95,10 +94,6 @@ export default Vue.extend({
|
||||||
color var(--noteHeaderAcct)
|
color var(--noteHeaderAcct)
|
||||||
flex-shrink 2147483647
|
flex-shrink 2147483647
|
||||||
|
|
||||||
> .is-verified
|
|
||||||
margin 0 .5em 0 0
|
|
||||||
color #4dabf7
|
|
||||||
|
|
||||||
> .info
|
> .info
|
||||||
margin-left auto
|
margin-left auto
|
||||||
font-size 0.9em
|
font-size 0.9em
|
||||||
|
|
|
@ -26,9 +26,6 @@
|
||||||
</mk-user-list>
|
</mk-user-list>
|
||||||
|
|
||||||
<template v-if="tag == null">
|
<template v-if="tag == null">
|
||||||
<mk-user-list :make-promise="verifiedUsers">
|
|
||||||
<fa :icon="faBookmark" fixed-width/>{{ $t('verified-users') }}
|
|
||||||
</mk-user-list>
|
|
||||||
<mk-user-list :make-promise="popularUsers">
|
<mk-user-list :make-promise="popularUsers">
|
||||||
<fa :icon="faChartLine" fixed-width/>{{ $t('popular-users') }}
|
<fa :icon="faChartLine" fixed-width/>{{ $t('popular-users') }}
|
||||||
</mk-user-list>
|
</mk-user-list>
|
||||||
|
@ -60,12 +57,6 @@ export default Vue.extend({
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
verifiedUsers: () => this.$root.api('users', {
|
|
||||||
state: 'verified',
|
|
||||||
origin: 'local',
|
|
||||||
sort: '+follower',
|
|
||||||
limit: 10
|
|
||||||
}),
|
|
||||||
popularUsers: () => this.$root.api('users', {
|
popularUsers: () => this.$root.api('users', {
|
||||||
state: 'alive',
|
state: 'alive',
|
||||||
origin: 'local',
|
origin: 'local',
|
||||||
|
|
|
@ -157,11 +157,6 @@ export class User {
|
||||||
})
|
})
|
||||||
public isModerator: boolean;
|
public isModerator: boolean;
|
||||||
|
|
||||||
@Column('boolean', {
|
|
||||||
default: false,
|
|
||||||
})
|
|
||||||
public isVerified: boolean;
|
|
||||||
|
|
||||||
@Column('varchar', {
|
@Column('varchar', {
|
||||||
length: 128, array: true, default: '{}'
|
length: 128, array: true, default: '{}'
|
||||||
})
|
})
|
||||||
|
|
|
@ -87,7 +87,6 @@ export class UserRepository extends Repository<User> {
|
||||||
isAdmin: user.isAdmin || falsy,
|
isAdmin: user.isAdmin || falsy,
|
||||||
isBot: user.isBot || falsy,
|
isBot: user.isBot || falsy,
|
||||||
isCat: user.isCat || falsy,
|
isCat: user.isCat || falsy,
|
||||||
isVerified: user.isVerified || falsy,
|
|
||||||
|
|
||||||
// カスタム絵文字添付
|
// カスタム絵文字添付
|
||||||
emojis: user.emojis.length > 0 ? Emojis.find({
|
emojis: user.emojis.length > 0 ? Emojis.find({
|
||||||
|
@ -369,10 +368,6 @@ export const packedUserSchema = {
|
||||||
nullable: bool.false, optional: bool.true,
|
nullable: bool.false, optional: bool.true,
|
||||||
description: 'Whether this account is a moderator.'
|
description: 'Whether this account is a moderator.'
|
||||||
},
|
},
|
||||||
isVerified: {
|
|
||||||
type: types.boolean,
|
|
||||||
nullable: bool.false, optional: bool.true,
|
|
||||||
},
|
|
||||||
isLocked: {
|
isLocked: {
|
||||||
type: types.boolean,
|
type: types.boolean,
|
||||||
nullable: bool.false, optional: bool.true,
|
nullable: bool.false, optional: bool.true,
|
||||||
|
|
|
@ -36,7 +36,6 @@ export const meta = {
|
||||||
'admin',
|
'admin',
|
||||||
'moderator',
|
'moderator',
|
||||||
'adminOrModerator',
|
'adminOrModerator',
|
||||||
'verified',
|
|
||||||
'silenced',
|
'silenced',
|
||||||
'suspended',
|
'suspended',
|
||||||
]),
|
]),
|
||||||
|
@ -61,7 +60,6 @@ export default define(meta, async (ps, me) => {
|
||||||
case 'admin': query.where('user.isAdmin = TRUE'); break;
|
case 'admin': query.where('user.isAdmin = TRUE'); break;
|
||||||
case 'moderator': query.where('user.isModerator = TRUE'); break;
|
case 'moderator': query.where('user.isModerator = TRUE'); break;
|
||||||
case 'adminOrModerator': query.where('user.isAdmin = TRUE OR isModerator = TRUE'); break;
|
case 'adminOrModerator': query.where('user.isAdmin = TRUE OR isModerator = TRUE'); break;
|
||||||
case 'verified': query.where('user.isVerified = TRUE'); break;
|
|
||||||
case 'alive': query.where('user.updatedAt > :date', { date: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5) }); break;
|
case 'alive': query.where('user.updatedAt > :date', { date: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5) }); break;
|
||||||
case 'silenced': query.where('user.isSilenced = TRUE'); break;
|
case 'silenced': query.where('user.isSilenced = TRUE'); break;
|
||||||
case 'suspended': query.where('user.isSuspended = TRUE'); break;
|
case 'suspended': query.where('user.isSuspended = TRUE'); break;
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
import $ from 'cafy';
|
|
||||||
import { ID } from '../../../../misc/cafy-id';
|
|
||||||
import define from '../../define';
|
|
||||||
import { Users } from '../../../../models';
|
|
||||||
|
|
||||||
export const meta = {
|
|
||||||
desc: {
|
|
||||||
'ja-JP': '指定したユーザーの公式アカウントを解除します。',
|
|
||||||
'en-US': 'Mark a user as unverified.'
|
|
||||||
},
|
|
||||||
|
|
||||||
tags: ['admin'],
|
|
||||||
|
|
||||||
requireCredential: true,
|
|
||||||
requireModerator: true,
|
|
||||||
|
|
||||||
params: {
|
|
||||||
userId: {
|
|
||||||
validator: $.type(ID),
|
|
||||||
desc: {
|
|
||||||
'ja-JP': '対象のユーザーID',
|
|
||||||
'en-US': 'The user ID which you want to unverify'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default define(meta, async (ps) => {
|
|
||||||
const user = await Users.findOne(ps.userId as string);
|
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
throw new Error('user not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
await Users.update(user.id, {
|
|
||||||
isVerified: false
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,38 +0,0 @@
|
||||||
import $ from 'cafy';
|
|
||||||
import { ID } from '../../../../misc/cafy-id';
|
|
||||||
import define from '../../define';
|
|
||||||
import { Users } from '../../../../models';
|
|
||||||
|
|
||||||
export const meta = {
|
|
||||||
desc: {
|
|
||||||
'ja-JP': '指定したユーザーを公式アカウントにします。',
|
|
||||||
'en-US': 'Mark a user as verified.'
|
|
||||||
},
|
|
||||||
|
|
||||||
tags: ['admin'],
|
|
||||||
|
|
||||||
requireCredential: true,
|
|
||||||
requireModerator: true,
|
|
||||||
|
|
||||||
params: {
|
|
||||||
userId: {
|
|
||||||
validator: $.type(ID),
|
|
||||||
desc: {
|
|
||||||
'ja-JP': '対象のユーザーID',
|
|
||||||
'en-US': 'The user ID which you want to verify'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export default define(meta, async (ps) => {
|
|
||||||
const user = await Users.findOne(ps.userId as string);
|
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
throw new Error('user not found');
|
|
||||||
}
|
|
||||||
|
|
||||||
await Users.update(user.id, {
|
|
||||||
isVerified: true
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -37,7 +37,6 @@ export const meta = {
|
||||||
'admin',
|
'admin',
|
||||||
'moderator',
|
'moderator',
|
||||||
'adminOrModerator',
|
'adminOrModerator',
|
||||||
'verified',
|
|
||||||
'alive'
|
'alive'
|
||||||
]),
|
]),
|
||||||
default: 'all'
|
default: 'all'
|
||||||
|
@ -71,7 +70,6 @@ export default define(meta, async (ps, me) => {
|
||||||
case 'admin': query.where('user.isAdmin = TRUE'); break;
|
case 'admin': query.where('user.isAdmin = TRUE'); break;
|
||||||
case 'moderator': query.where('user.isModerator = TRUE'); break;
|
case 'moderator': query.where('user.isModerator = TRUE'); break;
|
||||||
case 'adminOrModerator': query.where('user.isAdmin = TRUE OR isModerator = TRUE'); break;
|
case 'adminOrModerator': query.where('user.isAdmin = TRUE OR isModerator = TRUE'); break;
|
||||||
case 'verified': query.where('user.isVerified = TRUE'); break;
|
|
||||||
case 'alive': query.where('user.updatedAt > :date', { date: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5) }); break;
|
case 'alive': query.where('user.updatedAt > :date', { date: new Date(Date.now() - 1000 * 60 * 60 * 24 * 5) }); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue