+ const username = user.username
+
+ 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