Merge branch 'release/v1.3.0' into develop
[oweals/peertube.git] / client / src / app / shared / video-blacklist / video-blacklist.service.ts
1 import { catchError, map, concatMap, toArray } from 'rxjs/operators'
2 import { HttpClient, HttpParams } from '@angular/common/http'
3 import { Injectable } from '@angular/core'
4 import { SortMeta } from 'primeng/components/common/sortmeta'
5 import { from as observableFrom, Observable } from 'rxjs'
6 import { VideoBlacklist, VideoBlacklistType, ResultList } from '../../../../../shared'
7 import { Video } from '../video/video.model'
8 import { environment } from '../../../environments/environment'
9 import { RestExtractor, RestPagination, RestService } from '../rest'
10 import { ComponentPagination } from '../rest/component-pagination.model'
11
12 @Injectable()
13 export class VideoBlacklistService {
14   private static BASE_VIDEOS_URL = environment.apiUrl + '/api/v1/videos/'
15
16   constructor (
17     private authHttp: HttpClient,
18     private restService: RestService,
19     private restExtractor: RestExtractor
20   ) {}
21
22   listBlacklist (pagination: RestPagination, sort: SortMeta, type?: VideoBlacklistType): Observable<ResultList<VideoBlacklist>> {
23     let params = new HttpParams()
24     params = this.restService.addRestGetParams(params, pagination, sort)
25
26     if (type) {
27       params = params.set('type', type.toString())
28     }
29
30     return this.authHttp.get<ResultList<VideoBlacklist>>(VideoBlacklistService.BASE_VIDEOS_URL + 'blacklist', { params })
31                .pipe(
32                  map(res => this.restExtractor.convertResultListDateToHuman(res)),
33                  catchError(res => this.restExtractor.handleError(res))
34                )
35   }
36
37   getAutoBlacklistedAsVideoList (videoPagination: ComponentPagination): Observable<{ videos: Video[], totalVideos: number}> {
38     const pagination = this.restService.componentPaginationToRestPagination(videoPagination)
39
40     // prioritize first created since waiting longest
41     const AUTO_BLACKLIST_SORT = 'createdAt'
42
43     let params = new HttpParams()
44     params = this.restService.addRestGetParams(params, pagination, AUTO_BLACKLIST_SORT)
45
46     params = params.set('type', VideoBlacklistType.AUTO_BEFORE_PUBLISHED.toString())
47
48     return this.authHttp.get<ResultList<VideoBlacklist>>(VideoBlacklistService.BASE_VIDEOS_URL + 'blacklist', { params })
49               .pipe(
50                 map(res => {
51                   const videos = res.data.map(videoBlacklist => new Video(videoBlacklist.video))
52                   const totalVideos = res.total
53                   return { videos, totalVideos }
54                 }),
55                 catchError(res => this.restExtractor.handleError(res))
56               )
57   }
58
59   removeVideoFromBlacklist (videoIdArgs: number | number[]) {
60     const videoIds = Array.isArray(videoIdArgs) ? videoIdArgs : [ videoIdArgs ]
61
62     return observableFrom(videoIds)
63       .pipe(
64         concatMap(id => this.authHttp.delete(VideoBlacklistService.BASE_VIDEOS_URL + id + '/blacklist')),
65         toArray(),
66         catchError(err => this.restExtractor.handleError(err))
67       )
68   }
69
70   blacklistVideo (videoId: number, reason: string, unfederate: boolean) {
71     const body = {
72       unfederate,
73       reason
74     }
75
76     return this.authHttp.post(VideoBlacklistService.BASE_VIDEOS_URL + videoId + '/blacklist', body)
77                .pipe(
78                  map(this.restExtractor.extractDataBool),
79                  catchError(res => this.restExtractor.handleError(res))
80                )
81   }
82 }