1 import { SortMeta } from 'primeng/api'
2 import { from, Observable } from 'rxjs'
3 import { catchError, concatMap, map, switchMap, toArray } from 'rxjs/operators'
4 import { HttpClient, HttpParams } from '@angular/common/http'
5 import { Injectable } from '@angular/core'
6 import { RestExtractor, RestPagination, RestService, ServerService, UserService } from '@app/core'
7 import { getBytes } from '@root-helpers/bytes'
8 import { arrayify, peertubeTranslate } from '@shared/core-utils'
9 import { ResultList, User as UserServerModel, UserCreate, UserUpdate } from '@shared/models'
12 export class UserAdminService {
15 private authHttp: HttpClient,
16 private restExtractor: RestExtractor,
17 private restService: RestService,
18 private serverService: ServerService
21 addUser (userCreate: UserCreate) {
22 return this.authHttp.post(UserService.BASE_USERS_URL, userCreate)
23 .pipe(catchError(err => this.restExtractor.handleError(err)))
26 updateUser (userId: number, userUpdate: UserUpdate) {
27 return this.authHttp.put(UserService.BASE_USERS_URL + userId, userUpdate)
28 .pipe(catchError(err => this.restExtractor.handleError(err)))
31 updateUsers (users: UserServerModel[], userUpdate: UserUpdate) {
34 concatMap(u => this.authHttp.put(UserService.BASE_USERS_URL + u.id, userUpdate)),
36 catchError(err => this.restExtractor.handleError(err))
40 getUsers (parameters: {
41 pagination: RestPagination
44 }): Observable<ResultList<UserServerModel>> {
45 const { pagination, sort, search } = parameters
47 let params = new HttpParams()
48 params = this.restService.addRestGetParams(params, pagination, sort)
51 const filters = this.restService.parseQueryStringFilter(search, {
58 params = this.restService.addObjectParams(params, filters)
61 return this.authHttp.get<ResultList<UserServerModel>>(UserService.BASE_USERS_URL, { params })
64 return this.serverService.getServerLocale()
65 .pipe(map(translations => ({ data, translations })))
67 map(({ data, translations }) => {
68 return this.restExtractor.applyToResultListData(data, this.formatUser.bind(this), [ translations ])
70 catchError(err => this.restExtractor.handleError(err))
74 removeUsers (usersArg: UserServerModel | UserServerModel[]) {
75 const users = arrayify(usersArg)
79 concatMap(u => this.authHttp.delete(UserService.BASE_USERS_URL + u.id)),
81 catchError(err => this.restExtractor.handleError(err))
85 banUsers (usersArg: UserServerModel | UserServerModel[], reason?: string) {
86 const body = reason ? { reason } : {}
87 const users = arrayify(usersArg)
91 concatMap(u => this.authHttp.post(UserService.BASE_USERS_URL + u.id + '/block', body)),
93 catchError(err => this.restExtractor.handleError(err))
97 unbanUsers (usersArg: UserServerModel | UserServerModel[]) {
98 const users = arrayify(usersArg)
102 concatMap(u => this.authHttp.post(UserService.BASE_USERS_URL + u.id + '/unblock', {})),
104 catchError(err => this.restExtractor.handleError(err))
108 private formatUser (user: UserServerModel, translations: { [ id: string ]: string } = {}) {
110 if (user.videoQuota === -1) {
113 videoQuota = getBytes(user.videoQuota, 0)
116 const videoQuotaUsed = getBytes(user.videoQuotaUsed, 0)
118 let videoQuotaDaily: string
119 let videoQuotaUsedDaily: string
120 if (user.videoQuotaDaily === -1) {
121 videoQuotaDaily = '∞'
122 videoQuotaUsedDaily = getBytes(0, 0) + ''
124 videoQuotaDaily = getBytes(user.videoQuotaDaily, 0) + ''
125 videoQuotaUsedDaily = getBytes(user.videoQuotaUsedDaily || 0, 0) + ''
128 return Object.assign(user, {
131 label: peertubeTranslate(user.role.label, translations)
135 rawVideoQuota: user.videoQuota,
136 rawVideoQuotaUsed: user.videoQuotaUsed,
139 rawVideoQuotaDaily: user.videoQuotaDaily,
140 rawVideoQuotaUsedDaily: user.videoQuotaUsedDaily