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'
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'
18 export class SearchService {
19 static BASE_SEARCH_URL = environment.apiUrl + '/api/v1/search/'
22 private authHttp: HttpClient,
23 private restExtractor: RestExtractor,
24 private restService: RestService,
25 private videoService: VideoService,
26 private playlistService: VideoPlaylistService
29 searchVideos (parameters: {
31 componentPagination?: ComponentPaginationLight
32 advancedSearch?: AdvancedSearch
34 }): Observable<ResultList<Video>> {
35 const { search, uuids, componentPagination, advancedSearch } = parameters
37 if (advancedSearch?.resultType !== undefined && advancedSearch.resultType !== 'videos') {
38 return of({ total: 0, data: [] })
41 const url = SearchService.BASE_SEARCH_URL + 'videos'
42 let pagination: RestPagination
44 if (componentPagination) {
45 pagination = this.restService.componentToRestPagination(componentPagination)
48 let params = new HttpParams()
49 params = this.restService.addRestGetParams(params, pagination)
51 if (search) params = params.append('search', search)
52 if (uuids) params = this.restService.addArrayParams(params, 'uuids', uuids)
55 const advancedSearchObject = advancedSearch.toVideosAPIObject()
56 params = this.restService.addObjectParams(params, advancedSearchObject)
60 .get<ResultList<VideoServerModel>>(url, { params })
62 switchMap(res => this.videoService.extractVideos(res)),
63 catchError(err => this.restExtractor.handleError(err))
67 searchVideoChannels (parameters: {
69 advancedSearch?: AdvancedSearch
70 componentPagination?: ComponentPaginationLight
72 }): Observable<ResultList<VideoChannel>> {
73 const { search, advancedSearch, componentPagination, handles } = parameters
75 if (advancedSearch?.resultType !== undefined && advancedSearch.resultType !== 'channels') {
76 return of({ total: 0, data: [] })
79 const url = SearchService.BASE_SEARCH_URL + 'video-channels'
81 let pagination: RestPagination
82 if (componentPagination) {
83 pagination = this.restService.componentToRestPagination(componentPagination)
86 let params = new HttpParams()
87 params = this.restService.addRestGetParams(params, pagination)
89 if (search) params = params.append('search', search)
90 if (handles) params = this.restService.addArrayParams(params, 'handles', handles)
93 const advancedSearchObject = advancedSearch.toChannelAPIObject()
94 params = this.restService.addObjectParams(params, advancedSearchObject)
98 .get<ResultList<VideoChannelServerModel>>(url, { params })
100 map(res => VideoChannelService.extractVideoChannels(res)),
101 catchError(err => this.restExtractor.handleError(err))
105 searchVideoPlaylists (parameters: {
107 advancedSearch?: AdvancedSearch
108 componentPagination?: ComponentPaginationLight
110 }): Observable<ResultList<VideoPlaylist>> {
111 const { search, advancedSearch, componentPagination, uuids } = parameters
113 if (advancedSearch?.resultType !== undefined && advancedSearch.resultType !== 'playlists') {
114 return of({ total: 0, data: [] })
117 const url = SearchService.BASE_SEARCH_URL + 'video-playlists'
119 let pagination: RestPagination
120 if (componentPagination) {
121 pagination = this.restService.componentToRestPagination(componentPagination)
124 let params = new HttpParams()
125 params = this.restService.addRestGetParams(params, pagination)
127 if (search) params = params.append('search', search)
128 if (uuids) params = this.restService.addArrayParams(params, 'uuids', uuids)
130 if (advancedSearch) {
131 const advancedSearchObject = advancedSearch.toPlaylistAPIObject()
132 params = this.restService.addObjectParams(params, advancedSearchObject)
136 .get<ResultList<VideoPlaylistServerModel>>(url, { params })
138 switchMap(res => this.playlistService.extractPlaylists(res)),
139 catchError(err => this.restExtractor.handleError(err))