From 2af337c83905c420b2d9022ee6fd3d6ef5fd1e42 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 10 Nov 2020 16:29:35 +0100 Subject: Cleanup follows of orphean actors --- server/initializers/constants.ts | 2 +- .../migrations/0550-actor-follow-cleanup.ts | 27 ++++++++++++++++++++++ server/models/account/account.ts | 1 + server/models/video/video-channel.ts | 23 ++++++++++-------- 4 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 server/initializers/migrations/0550-actor-follow-cleanup.ts (limited to 'server') diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 0bb251043..6ab4d957a 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -23,7 +23,7 @@ import { CONFIG, registerConfigChangedHandler } from './config' // --------------------------------------------------------------------------- -const LAST_MIGRATION_VERSION = 545 +const LAST_MIGRATION_VERSION = 550 // --------------------------------------------------------------------------- diff --git a/server/initializers/migrations/0550-actor-follow-cleanup.ts b/server/initializers/migrations/0550-actor-follow-cleanup.ts new file mode 100644 index 000000000..8ba6feec2 --- /dev/null +++ b/server/initializers/migrations/0550-actor-follow-cleanup.ts @@ -0,0 +1,27 @@ +import * as Sequelize from 'sequelize' + +async function up (utils: { + transaction: Sequelize.Transaction + queryInterface: Sequelize.QueryInterface + sequelize: Sequelize.Sequelize +}): Promise { + const query = ` + WITH t AS ( + SELECT actor.id FROM actor + LEFT JOIN "videoChannel" ON "videoChannel"."actorId" = actor.id + LEFT JOIN account ON account."actorId" = "actor"."id" + WHERE "videoChannel".id IS NULL and "account".id IS NULL + ) DELETE FROM "actorFollow" WHERE "actorId" IN (SELECT t.id FROM t) OR "targetActorId" in (SELECT t.id FROM t) + ` + + await utils.sequelize.query(query) +} + +function down (options) { + throw new Error('Not implemented.') +} + +export { + up, + down +} diff --git a/server/models/account/account.ts b/server/models/account/account.ts index f97519b14..1162643be 100644 --- a/server/models/account/account.ts +++ b/server/models/account/account.ts @@ -228,6 +228,7 @@ export class AccountModel extends Model { } await ActorFollowModel.removeFollowsOf(instance.Actor.id, options.transaction) + if (instance.isOwned()) { return sendDeleteActor(instance.Actor, options.transaction) } diff --git a/server/models/video/video-channel.ts b/server/models/video/video-channel.ts index 9da965bbc..202dc513f 100644 --- a/server/models/video/video-channel.ts +++ b/server/models/video/video-channel.ts @@ -1,3 +1,5 @@ +import * as Bluebird from 'bluebird' +import { FindOptions, literal, Op, ScopeOptions } from 'sequelize' import { AllowNull, BeforeDestroy, @@ -23,17 +25,8 @@ import { isVideoChannelNameValid, isVideoChannelSupportValid } from '../../helpers/custom-validators/video-channels' -import { sendDeleteActor } from '../../lib/activitypub/send' -import { AccountModel, ScopeNames as AccountModelScopeNames, SummaryOptions as AccountSummaryOptions } from '../account/account' -import { ActorModel, unusedActorAttributesForAPI } from '../activitypub/actor' -import { buildServerIdsFollowedBy, buildTrigramSearchIndex, createSimilarityAttribute, getSort, throwIfNotValid } from '../utils' -import { VideoModel } from './video' import { CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers/constants' -import { ServerModel } from '../server/server' -import { FindOptions, Op, literal, ScopeOptions } from 'sequelize' -import { AvatarModel } from '../avatar/avatar' -import { VideoPlaylistModel } from './video-playlist' -import * as Bluebird from 'bluebird' +import { sendDeleteActor } from '../../lib/activitypub/send' import { MChannelAccountDefault, MChannelActor, @@ -42,6 +35,14 @@ import { MChannelFormattable, MChannelSummaryFormattable } from '../../types/models/video' +import { AccountModel, ScopeNames as AccountModelScopeNames, SummaryOptions as AccountSummaryOptions } from '../account/account' +import { ActorModel, unusedActorAttributesForAPI } from '../activitypub/actor' +import { ActorFollowModel } from '../activitypub/actor-follow' +import { AvatarModel } from '../avatar/avatar' +import { ServerModel } from '../server/server' +import { buildServerIdsFollowedBy, buildTrigramSearchIndex, createSimilarityAttribute, getSort, throwIfNotValid } from '../utils' +import { VideoModel } from './video' +import { VideoPlaylistModel } from './video-playlist' export enum ScopeNames { FOR_API = 'FOR_API', @@ -293,6 +294,8 @@ export class VideoChannelModel extends Model { instance.Actor = await instance.$get('Actor', { transaction: options.transaction }) } + await ActorFollowModel.removeFollowsOf(instance.Actor.id, options.transaction) + if (instance.Actor.isOwned()) { return sendDeleteActor(instance.Actor, options.transaction) } -- cgit v1.2.3