+ Emailer.Instance.addVerifyEmailJob({ username, to, verifyEmailUrl, isRegistrationRequest: false })
+}
+
+async function sendVerifyRegistrationEmail (registration: MRegistration) {
+ const verificationString = await Redis.Instance.setRegistrationVerifyEmailVerificationString(registration.id)
+ const verifyEmailUrl = `${WEBSERVER.URL}/verify-account/email?registrationId=${registration.id}&verificationString=${verificationString}`
+
+ const to = registration.email
+ const username = registration.username
+
+ Emailer.Instance.addVerifyEmailJob({ username, to, verifyEmailUrl, isRegistrationRequest: true })
+}
+
+// ---------------------------------------------------------------------------
+
+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