summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2024-10-06 21:33:39 +0000
committerHazelnoot <acomputerdog@gmail.com>2024-10-06 21:33:39 +0000
commit934e007698aeef90b89ca41857817aa4e079696c (patch)
tree2731c25215245ba6c9cf4b8738f6868cf33afb78 /packages
parentmerge: Add option to reject reports from an instance (Resolves #579, #715, #7... (diff)
parentMerge branch 'develop' of https://activitypub.software/TransFem-org/Sharkey i... (diff)
downloadsharkey-934e007698aeef90b89ca41857817aa4e079696c.tar.gz
sharkey-934e007698aeef90b89ca41857817aa4e079696c.tar.bz2
sharkey-934e007698aeef90b89ca41857817aa4e079696c.zip
merge: Add controls to delete all files or sever all relations with a remote instance (!654)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/654 Approved-by: Marie <github@yuugi.dev> Approved-by: Hazelnoot <acomputerdog@gmail.com>
Diffstat (limited to 'packages')
-rw-r--r--packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts13
-rw-r--r--packages/frontend/src/pages/instance-info.vue45
2 files changed, 52 insertions, 6 deletions
diff --git a/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts b/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
index 9e93310746..601c898f52 100644
--- a/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
+++ b/packages/backend/src/server/api/endpoints/admin/federation/remove-all-following.ts
@@ -31,15 +31,20 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
- @Inject(DI.notesRepository)
+ @Inject(DI.followingsRepository)
private followingsRepository: FollowingsRepository,
private queueService: QueueService,
) {
super(meta, paramDef, async (ps, me) => {
- const followings = await this.followingsRepository.findBy({
- followerHost: ps.host,
- });
+ const followings = await this.followingsRepository.findBy([
+ {
+ followeeHost: ps.host,
+ },
+ {
+ followerHost: ps.host,
+ },
+ ]);
const pairs = await Promise.all(followings.map(f => Promise.all([
this.usersRepository.findOneByOrFail({ id: f.followerId }),
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index 5401ea51e0..95371036aa 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -43,8 +43,12 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._delivery._type[suspensionState] }}
</template>
</MkKeyValue>
- <MkButton v-if="suspensionState === 'none'" :disabled="!instance" danger @click="stopDelivery">{{ i18n.ts._delivery.stop }}</MkButton>
- <MkButton v-if="suspensionState !== 'none'" :disabled="!instance" @click="resumeDelivery">{{ i18n.ts._delivery.resume }}</MkButton>
+ <div class="_buttons">
+ <MkButton inline :disabled="!instance" danger @click="deleteAllFiles">{{ i18n.ts.deleteAllFiles }}</MkButton>
+ <MkButton inline :disabled="!instance" danger @click="severAllFollowRelations">{{ i18n.ts.severAllFollowRelations }}</MkButton>
+ <MkButton v-if="suspensionState === 'none'" inline :disabled="!instance" danger @click="stopDelivery">{{ i18n.ts._delivery.stop }}</MkButton>
+ <MkButton v-if="suspensionState !== 'none'" inline :disabled="!instance" @click="resumeDelivery">{{ i18n.ts._delivery.resume }}</MkButton>
+ </div>
<MkInfo v-if="isBaseBlocked" warn>{{ i18n.ts.blockedByBase }}</MkInfo>
<MkSwitch v-model="isBlocked" :disabled="!meta || !instance || isBaseBlocked" @update:modelValue="toggleBlock">{{ i18n.ts.blockThisInstance }}</MkSwitch>
<MkInfo v-if="isBaseSilenced" warn>{{ i18n.ts.silencedByBase }}</MkInfo>
@@ -300,6 +304,43 @@ function refreshMetadata(): void {
});
}
+async function deleteAllFiles(): void {
+ const confirm = await os.confirm({
+ type: 'danger',
+ text: i18n.ts.deleteAllFilesConfirm,
+ });
+ if (confirm.canceled) return;
+
+ if (!instance.value) throw new Error('No instance?');
+ await misskeyApi('admin/federation/delete-all-files', {
+ host: instance.value.host,
+ });
+ await os.alert({
+ text: i18n.ts.deleteAllFilesQueued,
+ });
+}
+
+async function severAllFollowRelations(): void {
+ if (!instance.value) throw new Error('No instance?');
+
+ const confirm = await os.confirm({
+ type: 'danger',
+ text: i18n.tsx.severAllFollowRelationsConfirm({
+ instanceName: meta.value.shortName ?? meta.value.name,
+ followingCount: instance.value.followingCount,
+ followersCount: instance.value.followersCount,
+ }),
+ });
+ if (confirm.canceled) return;
+
+ await misskeyApi('admin/federation/remove-all-following', {
+ host: instance.value.host,
+ });
+ await os.alert({
+ text: i18n.tsx.severAllFollowRelationsQueued({ host: instance.value.host }),
+ });
+}
+
fetch();
const headerActions = computed(() => [{