]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Refractor user quota SQL queries
authorChocobozzz <me@florianbigard.com>
Tue, 28 Aug 2018 16:29:29 +0000 (18:29 +0200)
committerChocobozzz <me@florianbigard.com>
Tue, 28 Aug 2018 16:29:48 +0000 (18:29 +0200)
server/helpers/custom-validators/activitypub/misc.ts
server/helpers/custom-validators/videos.ts
server/models/account/user.ts
server/models/video/video-channel.ts

index 2dac8e1ad77fa38add19a2ccade8a20da23242f5..6c5c7abca671efc61035cd99d91dcb9f196e488a 100644 (file)
@@ -41,12 +41,10 @@ function setValidAttributedTo (obj: any) {
     return true
   }
 
-  const newAttributesTo = obj.attributedTo.filter(a => {
+  obj.attributedTo = obj.attributedTo.filter(a => {
     return (a.type === 'Group' || a.type === 'Person') && isActivityPubUrlValid(a.id)
   })
 
-  obj.attributedTo = newAttributesTo
-
   return true
 }
 
index 5e6cfe2176a8e96a8938d15b253f02218fffd4d0..4b1f6c069898363490ace2ac011d1398cd6ea359 100644 (file)
@@ -6,7 +6,6 @@ import * as validator from 'validator'
 import { UserRight, VideoPrivacy, VideoRateType } from '../../../shared'
 import {
   CONSTRAINTS_FIELDS,
-  VIDEO_ABUSE_STATES,
   VIDEO_CATEGORIES,
   VIDEO_LICENCES,
   VIDEO_MIMETYPE_EXT,
@@ -19,10 +18,8 @@ import { exists, isArray, isFileValid } from './misc'
 import { VideoChannelModel } from '../../models/video/video-channel'
 import { UserModel } from '../../models/account/user'
 import * as magnetUtil from 'magnet-uri'
-import { VideoAbuseModel } from '../../models/video/video-abuse'
 
 const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
-const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
 
 function isVideoCategoryValid (value: any) {
   return value === null || VIDEO_CATEGORIES[ value ] !== undefined
index a88ec244fce736ed89d692e1795f622cb8c98939..bae683b128d03b9362ab619101a1bb40b5ebcb9f 100644 (file)
@@ -172,8 +172,8 @@ export class UserModel extends Model<UserModel> {
           [
             Sequelize.literal(
               '(' +
-                'SELECT COALESCE(SUM("size"), 0) FROM ' +
-                '(' +
+                'SELECT COALESCE(SUM("size"), 0) ' +
+                'FROM (' +
                   'SELECT MAX("videoFile"."size") AS "size" FROM "videoFile" ' +
                   'INNER JOIN "video" ON "videoFile"."videoId" = "video"."id" ' +
                   'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
@@ -267,48 +267,17 @@ export class UserModel extends Model<UserModel> {
 
   static getOriginalVideoFileTotalFromUser (user: UserModel) {
     // Don't use sequelize because we need to use a sub query
-    const query = 'SELECT SUM("size") AS "total" FROM ' +
-      '(SELECT MAX("videoFile"."size") AS "size" FROM "videoFile" ' +
-      'INNER JOIN "video" ON "videoFile"."videoId" = "video"."id" ' +
-      'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
-      'INNER JOIN "account" ON "videoChannel"."accountId" = "account"."id" ' +
-      'WHERE "account"."userId" = $userId ' +
-      'GROUP BY "video"."id") t'
+    const query = UserModel.generateUserQuotaBaseSQL()
 
-    const options = {
-      bind: { userId: user.id },
-      type: Sequelize.QueryTypes.SELECT
-    }
-    return UserModel.sequelize.query(query, options)
-      .then(([ { total } ]) => {
-        if (total === null) return 0
-
-        return parseInt(total, 10)
-      })
+    return UserModel.getTotalRawQuery(query, user.id)
   }
 
-  // Returns comulative size of all video files uploaded in the last 24 hours.
+  // Returns cumulative size of all video files uploaded in the last 24 hours.
   static getOriginalVideoFileTotalDailyFromUser (user: UserModel) {
     // Don't use sequelize because we need to use a sub query
-    const query = 'SELECT SUM("size") AS "total" FROM ' +
-      '(SELECT MAX("videoFile"."size") AS "size" FROM "videoFile" ' +
-      'INNER JOIN "video" ON "videoFile"."videoId" = "video"."id" ' +
-      'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
-      'INNER JOIN "account" ON "videoChannel"."accountId" = "account"."id" ' +
-      'WHERE "account"."userId" = $userId ' +
-      'AND "video"."createdAt" > now() - interval \'24 hours\'' +
-      'GROUP BY "video"."id") t'
-
-    const options = {
-      bind: { userId: user.id },
-      type: Sequelize.QueryTypes.SELECT
-    }
-    return UserModel.sequelize.query(query, options)
-      .then(([ { total } ]) => {
-        if (total === null) return 0
+    const query = UserModel.generateUserQuotaBaseSQL('"video"."createdAt" > now() - interval \'24 hours\'')
 
-        return parseInt(total, 10)
-      })
+    return UserModel.getTotalRawQuery(query, user.id)
   }
 
   static async getStats () {
@@ -388,4 +357,32 @@ export class UserModel extends Model<UserModel> {
     return (uploadedTotal < this.videoQuota) &&
         (uploadedDaily < this.videoQuotaDaily)
   }
+
+  private static generateUserQuotaBaseSQL (where?: string) {
+    const andWhere = where ? 'AND ' + where : ''
+
+    return 'SELECT SUM("size") AS "total" ' +
+      'FROM (' +
+        'SELECT MAX("videoFile"."size") AS "size" FROM "videoFile" ' +
+        'INNER JOIN "video" ON "videoFile"."videoId" = "video"."id" ' +
+        'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
+        'INNER JOIN "account" ON "videoChannel"."accountId" = "account"."id" ' +
+        'WHERE "account"."userId" = $userId ' + andWhere +
+        'GROUP BY "video"."id"' +
+      ') t'
+  }
+
+  private static getTotalRawQuery (query: string, userId: number) {
+    const options = {
+      bind: { userId },
+      type: Sequelize.QueryTypes.SELECT
+    }
+
+    return UserModel.sequelize.query(query, options)
+                    .then(([ { total } ]) => {
+                      if (total === null) return 0
+
+                      return parseInt(total, 10)
+                    })
+  }
 }
index e70e525153c0351bf40bfd7bc6f2ff89d2402132..475530daf4f423ede8fc5b8b645d773538fa566d 100644 (file)
@@ -71,7 +71,7 @@ type AvailableForListOptions = {
     const inQueryInstanceFollow = '(' +
       'SELECT "actor"."serverId" FROM "actorFollow" ' +
       'INNER JOIN "actor" ON actor.id=  "actorFollow"."targetActorId" ' +
-      'WHERE "actor"."id" = ' + actorIdNumber +
+      'WHERE "actorFollow"."actorId" = ' + actorIdNumber +
     ')'
 
     return {