Reorganize client shared modules
[oweals/peertube.git] / client / src / app / shared / shared-moderation / video-block.service.ts
1 import { SortMeta } from 'primeng/api'
2 import { from as observableFrom, 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 } from '@app/core'
7 import { ResultList, VideoBlacklist, VideoBlacklistType } from '@shared/models'
8 import { environment } from '../../../environments/environment'
9
10 @Injectable()
11 export class VideoBlockService {
12   private static BASE_VIDEOS_URL = environment.apiUrl + '/api/v1/videos/'
13
14   constructor (
15     private authHttp: HttpClient,
16     private restService: RestService,
17     private restExtractor: RestExtractor
18   ) {}
19
20   listBlocks (options: {
21     pagination: RestPagination
22     sort: SortMeta
23     search?: string
24     type?: VideoBlacklistType
25   }): Observable<ResultList<VideoBlacklist>> {
26     const { pagination, sort, search, type } = options
27
28     let params = new HttpParams()
29     params = this.restService.addRestGetParams(params, pagination, sort)
30
31     if (search) {
32       const filters = this.restService.parseQueryStringFilter(search, {
33         type: {
34           prefix: 'type:',
35           handler: v => {
36             if (v === 'manual') return VideoBlacklistType.MANUAL
37             if (v === 'auto') return VideoBlacklistType.AUTO_BEFORE_PUBLISHED
38
39             return undefined
40           }
41         }
42       })
43
44       params = this.restService.addObjectParams(params, filters)
45     }
46     if (type) params = params.append('type', type.toString())
47
48     return this.authHttp.get<ResultList<VideoBlacklist>>(VideoBlockService.BASE_VIDEOS_URL + 'blacklist', { params })
49                .pipe(
50                  map(res => this.restExtractor.convertResultListDateToHuman(res)),
51                  catchError(res => this.restExtractor.handleError(res))
52                )
53   }
54
55   unblockVideo (videoIdArgs: number | number[]) {
56     const videoIds = Array.isArray(videoIdArgs) ? videoIdArgs : [ videoIdArgs ]
57
58     return observableFrom(videoIds)
59       .pipe(
60         concatMap(id => this.authHttp.delete(VideoBlockService.BASE_VIDEOS_URL + id + '/blacklist')),
61         toArray(),
62         catchError(err => this.restExtractor.handleError(err))
63       )
64   }
65
66   blockVideo (videoId: number, reason: string, unfederate: boolean) {
67     const body = {
68       unfederate,
69       reason
70     }
71
72     return this.authHttp.post(VideoBlockService.BASE_VIDEOS_URL + videoId + '/blacklist', body)
73                .pipe(
74                  map(this.restExtractor.extractDataBool),
75                  catchError(res => this.restExtractor.handleError(res))
76                )
77   }
78 }