+async function sendVerifyUserEmail (user: MUser, isPendingEmail = false) {
+ const verificationString = await Redis.Instance.setVerifyEmailVerificationString(user.id)
+ let url = WEBSERVER.URL + '/verify-account/email?userId=' + user.id + '&verificationString=' + verificationString
+
+ if (isPendingEmail) url += '&isPendingEmail=true'
+
+ const email = isPendingEmail ? user.pendingEmail : user.email
+ const username = user.username
+
+ 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',
+ daily: false
+ })
+
+ const base = await UserModel.getTotalRawQuery(query, user.id)
+
+ return base + LiveQuotaStore.Instance.getLiveQuotaOf(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',
+ daily: true
+ })
+
+ const base = await UserModel.getTotalRawQuery(query, user.id)
+
+ return base + LiveQuotaStore.Instance.getLiveQuotaOf(user.id)
+}
+
+async function isAbleToUploadVideo (userId: number, newVideoSize: 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 = newVideoSize + totalBytes
+ const uploadedDaily = newVideoSize + totalBytesDaily
+
+ logger.debug(
+ 'Check user %d quota to upload another video.', userId,
+ { totalBytes, totalBytesDaily, videoQuota: user.videoQuota, videoQuotaDaily: user.videoQuotaDaily, newVideoSize }
+ )
+
+ if (user.videoQuotaDaily === -1) return uploadedTotal < user.videoQuota
+ if (user.videoQuota === -1) return uploadedDaily < user.videoQuotaDaily
+
+ return uploadedTotal < user.videoQuota && uploadedDaily < user.videoQuotaDaily
+}
+