]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - client/src/app/shared/shared-search/search.service.ts
Merge branch 'release/4.0.0' into develop
[github/Chocobozzz/PeerTube.git] / client / src / app / shared / shared-search / search.service.ts
1 import { Observable, of } from 'rxjs'
2 import { catchError, map, switchMap } from 'rxjs/operators'
3 import { HttpClient, HttpParams } from '@angular/common/http'
4 import { Injectable } from '@angular/core'
5 import { ComponentPaginationLight, RestExtractor, RestPagination, RestService } from '@app/core'
6 import { Video, VideoChannel, VideoChannelService, VideoService } from '@app/shared/shared-main'
7 import {
8 ResultList,
9 Video as VideoServerModel,
10 VideoChannel as VideoChannelServerModel,
11 VideoPlaylist as VideoPlaylistServerModel
12 } from '@shared/models'
13 import { environment } from '../../../environments/environment'
14 import { VideoPlaylist, VideoPlaylistService } from '../shared-video-playlist'
15 import { AdvancedSearch } from './advanced-search.model'
16
17 @Injectable()
18 export class SearchService {
19 static BASE_SEARCH_URL = environment.apiUrl + '/api/v1/search/'
20
21 constructor (
22 private authHttp: HttpClient,
23 private restExtractor: RestExtractor,
24 private restService: RestService,
25 private videoService: VideoService,
26 private playlistService: VideoPlaylistService
27 ) { }
28
29 searchVideos (parameters: {
30 search?: string
31 componentPagination?: ComponentPaginationLight
32 advancedSearch?: AdvancedSearch
33 uuids?: string[]
34 }): Observable<ResultList<Video>> {
35 const { search, uuids, componentPagination, advancedSearch } = parameters
36
37 if (advancedSearch?.resultType !== undefined && advancedSearch.resultType !== 'videos') {
38 return of({ total: 0, data: [] })
39 }
40
41 const url = SearchService.BASE_SEARCH_URL + 'videos'
42 let pagination: RestPagination
43
44 if (componentPagination) {
45 pagination = this.restService.componentToRestPagination(componentPagination)
46 }
47
48 let params = new HttpParams()
49 params = this.restService.addRestGetParams(params, pagination)
50
51 if (search) params = params.append('search', search)
52 if (uuids) params = this.restService.addArrayParams(params, 'uuids', uuids)
53
54 if (advancedSearch) {
55 const advancedSearchObject = advancedSearch.toVideosAPIObject()
56 params = this.restService.addObjectParams(params, advancedSearchObject)
57 }
58
59 return this.authHttp
60 .get<ResultList<VideoServerModel>>(url, { params })
61 .pipe(
62 switchMap(res => this.videoService.extractVideos(res)),
63 catchError(err => this.restExtractor.handleError(err))
64 )
65 }
66
67 searchVideoChannels (parameters: {
68 search?: string
69 advancedSearch?: AdvancedSearch
70 componentPagination?: ComponentPaginationLight
71 handles?: string[]
72 }): Observable<ResultList<VideoChannel>> {
73 const { search, advancedSearch, componentPagination, handles } = parameters
74
75 if (advancedSearch?.resultType !== undefined && advancedSearch.resultType !== 'channels') {
76 return of({ total: 0, data: [] })
77 }
78
79 const url = SearchService.BASE_SEARCH_URL + 'video-channels'
80
81 let pagination: RestPagination
82 if (componentPagination) {
83 pagination = this.restService.componentToRestPagination(componentPagination)
84 }
85
86 let params = new HttpParams()
87 params = this.restService.addRestGetParams(params, pagination)
88
89 if (search) params = params.append('search', search)
90 if (handles) params = this.restService.addArrayParams(params, 'handles', handles)
91
92 if (advancedSearch) {
93 const advancedSearchObject = advancedSearch.toChannelAPIObject()
94 params = this.restService.addObjectParams(params, advancedSearchObject)
95 }
96
97 return this.authHttp
98 .get<ResultList<VideoChannelServerModel>>(url, { params })
99 .pipe(
100 map(res => VideoChannelService.extractVideoChannels(res)),
101 catchError(err => this.restExtractor.handleError(err))
102 )
103 }
104
105 searchVideoPlaylists (parameters: {
106 search?: string
107 advancedSearch?: AdvancedSearch
108 componentPagination?: ComponentPaginationLight
109 uuids?: string[]
110 }): Observable<ResultList<VideoPlaylist>> {
111 const { search, advancedSearch, componentPagination, uuids } = parameters
112
113 if (advancedSearch?.resultType !== undefined && advancedSearch.resultType !== 'playlists') {
114 return of({ total: 0, data: [] })
115 }
116
117 const url = SearchService.BASE_SEARCH_URL + 'video-playlists'
118
119 let pagination: RestPagination
120 if (componentPagination) {
121 pagination = this.restService.componentToRestPagination(componentPagination)
122 }
123
124 let params = new HttpParams()
125 params = this.restService.addRestGetParams(params, pagination)
126
127 if (search) params = params.append('search', search)
128 if (uuids) params = this.restService.addArrayParams(params, 'uuids', uuids)
129
130 if (advancedSearch) {
131 const advancedSearchObject = advancedSearch.toPlaylistAPIObject()
132 params = this.restService.addObjectParams(params, advancedSearchObject)
133 }
134
135 return this.authHttp
136 .get<ResultList<VideoPlaylistServerModel>>(url, { params })
137 .pipe(
138 switchMap(res => this.playlistService.extractPlaylists(res)),
139 catchError(err => this.restExtractor.handleError(err))
140 )
141 }
142 }