X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Faccount%2Fuser.ts;h=4b13e47a0dc306d76a62acc3a61da8979e2cb2ee;hb=74d63469355bad731cdd32defdc85913df3cbd5c;hp=178012eaea4c7f4af57ff04271a06d6dbfb0099f;hpb=bee0abffff73804d816b90c7fd599e0a51c09d61;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/account/user.ts b/server/models/account/user.ts index 178012eae..4b13e47a0 100644 --- a/server/models/account/user.ts +++ b/server/models/account/user.ts @@ -24,6 +24,7 @@ import { isUserBlockedReasonValid, isUserBlockedValid, isUserNSFWPolicyValid, + isUserEmailVerifiedValid, isUserPasswordValid, isUserRoleValid, isUserUsernameValid, @@ -38,6 +39,7 @@ import { AccountModel } from './account' import { NSFWPolicyType } from '../../../shared/models/videos/nsfw-policy.type' import { values } from 'lodash' import { NSFW_POLICY_TYPES } from '../../initializers' +import { VideoFileModel } from '../video/video-file' enum ScopeNames { WITH_VIDEO_CHANNEL = 'WITH_VIDEO_CHANNEL' @@ -92,6 +94,12 @@ export class UserModel extends Model { @Column(DataType.STRING(400)) email: string + @AllowNull(true) + @Default(null) + @Is('UserEmailVerified', value => throwIfNotValid(value, isUserEmailVerifiedValid, 'email verified boolean')) + @Column + emailVerified: boolean + @AllowNull(false) @Is('UserNSFWPolicy', value => throwIfNotValid(value, isUserNSFWPolicyValid, 'NSFW policy')) @Column(DataType.ENUM(values(NSFW_POLICY_TYPES))) @@ -172,8 +180,8 @@ export class UserModel extends Model { [ 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" ' + @@ -193,9 +201,6 @@ export class UserModel extends Model { return UserModel.findAndCountAll(query) .then(({ rows, count }) => { - console.log(rows[0]) - console.log(rows[0]['videoQuotaUsed']) - console.log(rows[0].get('videoQuotaUsed')) return { data: rows, total: count @@ -208,8 +213,6 @@ export class UserModel extends Model { .map(k => parseInt(k, 10) as UserRole) .filter(role => hasUserRight(role, right)) - console.log(roles) - const query = { attribute: [ 'email' ], where: { @@ -272,48 +275,17 @@ export class UserModel extends Model { 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 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() - 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 () { @@ -340,6 +312,7 @@ export class UserModel extends Model { id: this.id, username: this.username, email: this.email, + emailVerified: this.emailVerified, nsfwPolicy: this.nsfwPolicy, autoPlayVideo: this.autoPlayVideo, role: this.role, @@ -393,4 +366,43 @@ export class UserModel extends Model { 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) + }) + } + + static autocomplete (search: string) { + return UserModel.findAll({ + where: { + username: { + [Sequelize.Op.like]: `%${search}%` + } + } + }) + .then(u => u.map(u => u.username)) + } }