aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2020-11-10 16:29:35 +0100
committerChocobozzz <me@florianbigard.com>2020-11-10 16:29:35 +0100
commit2af337c83905c420b2d9022ee6fd3d6ef5fd1e42 (patch)
treefa6293371d4b607e00545a552ccd8bfab465926a
parentb9cf3fb6381f71c976fbe515f728082d90a9c437 (diff)
downloadPeerTube-2af337c83905c420b2d9022ee6fd3d6ef5fd1e42.tar.gz
PeerTube-2af337c83905c420b2d9022ee6fd3d6ef5fd1e42.tar.zst
PeerTube-2af337c83905c420b2d9022ee6fd3d6ef5fd1e42.zip
Cleanup follows of orphean actors
-rw-r--r--server/initializers/constants.ts2
-rw-r--r--server/initializers/migrations/0550-actor-follow-cleanup.ts27
-rw-r--r--server/models/account/account.ts1
-rw-r--r--server/models/video/video-channel.ts23
4 files changed, 42 insertions, 11 deletions
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'
23 23
24// --------------------------------------------------------------------------- 24// ---------------------------------------------------------------------------
25 25
26const LAST_MIGRATION_VERSION = 545 26const LAST_MIGRATION_VERSION = 550
27 27
28// --------------------------------------------------------------------------- 28// ---------------------------------------------------------------------------
29 29
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 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction
5 queryInterface: Sequelize.QueryInterface
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8 const query = `
9 WITH t AS (
10 SELECT actor.id FROM actor
11 LEFT JOIN "videoChannel" ON "videoChannel"."actorId" = actor.id
12 LEFT JOIN account ON account."actorId" = "actor"."id"
13 WHERE "videoChannel".id IS NULL and "account".id IS NULL
14 ) DELETE FROM "actorFollow" WHERE "actorId" IN (SELECT t.id FROM t) OR "targetActorId" in (SELECT t.id FROM t)
15 `
16
17 await utils.sequelize.query(query)
18}
19
20function down (options) {
21 throw new Error('Not implemented.')
22}
23
24export {
25 up,
26 down
27}
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<AccountModel> {
228 } 228 }
229 229
230 await ActorFollowModel.removeFollowsOf(instance.Actor.id, options.transaction) 230 await ActorFollowModel.removeFollowsOf(instance.Actor.id, options.transaction)
231
231 if (instance.isOwned()) { 232 if (instance.isOwned()) {
232 return sendDeleteActor(instance.Actor, options.transaction) 233 return sendDeleteActor(instance.Actor, options.transaction)
233 } 234 }
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 @@
1import * as Bluebird from 'bluebird'
2import { FindOptions, literal, Op, ScopeOptions } from 'sequelize'
1import { 3import {
2 AllowNull, 4 AllowNull,
3 BeforeDestroy, 5 BeforeDestroy,
@@ -23,17 +25,8 @@ import {
23 isVideoChannelNameValid, 25 isVideoChannelNameValid,
24 isVideoChannelSupportValid 26 isVideoChannelSupportValid
25} from '../../helpers/custom-validators/video-channels' 27} from '../../helpers/custom-validators/video-channels'
26import { sendDeleteActor } from '../../lib/activitypub/send'
27import { AccountModel, ScopeNames as AccountModelScopeNames, SummaryOptions as AccountSummaryOptions } from '../account/account'
28import { ActorModel, unusedActorAttributesForAPI } from '../activitypub/actor'
29import { buildServerIdsFollowedBy, buildTrigramSearchIndex, createSimilarityAttribute, getSort, throwIfNotValid } from '../utils'
30import { VideoModel } from './video'
31import { CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers/constants' 28import { CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers/constants'
32import { ServerModel } from '../server/server' 29import { sendDeleteActor } from '../../lib/activitypub/send'
33import { FindOptions, Op, literal, ScopeOptions } from 'sequelize'
34import { AvatarModel } from '../avatar/avatar'
35import { VideoPlaylistModel } from './video-playlist'
36import * as Bluebird from 'bluebird'
37import { 30import {
38 MChannelAccountDefault, 31 MChannelAccountDefault,
39 MChannelActor, 32 MChannelActor,
@@ -42,6 +35,14 @@ import {
42 MChannelFormattable, 35 MChannelFormattable,
43 MChannelSummaryFormattable 36 MChannelSummaryFormattable
44} from '../../types/models/video' 37} from '../../types/models/video'
38import { AccountModel, ScopeNames as AccountModelScopeNames, SummaryOptions as AccountSummaryOptions } from '../account/account'
39import { ActorModel, unusedActorAttributesForAPI } from '../activitypub/actor'
40import { ActorFollowModel } from '../activitypub/actor-follow'
41import { AvatarModel } from '../avatar/avatar'
42import { ServerModel } from '../server/server'
43import { buildServerIdsFollowedBy, buildTrigramSearchIndex, createSimilarityAttribute, getSort, throwIfNotValid } from '../utils'
44import { VideoModel } from './video'
45import { VideoPlaylistModel } from './video-playlist'
45 46
46export enum ScopeNames { 47export enum ScopeNames {
47 FOR_API = 'FOR_API', 48 FOR_API = 'FOR_API',
@@ -293,6 +294,8 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
293 instance.Actor = await instance.$get('Actor', { transaction: options.transaction }) 294 instance.Actor = await instance.$get('Actor', { transaction: options.transaction })
294 } 295 }
295 296
297 await ActorFollowModel.removeFollowsOf(instance.Actor.id, options.transaction)
298
296 if (instance.Actor.isOwned()) { 299 if (instance.Actor.isOwned()) {
297 return sendDeleteActor(instance.Actor, options.transaction) 300 return sendDeleteActor(instance.Actor, options.transaction)
298 } 301 }