1 import { SortMeta } from 'primeng/api'
2 import { from, Observable } from 'rxjs'
3 import { catchError, concatMap, map, toArray } from 'rxjs/operators'
4 import { HttpClient, HttpParams } from '@angular/common/http'
5 import { Injectable } from '@angular/core'
6 import { RestExtractor, RestPagination, RestService, UserService } from '@app/core'
7 import { getBytes } from '@root-helpers/bytes'
8 import { ResultList, User as UserServerModel, UserCreate, UserRole, UserUpdate } from '@shared/models'
11 export class UserAdminService {
14 private authHttp: HttpClient,
15 private restExtractor: RestExtractor,
16 private restService: RestService
19 addUser (userCreate: UserCreate) {
20 return this.authHttp.post(UserService.BASE_USERS_URL, userCreate)
21 .pipe(catchError(err => this.restExtractor.handleError(err)))
24 updateUser (userId: number, userUpdate: UserUpdate) {
25 return this.authHttp.put(UserService.BASE_USERS_URL + userId, userUpdate)
26 .pipe(catchError(err => this.restExtractor.handleError(err)))
29 updateUsers (users: UserServerModel[], userUpdate: UserUpdate) {
32 concatMap(u => this.authHttp.put(UserService.BASE_USERS_URL + u.id, userUpdate)),
34 catchError(err => this.restExtractor.handleError(err))
38 getUsers (parameters: {
39 pagination: RestPagination
42 }): Observable<ResultList<UserServerModel>> {
43 const { pagination, sort, search } = parameters
45 let params = new HttpParams()
46 params = this.restService.addRestGetParams(params, pagination, sort)
49 const filters = this.restService.parseQueryStringFilter(search, {
56 params = this.restService.addObjectParams(params, filters)
59 return this.authHttp.get<ResultList<UserServerModel>>(UserService.BASE_USERS_URL, { params })
61 map(res => this.restExtractor.convertResultListDateToHuman(res)),
62 map(res => this.restExtractor.applyToResultListData(res, this.formatUser.bind(this))),
63 catchError(err => this.restExtractor.handleError(err))
67 removeUser (usersArg: UserServerModel | UserServerModel[]) {
68 const users = Array.isArray(usersArg) ? usersArg : [ usersArg ]
72 concatMap(u => this.authHttp.delete(UserService.BASE_USERS_URL + u.id)),
74 catchError(err => this.restExtractor.handleError(err))
78 banUsers (usersArg: UserServerModel | UserServerModel[], reason?: string) {
79 const body = reason ? { reason } : {}
80 const users = Array.isArray(usersArg) ? usersArg : [ usersArg ]
84 concatMap(u => this.authHttp.post(UserService.BASE_USERS_URL + u.id + '/block', body)),
86 catchError(err => this.restExtractor.handleError(err))
90 unbanUsers (usersArg: UserServerModel | UserServerModel[]) {
91 const users = Array.isArray(usersArg) ? usersArg : [ usersArg ]
95 concatMap(u => this.authHttp.post(UserService.BASE_USERS_URL + u.id + '/unblock', {})),
97 catchError(err => this.restExtractor.handleError(err))
101 private formatUser (user: UserServerModel) {
103 if (user.videoQuota === -1) {
106 videoQuota = getBytes(user.videoQuota, 0)
109 const videoQuotaUsed = getBytes(user.videoQuotaUsed, 0)
111 let videoQuotaDaily: string
112 let videoQuotaUsedDaily: string
113 if (user.videoQuotaDaily === -1) {
114 videoQuotaDaily = '∞'
115 videoQuotaUsedDaily = getBytes(0, 0) + ''
117 videoQuotaDaily = getBytes(user.videoQuotaDaily, 0) + ''
118 videoQuotaUsedDaily = getBytes(user.videoQuotaUsedDaily || 0, 0) + ''
121 const roleLabels: { [ id in UserRole ]: string } = {
122 [UserRole.USER]: $localize`User`,
123 [UserRole.ADMINISTRATOR]: $localize`Administrator`,
124 [UserRole.MODERATOR]: $localize`Moderator`
127 return Object.assign(user, {
128 roleLabel: roleLabels[user.role],
131 rawVideoQuota: user.videoQuota,
132 rawVideoQuotaUsed: user.videoQuotaUsed,
135 rawVideoQuotaDaily: user.videoQuotaDaily,
136 rawVideoQuotaUsedDaily: user.videoQuotaUsedDaily