Refractor user quota SQL queries

pull/959/merge
Chocobozzz 2018-08-28 18:29:29 +02:00
parent 41a676db39
commit 8b60488020
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
4 changed files with 37 additions and 45 deletions

View File

@ -41,12 +41,10 @@ function setValidAttributedTo (obj: any) {
return true return true
} }
const newAttributesTo = obj.attributedTo.filter(a => { obj.attributedTo = obj.attributedTo.filter(a => {
return (a.type === 'Group' || a.type === 'Person') && isActivityPubUrlValid(a.id) return (a.type === 'Group' || a.type === 'Person') && isActivityPubUrlValid(a.id)
}) })
obj.attributedTo = newAttributesTo
return true return true
} }

View File

@ -6,7 +6,6 @@ import * as validator from 'validator'
import { UserRight, VideoPrivacy, VideoRateType } from '../../../shared' import { UserRight, VideoPrivacy, VideoRateType } from '../../../shared'
import { import {
CONSTRAINTS_FIELDS, CONSTRAINTS_FIELDS,
VIDEO_ABUSE_STATES,
VIDEO_CATEGORIES, VIDEO_CATEGORIES,
VIDEO_LICENCES, VIDEO_LICENCES,
VIDEO_MIMETYPE_EXT, VIDEO_MIMETYPE_EXT,
@ -19,10 +18,8 @@ import { exists, isArray, isFileValid } from './misc'
import { VideoChannelModel } from '../../models/video/video-channel' import { VideoChannelModel } from '../../models/video/video-channel'
import { UserModel } from '../../models/account/user' import { UserModel } from '../../models/account/user'
import * as magnetUtil from 'magnet-uri' import * as magnetUtil from 'magnet-uri'
import { VideoAbuseModel } from '../../models/video/video-abuse'
const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS const VIDEOS_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEOS
const VIDEO_ABUSES_CONSTRAINTS_FIELDS = CONSTRAINTS_FIELDS.VIDEO_ABUSES
function isVideoCategoryValid (value: any) { function isVideoCategoryValid (value: any) {
return value === null || VIDEO_CATEGORIES[ value ] !== undefined return value === null || VIDEO_CATEGORIES[ value ] !== undefined

View File

@ -172,8 +172,8 @@ export class UserModel extends Model<UserModel> {
[ [
Sequelize.literal( Sequelize.literal(
'(' + '(' +
'SELECT COALESCE(SUM("size"), 0) FROM ' + 'SELECT COALESCE(SUM("size"), 0) ' +
'(' + 'FROM (' +
'SELECT MAX("videoFile"."size") AS "size" FROM "videoFile" ' + 'SELECT MAX("videoFile"."size") AS "size" FROM "videoFile" ' +
'INNER JOIN "video" ON "videoFile"."videoId" = "video"."id" ' + 'INNER JOIN "video" ON "videoFile"."videoId" = "video"."id" ' +
'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' + 'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' +
@ -267,48 +267,17 @@ export class UserModel extends Model<UserModel> {
static getOriginalVideoFileTotalFromUser (user: UserModel) { static getOriginalVideoFileTotalFromUser (user: UserModel) {
// Don't use sequelize because we need to use a sub query // Don't use sequelize because we need to use a sub query
const query = 'SELECT SUM("size") AS "total" FROM ' + const query = UserModel.generateUserQuotaBaseSQL()
'(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 options = { return UserModel.getTotalRawQuery(query, user.id)
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)
})
} }
// 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) { static getOriginalVideoFileTotalDailyFromUser (user: UserModel) {
// Don't use sequelize because we need to use a sub query // Don't use sequelize because we need to use a sub query
const query = 'SELECT SUM("size") AS "total" FROM ' + const query = UserModel.generateUserQuotaBaseSQL('"video"."createdAt" > now() - interval \'24 hours\'')
'(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 = { return UserModel.getTotalRawQuery(query, user.id)
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)
})
} }
static async getStats () { static async getStats () {
@ -388,4 +357,32 @@ export class UserModel extends Model<UserModel> {
return (uploadedTotal < this.videoQuota) && return (uploadedTotal < this.videoQuota) &&
(uploadedDaily < this.videoQuotaDaily) (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)
})
}
} }

View File

@ -71,7 +71,7 @@ type AvailableForListOptions = {
const inQueryInstanceFollow = '(' + const inQueryInstanceFollow = '(' +
'SELECT "actor"."serverId" FROM "actorFollow" ' + 'SELECT "actor"."serverId" FROM "actorFollow" ' +
'INNER JOIN "actor" ON actor.id= "actorFollow"."targetActorId" ' + 'INNER JOIN "actor" ON actor.id= "actorFollow"."targetActorId" ' +
'WHERE "actor"."id" = ' + actorIdNumber + 'WHERE "actorFollow"."actorId" = ' + actorIdNumber +
')' ')'
return { return {