MUserNotifSettingChannelDefault,
MUserWithNotificationSetting
} from '@server/types/models'
+import { forceNumber } from '@shared/core-utils'
import { AttributesOnly } from '@shared/typescript-utils'
import { hasUserRight, USER_ROLE_LABELS } from '../../../shared/core-utils/users'
import { AbuseState, MyUser, UserRight, VideoPlaylistType } from '../../../shared/models'
import { ActorFollowModel } from '../actor/actor-follow'
import { ActorImageModel } from '../actor/actor-image'
import { OAuthTokenModel } from '../oauth/oauth-token'
-import { getAdminUsersSort, throwIfNotValid } from '../utils'
+import { getAdminUsersSort, throwIfNotValid } from '../shared'
import { VideoModel } from '../video/video'
import { VideoChannelModel } from '../video/video-channel'
import { VideoImportModel } from '../video/video-import'
@Column
lastLoginDate: Date
+ @AllowNull(false)
+ @Default(false)
+ @Column
+ emailPublic: boolean
+
@AllowNull(true)
@Default(null)
@Column
})
OAuthTokens: OAuthTokenModel[]
+ // Used if we already set an encrypted password in user model
+ skipPasswordEncryption = false
+
@BeforeCreate
@BeforeUpdate
- static cryptPasswordIfNeeded (instance: UserModel) {
- if (instance.changed('password') && instance.password) {
- return cryptPassword(instance.password)
- .then(hash => {
- instance.password = hash
- return undefined
- })
- }
+ static async cryptPasswordIfNeeded (instance: UserModel) {
+ if (instance.skipPasswordEncryption) return
+ if (!instance.changed('password')) return
+ if (!instance.password) return
+
+ instance.password = await cryptPassword(instance.password)
}
@AfterUpdate
}
static countTotal () {
- return this.count()
+ return UserModel.unscoped().count()
}
static listForAdminApi (parameters: {
model: ActorFollowModel.unscoped(),
required: true,
where: {
+ state: 'accepted',
targetActorId: actorId
}
}
`WHERE "account"."userId" = ${options.whereUserId} ${andWhere}`
const webtorrentFiles = 'SELECT "videoFile"."size" AS "size", "video"."id" AS "videoId" FROM "videoFile" ' +
- 'INNER JOIN "video" ON "videoFile"."videoId" = "video"."id" ' +
+ 'INNER JOIN "video" ON "videoFile"."videoId" = "video"."id" AND "video"."isLive" IS FALSE ' +
videoChannelJoin
const hlsFiles = 'SELECT "videoFile"."size" AS "size", "video"."id" AS "videoId" FROM "videoFile" ' +
'INNER JOIN "videoStreamingPlaylist" ON "videoFile"."videoStreamingPlaylistId" = "videoStreamingPlaylist".id ' +
- 'INNER JOIN "video" ON "videoStreamingPlaylist"."videoId" = "video"."id" ' +
+ 'INNER JOIN "video" ON "videoStreamingPlaylist"."videoId" = "video"."id" AND "video"."isLive" IS FALSE ' +
videoChannelJoin
return 'SELECT COALESCE(SUM("size"), 0) AS "total" ' +
theme: getThemeOrDefault(this.theme, DEFAULT_USER_THEME_NAME),
pendingEmail: this.pendingEmail,
+ emailPublic: this.emailPublic,
emailVerified: this.emailVerified,
nsfwPolicy: this.nsfwPolicy,
videoQuotaDaily: this.videoQuotaDaily,
videoQuotaUsed: videoQuotaUsed !== undefined
- ? parseInt(videoQuotaUsed + '', 10) + LiveQuotaStore.Instance.getLiveQuotaOf(this.id)
+ ? forceNumber(videoQuotaUsed) + LiveQuotaStore.Instance.getLiveQuotaOf(this.id)
: undefined,
videoQuotaUsedDaily: videoQuotaUsedDaily !== undefined
- ? parseInt(videoQuotaUsedDaily + '', 10) + LiveQuotaStore.Instance.getLiveQuotaOf(this.id)
+ ? forceNumber(videoQuotaUsedDaily) + LiveQuotaStore.Instance.getLiveQuotaOf(this.id)
: undefined,
videosCount: videosCount !== undefined
- ? parseInt(videosCount + '', 10)
+ ? forceNumber(videosCount)
: undefined,
abusesCount: abusesCount
- ? parseInt(abusesCount, 10)
+ ? forceNumber(abusesCount)
: undefined,
abusesAcceptedCount: abusesAcceptedCount
- ? parseInt(abusesAcceptedCount, 10)
+ ? forceNumber(abusesAcceptedCount)
: undefined,
abusesCreatedCount: abusesCreatedCount !== undefined
- ? parseInt(abusesCreatedCount + '', 10)
+ ? forceNumber(abusesCreatedCount)
: undefined,
videoCommentsCount: videoCommentsCount !== undefined
- ? parseInt(videoCommentsCount + '', 10)
+ ? forceNumber(videoCommentsCount)
: undefined,
noInstanceConfigWarningModal: this.noInstanceConfigWarningModal,