]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Cleanup follows of orphean actors
authorChocobozzz <me@florianbigard.com>
Tue, 10 Nov 2020 15:29:35 +0000 (16:29 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 10 Nov 2020 15:29:35 +0000 (16:29 +0100)
server/initializers/constants.ts
server/initializers/migrations/0550-actor-follow-cleanup.ts [new file with mode: 0644]
server/models/account/account.ts
server/models/video/video-channel.ts

index 0bb251043e51c711f2322b51520c4243d3ea36c2..6ab4d957af4ce999df52e1b4f7f1445b083d0a29 100644 (file)
@@ -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 (file)
index 0000000..8ba6fee
--- /dev/null
@@ -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
+}
index f97519b1403eac1c5d42280aa40ea5e8bf9e6a52..1162643bec2c7939c823846f824714e7072b35a0 100644 (file)
@@ -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)
     }
index 9da965bbc20a1710db8e7e2d821cdfa7017bd230..202dc513f4515a1016dd2fd047f471a11cf254fd 100644 (file)
@@ -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)
     }