]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/models/video/video.ts
Destroy user token when changing its role
[github/Chocobozzz/PeerTube.git] / server / models / video / video.ts
index 7af68b20bbdfa66f4e3e3bc040115ecdb32af61a..77c0400d8d5b9434fdb19ae8377d4fa4b8878999 100644 (file)
@@ -31,7 +31,6 @@ import { sendDeleteVideo } from '../../lib/activitypub/send'
 import { AccountModel } from '../account/account'
 import { AccountVideoRateModel } from '../account/account-video-rate'
 import { ActorModel } from '../activitypub/actor'
-import { ActorFollowModel } from '../activitypub/actor-follow'
 import { ServerModel } from '../server/server'
 import { getSort, throwIfNotValid } from '../utils'
 import { TagModel } from './tag'
@@ -54,33 +53,27 @@ enum ScopeNames {
 
 @Scopes({
   [ScopeNames.AVAILABLE_FOR_LIST]: (actorId: number) => ({
-    subQuery: false,
     where: {
       id: {
         [Sequelize.Op.notIn]: Sequelize.literal(
           '(SELECT "videoBlacklist"."videoId" FROM "videoBlacklist")'
+        ),
+        [ Sequelize.Op.in ]: Sequelize.literal(
+          '(' +
+            'SELECT "videoShare"."videoId" AS "id" FROM "videoShare" ' +
+            'INNER JOIN "actorFollow" ON "actorFollow"."targetActorId" = "videoShare"."actorId" ' +
+            'WHERE "actorFollow"."actorId" = ' + parseInt(actorId.toString(), 10) +
+            ' UNION ' +
+            'SELECT "video"."id" AS "id" FROM "video" ' +
+            'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
+            'INNER JOIN "account" ON "account"."id" = "videoChannel"."accountId" ' +
+            'INNER JOIN "actor" ON "account"."actorId" = "actor"."id" ' +
+            'LEFT JOIN "actorFollow" ON "actorFollow"."targetActorId" = "actor"."id" ' +
+            'WHERE "actor"."serverId" IS NULL OR "actorFollow"."actorId" = ' + parseInt(actorId.toString(), 10) +
+          ')'
         )
       },
-      privacy: VideoPrivacy.PUBLIC,
-      [Sequelize.Op.or]: [
-        {
-          '$VideoChannel.Account.Actor.serverId$': null
-        },
-        {
-          '$VideoChannel.Account.Actor.ActorFollowers.actorId$': actorId
-        },
-        {
-          id: {
-            [ Sequelize.Op.in ]: Sequelize.literal(
-              '(' +
-                'SELECT "videoShare"."videoId" FROM "videoShare" ' +
-                'INNER JOIN "actorFollow" ON "actorFollow"."targetActorId" = "videoShare"."actorId" ' +
-                'WHERE "actorFollow"."actorId" = ' + parseInt(actorId.toString(), 10) +
-              ')'
-            )
-          }
-        }
-      ]
+      privacy: VideoPrivacy.PUBLIC
     },
     include: [
       {
@@ -100,14 +93,7 @@ enum ScopeNames {
                 include: [
                   {
                     attributes: [ 'host' ],
-                    model: ServerModel.unscoped(),
-                    required: false
-                  },
-                  {
-                    attributes: [ ],
-                    model: ActorFollowModel.unscoped(),
-                    as: 'ActorFollowers',
-                    required: false
+                    model: ServerModel.unscoped()
                   }
                 ]
               }
@@ -127,22 +113,30 @@ enum ScopeNames {
             attributes: {
               exclude: [ 'privateKey', 'publicKey' ]
             },
-            model: () => ActorModel,
-            required: true
+            model: () => ActorModel.unscoped(),
+            required: true,
+            include: [
+              {
+                attributes: [ 'host' ],
+                model: () => ServerModel.unscoped(),
+                required: false
+              }
+            ]
           },
           {
-            model: () => AccountModel,
+            model: () => AccountModel.unscoped(),
             required: true,
             include: [
               {
-                model: () => ActorModel,
+                model: () => ActorModel.unscoped(),
                 attributes: {
                   exclude: [ 'privateKey', 'publicKey' ]
                 },
                 required: true,
                 include: [
                   {
-                    model: () => ServerModel,
+                    attributes: [ 'host' ],
+                    model: () => ServerModel.unscoped(),
                     required: false
                   }
                 ]
@@ -775,7 +769,8 @@ export class VideoModel extends Model<VideoModel> {
   createTorrentAndSetInfoHash = async function (videoFile: VideoFileModel) {
     const options = {
       announceList: [
-        [ CONFIG.WEBSERVER.WS + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT + '/tracker/socket' ]
+        [ CONFIG.WEBSERVER.WS + '://' + CONFIG.WEBSERVER.HOSTNAME + ':' + CONFIG.WEBSERVER.PORT + '/tracker/socket' ],
+        [ CONFIG.WEBSERVER.URL + '/tracker/announce' ]
       ],
       urlList: [
         CONFIG.WEBSERVER.URL + STATIC_PATHS.WEBSEED + this.getVideoFilename(videoFile)