Refractor user quota SQL queries
This commit is contained in:
parent
41a676db39
commit
8b60488020
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue