Cleanup follows of orphean actors
This commit is contained in:
parent
b9cf3fb638
commit
2af337c839
|
@ -23,7 +23,7 @@ import { CONFIG, registerConfigChangedHandler } from './config'
|
|||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const LAST_MIGRATION_VERSION = 545
|
||||
const LAST_MIGRATION_VERSION = 550
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
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
|
||||
}
|
|
@ -228,6 +228,7 @@ export class AccountModel extends Model<AccountModel> {
|
|||
}
|
||||
|
||||
await ActorFollowModel.removeFollowsOf(instance.Actor.id, options.transaction)
|
||||
|
||||
if (instance.isOwned()) {
|
||||
return sendDeleteActor(instance.Actor, options.transaction)
|
||||
}
|
||||
|
|
|
@ -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<VideoChannelModel> {
|
|||
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)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue