X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fuser.ts;h=8a6fcebc7b3d4d2ccd0127a08416f6ab077718e2;hb=2539932e16129992a2c0889b4ff527c265a8e2c7;hp=6e7a738eea44ca9f0ee8b6476cb9b95eeeaa572f;hpb=2291a412d25bd139398ca9e7a5131d0c1e4ffd7d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/user.ts b/server/lib/user.ts index 6e7a738ee..8a6fcebc7 100644 --- a/server/lib/user.ts +++ b/server/lib/user.ts @@ -1,20 +1,23 @@ +import { Transaction } from 'sequelize/types' import { v4 as uuidv4 } from 'uuid' +import { UserModel } from '@server/models/user/user' +import { MActorDefault } from '@server/types/models/actor' import { ActivityPubActorType } from '../../shared/models/activitypub' +import { UserNotificationSetting, UserNotificationSettingValue } from '../../shared/models/users' import { SERVER_ACTOR_NAME, WEBSERVER } from '../initializers/constants' +import { sequelizeTypescript } from '../initializers/database' import { AccountModel } from '../models/account/account' -import { buildActorInstance, setAsyncActorKeys } from './activitypub/actor' +import { ActorModel } from '../models/actor/actor' +import { UserNotificationSettingModel } from '../models/user/user-notification-setting' +import { MAccountDefault, MChannelActor } from '../types/models' +import { MUser, MUserDefault, MUserId } from '../types/models/user' +import { buildActorInstance, generateAndSaveActorKeys } from './activitypub/actor' +import { getLocalAccountActivityPubUrl } from './activitypub/url' +import { Emailer } from './emailer' +import { LiveManager } from './live-manager' +import { Redis } from './redis' import { createLocalVideoChannel } from './video-channel' -import { ActorModel } from '../models/activitypub/actor' -import { UserNotificationSettingModel } from '../models/account/user-notification-setting' -import { UserNotificationSetting, UserNotificationSettingValue } from '../../shared/models/users' import { createWatchLaterPlaylist } from './video-playlist' -import { sequelizeTypescript } from '../initializers/database' -import { Transaction } from 'sequelize/types' -import { Redis } from './redis' -import { Emailer } from './emailer' -import { MAccountDefault, MActorDefault, MChannelActor } from '../types/models' -import { MUser, MUserDefault, MUserId } from '../types/models/user' -import { getAccountActivityPubUrl } from './activitypub/url' type ChannelNames = { name: string, displayName: string } @@ -53,8 +56,8 @@ async function createUserAccountAndChannelAndPlaylist (parameters: { }) const [ accountActorWithKeys, channelActorWithKeys ] = await Promise.all([ - setAsyncActorKeys(account.Actor), - setAsyncActorKeys(videoChannel.Actor) + generateAndSaveActorKeys(account.Actor), + generateAndSaveActorKeys(videoChannel.Actor) ]) account.Actor = accountActorWithKeys @@ -72,7 +75,7 @@ async function createLocalAccountWithoutKeys (parameters: { type?: ActivityPubActorType }) { const { name, displayName, userId, applicationId, t, type = 'Person' } = parameters - const url = getAccountActivityPubUrl(name) + const url = getLocalAccountActivityPubUrl(name) const actorInstance = buildActorInstance(type, url, name) const actorInstanceCreated: MActorDefault = await actorInstance.save({ transaction: t }) @@ -99,7 +102,7 @@ async function createApplicationActor (applicationId: number) { type: 'Application' }) - accountCreated.Actor = await setAsyncActorKeys(accountCreated.Actor) + accountCreated.Actor = await generateAndSaveActorKeys(accountCreated.Actor) return accountCreated } @@ -116,13 +119,61 @@ async function sendVerifyUserEmail (user: MUser, isPendingEmail = false) { await Emailer.Instance.addVerifyEmailJob(username, email, url) } +async function getOriginalVideoFileTotalFromUser (user: MUserId) { + // Don't use sequelize because we need to use a sub query + const query = UserModel.generateUserQuotaBaseSQL({ + withSelect: true, + whereUserId: '$userId' + }) + + const base = await UserModel.getTotalRawQuery(query, user.id) + + return base + LiveManager.Instance.getLiveQuotaUsedByUser(user.id) +} + +// Returns cumulative size of all video files uploaded in the last 24 hours. +async function getOriginalVideoFileTotalDailyFromUser (user: MUserId) { + // Don't use sequelize because we need to use a sub query + const query = UserModel.generateUserQuotaBaseSQL({ + withSelect: true, + whereUserId: '$userId', + where: '"video"."createdAt" > now() - interval \'24 hours\'' + }) + + const base = await UserModel.getTotalRawQuery(query, user.id) + + return base + LiveManager.Instance.getLiveQuotaUsedByUser(user.id) +} + +async function isAbleToUploadVideo (userId: number, size: number) { + const user = await UserModel.loadById(userId) + + if (user.videoQuota === -1 && user.videoQuotaDaily === -1) return Promise.resolve(true) + + const [ totalBytes, totalBytesDaily ] = await Promise.all([ + getOriginalVideoFileTotalFromUser(user), + getOriginalVideoFileTotalDailyFromUser(user) + ]) + + const uploadedTotal = size + totalBytes + const uploadedDaily = size + totalBytesDaily + + if (user.videoQuotaDaily === -1) return uploadedTotal < user.videoQuota + if (user.videoQuota === -1) return uploadedDaily < user.videoQuotaDaily + + return uploadedTotal < user.videoQuota && uploadedDaily < user.videoQuotaDaily +} + // --------------------------------------------------------------------------- export { + getOriginalVideoFileTotalFromUser, + getOriginalVideoFileTotalDailyFromUser, createApplicationActor, createUserAccountAndChannelAndPlaylist, createLocalAccountWithoutKeys, - sendVerifyUserEmail + sendVerifyUserEmail, + isAbleToUploadVideo } // --------------------------------------------------------------------------- @@ -141,7 +192,11 @@ function createDefaultUserNotificationSettings (user: MUserId, t: Transaction | commentMention: UserNotificationSettingValue.WEB, newFollow: UserNotificationSettingValue.WEB, newInstanceFollower: UserNotificationSettingValue.WEB, - autoInstanceFollowing: UserNotificationSettingValue.WEB + abuseNewMessage: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL, + abuseStateChange: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL, + autoInstanceFollowing: UserNotificationSettingValue.WEB, + newPeerTubeVersion: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL, + newPluginVersion: UserNotificationSettingValue.WEB } return UserNotificationSettingModel.create(values, { transaction: t })