Refractor user quota SQL queries
This commit is contained in:
parent
41a676db39
commit
8b60488020
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 query = UserModel.generateUserQuotaBaseSQL('"video"."createdAt" > now() - interval \'24 hours\'')
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
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)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue