]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - client/src/app/core/users/user.service.ts
Use random port for mock servers in tests
[github/Chocobozzz/PeerTube.git] / client / src / app / core / users / user.service.ts
index 6e7a485192d76946b585bdb7b0a07cd58b463982..47db985e12f00036234131e7b665a5b5b3efc005 100644 (file)
@@ -4,12 +4,10 @@ import { catchError, concatMap, filter, first, map, shareReplay, throttleTime, t
 import { HttpClient, HttpParams } from '@angular/common/http'
 import { Injectable } from '@angular/core'
 import { AuthService } from '@app/core/auth'
-import { BytesPipe } from '@app/shared/shared-main'
-import { I18n } from '@ngx-translate/i18n-polyfill'
+import { getBytes } from '@root-helpers/bytes'
 import { UserLocalStorageKeys } from '@root-helpers/users'
 import {
-  Avatar,
-  NSFWPolicyType,
+  ActorImage,
   ResultList,
   User as UserServerModel,
   UserCreate,
@@ -28,8 +26,6 @@ import { User } from './user.model'
 export class UserService {
   static BASE_USERS_URL = environment.apiUrl + '/api/v1/users/'
 
-  private bytesPipe = new BytesPipe()
-
   private userCache: { [ id: number ]: Observable<UserServerModel> } = {}
 
   constructor (
@@ -38,9 +34,8 @@ export class UserService {
     private restExtractor: RestExtractor,
     private restService: RestService,
     private localStorageService: LocalStorageService,
-    private sessionStorageService: SessionStorageService,
-    private i18n: I18n
-  ) { }
+    private sessionStorageService: SessionStorageService
+    ) { }
 
   changePassword (currentPassword: string, newPassword: string) {
     const url = UserService.BASE_USERS_URL + 'me'
@@ -81,17 +76,34 @@ export class UserService {
   }
 
   updateMyAnonymousProfile (profile: UserUpdateMe) {
-    try {
-      this.localStorageService.setItem(UserLocalStorageKeys.NSFW_POLICY, profile.nsfwPolicy)
-      this.localStorageService.setItem(UserLocalStorageKeys.WEBTORRENT_ENABLED, profile.webTorrentEnabled)
+    const localStorageKeys: { [ id in keyof UserUpdateMe ]: string } = {
+      nsfwPolicy: UserLocalStorageKeys.NSFW_POLICY,
+      webTorrentEnabled: UserLocalStorageKeys.WEBTORRENT_ENABLED,
+      autoPlayNextVideo: UserLocalStorageKeys.AUTO_PLAY_VIDEO,
+      autoPlayNextVideoPlaylist: UserLocalStorageKeys.AUTO_PLAY_VIDEO_PLAYLIST,
+      theme: UserLocalStorageKeys.THEME,
+      videoLanguages: UserLocalStorageKeys.VIDEO_LANGUAGES
+    }
 
-      this.localStorageService.setItem(UserLocalStorageKeys.AUTO_PLAY_VIDEO, profile.autoPlayNextVideo)
-      this.localStorageService.setItem(UserLocalStorageKeys.AUTO_PLAY_VIDEO_PLAYLIST, profile.autoPlayNextVideoPlaylist)
+    const obj = Object.keys(localStorageKeys)
+      .filter(key => key in profile)
+      .map(key => ([ localStorageKeys[key], profile[key] ]))
 
-      this.localStorageService.setItem(UserLocalStorageKeys.THEME, profile.theme)
-      this.localStorageService.setItem(UserLocalStorageKeys.VIDEO_LANGUAGES, profile.videoLanguages)
-    } catch (err) {
-      console.error(`Cannot set item in localStorage. Likely due to a value impossible to stringify.`, err)
+    for (const [ key, value ] of obj) {
+      try {
+        if (value === undefined) {
+          this.localStorageService.removeItem(key)
+          continue
+        }
+
+        const localStorageValue = typeof value === 'string'
+          ? value
+          : JSON.stringify(value)
+
+        this.localStorageService.setItem(key, localStorageValue)
+      } catch (err) {
+        console.error(`Cannot set ${key}->${value} in localStorage. Likely due to a value impossible to stringify.`, err)
+      }
     }
   }
 
@@ -123,10 +135,20 @@ export class UserService {
   changeAvatar (avatarForm: FormData) {
     const url = UserService.BASE_USERS_URL + 'me/avatar/pick'
 
-    return this.authHttp.post<{ avatar: Avatar }>(url, avatarForm)
+    return this.authHttp.post<{ avatar: ActorImage }>(url, avatarForm)
                .pipe(catchError(err => this.restExtractor.handleError(err)))
   }
 
+  deleteAvatar () {
+    const url = UserService.BASE_USERS_URL + 'me/avatar'
+
+    return this.authHttp.delete(url)
+               .pipe(
+                 map(this.restExtractor.extractDataBool),
+                 catchError(err => this.restExtractor.handleError(err))
+               )
+  }
+
   signup (userCreate: UserRegister) {
     return this.authHttp.post(UserService.BASE_USERS_URL + 'register', userCreate)
                .pipe(
@@ -260,7 +282,10 @@ export class UserService {
     let videoLanguages: string[]
 
     try {
-      videoLanguages = JSON.parse(this.localStorageService.getItem(UserLocalStorageKeys.VIDEO_LANGUAGES))
+      const languagesString = this.localStorageService.getItem(UserLocalStorageKeys.VIDEO_LANGUAGES)
+      videoLanguages = languagesString && languagesString !== 'undefined'
+        ? JSON.parse(languagesString)
+        : null
     } catch (err) {
       videoLanguages = null
       console.error('Cannot parse desired video languages from localStorage.', err)
@@ -268,7 +293,7 @@ export class UserService {
 
     return new User({
       // local storage keys
-      nsfwPolicy: this.localStorageService.getItem(UserLocalStorageKeys.NSFW_POLICY) as NSFWPolicyType,
+      nsfwPolicy: this.localStorageService.getItem(UserLocalStorageKeys.NSFW_POLICY),
       webTorrentEnabled: this.localStorageService.getItem(UserLocalStorageKeys.WEBTORRENT_ENABLED) !== 'false',
       theme: this.localStorageService.getItem(UserLocalStorageKeys.THEME) || 'instance-default',
       videoLanguages,
@@ -295,13 +320,7 @@ export class UserService {
       const filters = this.restService.parseQueryStringFilter(search, {
         blocked: {
           prefix: 'banned:',
-          isBoolean: true,
-          handler: v => {
-            if (v === 'true') return v
-            if (v === 'false') return v
-
-            return undefined
-          }
+          isBoolean: true
         }
       })
 
@@ -367,25 +386,25 @@ export class UserService {
     if (user.videoQuota === -1) {
       videoQuota = '∞'
     } else {
-      videoQuota = this.bytesPipe.transform(user.videoQuota, 0)
+      videoQuota = getBytes(user.videoQuota, 0)
     }
 
-    const videoQuotaUsed = this.bytesPipe.transform(user.videoQuotaUsed, 0)
+    const videoQuotaUsed = getBytes(user.videoQuotaUsed, 0)
 
     let videoQuotaDaily: string
     let videoQuotaUsedDaily: string
     if (user.videoQuotaDaily === -1) {
       videoQuotaDaily = '∞'
-      videoQuotaUsedDaily = this.bytesPipe.transform(0, 0) + ''
+      videoQuotaUsedDaily = getBytes(0, 0) + ''
     } else {
-      videoQuotaDaily = this.bytesPipe.transform(user.videoQuotaDaily, 0) + ''
-      videoQuotaUsedDaily = this.bytesPipe.transform(user.videoQuotaUsedDaily || 0, 0) + ''
+      videoQuotaDaily = getBytes(user.videoQuotaDaily, 0) + ''
+      videoQuotaUsedDaily = getBytes(user.videoQuotaUsedDaily || 0, 0) + ''
     }
 
     const roleLabels: { [ id in UserRole ]: string } = {
-      [UserRole.USER]: this.i18n('User'),
-      [UserRole.ADMINISTRATOR]: this.i18n('Administrator'),
-      [UserRole.MODERATOR]: this.i18n('Moderator')
+      [UserRole.USER]: $localize`User`,
+      [UserRole.ADMINISTRATOR]: $localize`Administrator`,
+      [UserRole.MODERATOR]: $localize`Moderator`
     }
 
     return Object.assign(user, {