特定インスタンスからのフォローを全解除できるように

This commit is contained in:
syuilo 2019-02-07 21:59:18 +09:00
parent 15cac10d7b
commit e43c9c0e21
No known key found for this signature in database
GPG key ID: BDC4C49D06AB9D69
3 changed files with 58 additions and 0 deletions

View file

@ -1381,6 +1381,8 @@ admin/views/federation.vue:
status: "ステータス" status: "ステータス"
latest-request-sent-at: "直近のリクエスト送信" latest-request-sent-at: "直近のリクエスト送信"
latest-request-received-at: "直近のリクエスト受信" latest-request-received-at: "直近のリクエスト受信"
remove-all-following: "フォローを全解除"
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
lookup: "照会" lookup: "照会"
instances: "インスタンス" instances: "インスタンス"
instance-not-registered: "そのインスタンスは登録されていません" instance-not-registered: "そのインスタンスは登録されていません"

View file

@ -39,6 +39,10 @@
<ui-input :value="instance.latestRequestReceivedAt" type="text" readonly> <ui-input :value="instance.latestRequestReceivedAt" type="text" readonly>
<span>{{ $t('latest-request-received-at') }}</span> <span>{{ $t('latest-request-received-at') }}</span>
</ui-input> </ui-input>
<section>
<ui-button @click="removeAllFollowing()">{{ $t('remove-all-following') }}</ui-button>
<ui-info warn>{{ $t('remove-all-following-info', { host: instance.host }) }}</ui-info>
</section>
</div> </div>
</section> </section>
</ui-card> </ui-card>
@ -138,6 +142,17 @@ export default Vue.extend({
}).then(instances => { }).then(instances => {
this.instances = instances; this.instances = instances;
}); });
},
removeAllFollowing() {
this.$root.api('admin/federation/remove-all-following', {
host: this.instance.host
}).then(() => {
this.$root.dialog({
type: 'success',
splash: true
});
});
} }
} }
}); });

View file

@ -0,0 +1,41 @@
import $ from 'cafy';
import define from '../../../define';
import Instance from '../../../../../models/instance';
import Following from '../../../../../models/following';
import User from '../../../../../models/user';
import deleteFollowing from '../../../../../services/following/delete';
export const meta = {
requireCredential: true,
requireModerator: true,
params: {
host: {
validator: $.str
}
}
};
export default define(meta, (ps, me) => new Promise(async (res, rej) => {
const instance = await Instance
.findOne({ host: ps.host });
if (instance == null) {
return rej('instance not found');
}
const followings = await Following.find({
'_follower.host': { $ne: null }
});
const pairs = await Promise.all(followings.map(f => Promise.all([
User.findOne({ _id: f.followerId }),
User.findOne({ _id: f.followeeId })
])));
for (const pair of pairs) {
deleteFollowing(pair[0], pair[1]);
}
res();
}));