--- /dev/null
+import * as Sequelize from 'sequelize'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction
+ queryInterface: Sequelize.QueryInterface
+ sequelize: Sequelize.Sequelize
+}): Promise<void> {
+ 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
+}
+import * as Bluebird from 'bluebird'
+import { FindOptions, literal, Op, ScopeOptions } from 'sequelize'
import {
AllowNull,
BeforeDestroy,
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,
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',
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)
}