1 import { Observable, of } from 'rxjs'
2 import { map } from 'rxjs/operators'
3 import { User } from '@app/core/users/user.model'
5 flushUserInfoFromLocalStorage,
6 getUserInfoFromLocalStorage,
7 saveUserInfoIntoLocalStorage,
10 } from '@root-helpers/users'
11 import { hasUserRight } from '@shared/core-utils/users'
13 MyUser as ServerMyUserModel,
14 MyUserSpecialPlaylist,
15 User as ServerUserModel,
19 } from '@shared/models'
21 export class AuthUser extends User implements ServerMyUserModel {
23 specialPlaylists: MyUserSpecialPlaylist[]
25 canSeeVideosLink = true
28 const tokens = Tokens.load()
29 if (!tokens) return null
31 const userInfo = getUserInfoFromLocalStorage()
32 if (!userInfo) return null
34 return new AuthUser(userInfo, tokens)
38 flushUserInfoFromLocalStorage()
43 constructor (userHash: Partial<ServerMyUserModel>, hashTokens: TokenOptions) {
46 this.tokens = new Tokens(hashTokens)
47 this.specialPlaylists = userHash.specialPlaylists
51 return this.tokens.accessToken
55 return this.tokens.refreshToken
59 return this.tokens.tokenType
62 refreshTokens (accessToken: string, refreshToken: string) {
63 this.tokens.accessToken = accessToken
64 this.tokens.refreshToken = refreshToken
67 hasRight (right: UserRight) {
68 return hasUserRight(this.role, right)
71 canManage (user: ServerUserModel) {
72 const myRole = this.role
74 if (myRole === UserRole.ADMINISTRATOR) return true
76 // I'm a moderator: I can only manage users
77 return user.role === UserRole.USER
81 saveUserInfoIntoLocalStorage({
83 username: this.username,
86 nsfwPolicy: this.nsfwPolicy,
87 webTorrentEnabled: this.webTorrentEnabled,
88 autoPlayVideo: this.autoPlayVideo
94 computeCanSeeVideosLink (quotaObservable: Observable<UserVideoQuota>): Observable<boolean> {
95 if (!this.isUploadDisabled()) {
96 this.canSeeVideosLink = true
97 return of(this.canSeeVideosLink)
100 // Check if the user has videos
101 return quotaObservable.pipe(
102 map(({ videoQuotaUsed }) => {
103 if (videoQuotaUsed !== 0) {
104 // User already uploaded videos, so it can see the link
105 this.canSeeVideosLink = true
107 // No videos, no upload so the user don't need to see the videos link
108 this.canSeeVideosLink = false
111 return this.canSeeVideosLink