8b66e122cb26e7e44e1c25de6ab9e1447a63715e
[oweals/peertube.git] / client / src / app / shared / video-playlist / video-playlist.service.ts
1 import { catchError, map, switchMap } from 'rxjs/operators'
2 import { Injectable } from '@angular/core'
3 import { Observable } from 'rxjs'
4 import { RestExtractor } from '../rest/rest-extractor.service'
5 import { HttpClient } from '@angular/common/http'
6 import { ResultList } from '../../../../../shared'
7 import { environment } from '../../../environments/environment'
8 import { VideoPlaylist as VideoPlaylistServerModel } from '@shared/models/videos/playlist/video-playlist.model'
9 import { VideoChannelService } from '@app/shared/video-channel/video-channel.service'
10 import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
11 import { VideoPlaylistCreate } from '@shared/models/videos/playlist/video-playlist-create.model'
12 import { VideoPlaylistUpdate } from '@shared/models/videos/playlist/video-playlist-update.model'
13 import { objectToFormData } from '@app/shared/misc/utils'
14 import { ServerService } from '@app/core'
15 import { VideoPlaylist } from '@app/shared/video-playlist/video-playlist.model'
16 import { AccountService } from '@app/shared/account/account.service'
17 import { Account } from '@app/shared/account/account.model'
18
19 @Injectable()
20 export class VideoPlaylistService {
21   static BASE_VIDEO_PLAYLIST_URL = environment.apiUrl + '/api/v1/video-playlists/'
22
23   constructor (
24     private authHttp: HttpClient,
25     private serverService: ServerService,
26     private restExtractor: RestExtractor
27   ) { }
28
29   listChannelPlaylists (videoChannel: VideoChannel): Observable<ResultList<VideoPlaylist>> {
30     const url = VideoChannelService.BASE_VIDEO_CHANNEL_URL + videoChannel.nameWithHost + '/video-playlists'
31
32     return this.authHttp.get<ResultList<VideoPlaylist>>(url)
33                .pipe(
34                  switchMap(res => this.extractPlaylists(res)),
35                  catchError(err => this.restExtractor.handleError(err))
36                )
37   }
38
39   listAccountPlaylists (account: Account): Observable<ResultList<VideoPlaylist>> {
40     const url = AccountService.BASE_ACCOUNT_URL + account.nameWithHost + '/video-playlists'
41
42     return this.authHttp.get<ResultList<VideoPlaylist>>(url)
43                .pipe(
44                  switchMap(res => this.extractPlaylists(res)),
45                  catchError(err => this.restExtractor.handleError(err))
46                )
47   }
48
49   getVideoPlaylist (id: string | number) {
50     const url = VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL + id
51
52     return this.authHttp.get<VideoPlaylist>(url)
53                .pipe(
54                  switchMap(res => this.extractPlaylist(res)),
55                  catchError(err => this.restExtractor.handleError(err))
56                )
57   }
58
59   createVideoPlaylist (body: VideoPlaylistCreate) {
60     const data = objectToFormData(body)
61
62     return this.authHttp.post(VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL, data)
63                .pipe(
64                  map(this.restExtractor.extractDataBool),
65                  catchError(err => this.restExtractor.handleError(err))
66                )
67   }
68
69   updateVideoPlaylist (videoPlaylist: VideoPlaylist, body: VideoPlaylistUpdate) {
70     const data = objectToFormData(body)
71
72     return this.authHttp.put(VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL + videoPlaylist.id, data)
73                .pipe(
74                  map(this.restExtractor.extractDataBool),
75                  catchError(err => this.restExtractor.handleError(err))
76                )
77   }
78
79   removeVideoPlaylist (videoPlaylist: VideoPlaylist) {
80     return this.authHttp.delete(VideoPlaylistService.BASE_VIDEO_PLAYLIST_URL + videoPlaylist.id)
81                .pipe(
82                  map(this.restExtractor.extractDataBool),
83                  catchError(err => this.restExtractor.handleError(err))
84                )
85   }
86
87   extractPlaylists (result: ResultList<VideoPlaylistServerModel>) {
88     return this.serverService.localeObservable
89                .pipe(
90                  map(translations => {
91                    const playlistsJSON = result.data
92                    const total = result.total
93                    const playlists: VideoPlaylist[] = []
94
95                    for (const playlistJSON of playlistsJSON) {
96                      playlists.push(new VideoPlaylist(playlistJSON, translations))
97                    }
98
99                    return { data: playlists, total }
100                  })
101                )
102   }
103
104   extractPlaylist (playlist: VideoPlaylistServerModel) {
105     return this.serverService.localeObservable
106                .pipe(map(translations => new VideoPlaylist(playlist, translations)))
107   }
108 }