+ static autoComplete (search: string) {
+ const query = {
+ where: {
+ username: {
+ [Op.like]: `%${search}%`
+ }
+ },
+ limit: 10
+ }
+
+ return UserModel.findAll(query)
+ .then(u => u.map(u => u.username))
+ }
+
+ hasRight (right: UserRight) {
+ return hasUserRight(this.role, right)
+ }
+
+ hasAdminFlag (flag: UserAdminFlag) {
+ return this.adminFlags & flag
+ }
+
+ isPasswordMatch (password: string) {
+ return comparePassword(password, this.password)
+ }
+
+ toFormattedJSON (this: MUserFormattable, parameters: { withAdminFlags?: boolean } = {}): User {
+ const videoQuotaUsed = this.get('videoQuotaUsed')
+ const videoQuotaUsedDaily = this.get('videoQuotaUsedDaily')
+ const videosCount = this.get('videosCount')
+ const [ abusesCount, abusesAcceptedCount ] = (this.get('abusesCount') as string || ':').split(':')
+ const abusesCreatedCount = this.get('abusesCreatedCount')
+ const videoCommentsCount = this.get('videoCommentsCount')
+
+ const json: User = {
+ id: this.id,
+ username: this.username,
+ email: this.email,
+ theme: getThemeOrDefault(this.theme, DEFAULT_USER_THEME_NAME),
+
+ pendingEmail: this.pendingEmail,
+ emailVerified: this.emailVerified,
+
+ nsfwPolicy: this.nsfwPolicy,
+
+ // FIXME: deprecated in 4.1
+ webTorrentEnabled: this.p2pEnabled,
+ p2pEnabled: this.p2pEnabled,
+
+ videosHistoryEnabled: this.videosHistoryEnabled,
+ autoPlayVideo: this.autoPlayVideo,
+ autoPlayNextVideo: this.autoPlayNextVideo,
+ autoPlayNextVideoPlaylist: this.autoPlayNextVideoPlaylist,
+ videoLanguages: this.videoLanguages,
+
+ role: this.role,
+ roleLabel: USER_ROLE_LABELS[this.role],
+
+ videoQuota: this.videoQuota,
+ videoQuotaDaily: this.videoQuotaDaily,
+
+ videoQuotaUsed: videoQuotaUsed !== undefined
+ ? parseInt(videoQuotaUsed + '', 10) + LiveQuotaStore.Instance.getLiveQuotaOf(this.id)
+ : undefined,
+
+ videoQuotaUsedDaily: videoQuotaUsedDaily !== undefined
+ ? parseInt(videoQuotaUsedDaily + '', 10) + LiveQuotaStore.Instance.getLiveQuotaOf(this.id)
+ : undefined,
+
+ videosCount: videosCount !== undefined
+ ? parseInt(videosCount + '', 10)
+ : undefined,
+ abusesCount: abusesCount
+ ? parseInt(abusesCount, 10)
+ : undefined,
+ abusesAcceptedCount: abusesAcceptedCount
+ ? parseInt(abusesAcceptedCount, 10)
+ : undefined,
+ abusesCreatedCount: abusesCreatedCount !== undefined
+ ? parseInt(abusesCreatedCount + '', 10)
+ : undefined,
+ videoCommentsCount: videoCommentsCount !== undefined
+ ? parseInt(videoCommentsCount + '', 10)
+ : undefined,
+
+ noInstanceConfigWarningModal: this.noInstanceConfigWarningModal,
+ noWelcomeModal: this.noWelcomeModal,
+ noAccountSetupWarningModal: this.noAccountSetupWarningModal,
+
+ blocked: this.blocked,
+ blockedReason: this.blockedReason,
+
+ account: this.Account.toFormattedJSON(),
+
+ notificationSettings: this.NotificationSetting
+ ? this.NotificationSetting.toFormattedJSON()
+ : undefined,
+
+ videoChannels: [],
+
+ createdAt: this.createdAt,
+
+ pluginAuth: this.pluginAuth,
+
+ lastLoginDate: this.lastLoginDate
+ }
+
+ if (parameters.withAdminFlags) {
+ Object.assign(json, { adminFlags: this.adminFlags })
+ }
+
+ if (Array.isArray(this.Account.VideoChannels) === true) {
+ json.videoChannels = this.Account.VideoChannels
+ .map(c => c.toFormattedJSON())
+ .sort((v1, v2) => {
+ if (v1.createdAt < v2.createdAt) return -1
+ if (v1.createdAt === v2.createdAt) return 0
+
+ return 1
+ })
+ }
+
+ return json
+ }
+
+ toMeFormattedJSON (this: MMyUserFormattable): MyUser {
+ const formatted = this.toFormattedJSON({ withAdminFlags: true })
+
+ const specialPlaylists = this.Account.VideoPlaylists
+ .map(p => ({ id: p.id, name: p.name, type: p.type }))
+
+ return Object.assign(formatted, { specialPlaylists })
+ }