Fix blacklist sort
authorChocobozzz <me@florianbigard.com>
Tue, 21 May 2019 10:09:58 +0000 (12:09 +0200)
committerChocobozzz <me@florianbigard.com>
Tue, 21 May 2019 10:09:58 +0000 (12:09 +0200)
server/models/video/video-blacklist.ts

index 3bd74460d9627a9f9f4e0416f8caea801f8610a9..baef1d6ce80cb859fb99620489b0898888536252 100644 (file)
@@ -1,11 +1,12 @@
 import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
 import { getSortOnModel, SortType, throwIfNotValid } from '../utils'
-import { VideoModel, ScopeNames as VideoModelScopeNames } from './video'
+import { ScopeNames as VideoModelScopeNames, VideoModel } from './video'
 import { ScopeNames as VideoChannelScopeNames, VideoChannelModel } from './video-channel'
 import { isVideoBlacklistReasonValid, isVideoBlacklistTypeValid } from '../../helpers/custom-validators/video-blacklist'
 import { VideoBlacklist, VideoBlacklistType } from '../../../shared/models/videos'
 import { CONSTRAINTS_FIELDS } from '../../initializers/constants'
 import { FindOptions } from 'sequelize'
+import { ThumbnailModel } from './thumbnail'
 
 @Table({
   tableName: 'videoBlacklist',
@@ -52,35 +53,50 @@ export class VideoBlacklistModel extends Model<VideoBlacklistModel> {
   Video: VideoModel
 
   static listForApi (start: number, count: number, sort: SortType, type?: VideoBlacklistType) {
-    const query: FindOptions = {
-      offset: start,
-      limit: count,
-      order: getSortOnModel(sort.sortModel, sort.sortValue),
-      include: [
-        {
-          model: VideoModel.scope(VideoModelScopeNames.WITH_THUMBNAILS),
-          required: true,
-          include: [
-            {
-              model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, true ] }),
-              required: true
-            }
-          ]
-        }
-      ]
+    function buildBaseQuery (): FindOptions {
+      return {
+        offset: start,
+        limit: count,
+        order: getSortOnModel(sort.sortModel, sort.sortValue)
+      }
     }
 
+    const countQuery = buildBaseQuery()
+
+    const findQuery = buildBaseQuery()
+    findQuery.subQuery = false
+    findQuery.include = [
+      {
+        model: VideoModel,
+        required: true,
+        include: [
+          {
+            model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, true ] }),
+            required: true
+          },
+          {
+            model: ThumbnailModel,
+            attributes: [ 'type', 'filename' ],
+            required: false
+          }
+        ]
+      }
+    ]
+
     if (type) {
-      query.where = { type }
+      countQuery.where = { type }
+      findQuery.where = { type }
     }
 
-    return VideoBlacklistModel.findAndCountAll(query)
-      .then(({ rows, count }) => {
-        return {
-          data: rows,
-          total: count
-        }
-      })
+    return Promise.all([
+      VideoBlacklistModel.count(countQuery),
+      VideoBlacklistModel.findAll(findQuery)
+    ]).then(([ count, rows ]) => {
+      return {
+        data: rows,
+        total: count
+      }
+    })
   }
 
   static loadByVideoId (id: number) {