-import { Injectable } from '@angular/core';
-import { Http, Response, URLSearchParams } from '@angular/http';
-import { Observable } from 'rxjs/Rx';
-
-import { Pagination } from './pagination.model';
-import { Search } from '../../shared';
-import { SortField } from './sort-field.type';
-import { AuthService } from '../../shared';
-import { Video } from './video.model';
+import { Injectable } from '@angular/core'
+import { Observable } from 'rxjs/Observable'
+import 'rxjs/add/operator/catch'
+import 'rxjs/add/operator/map'
+import { HttpClient, HttpParams, HttpRequest } from '@angular/common/http'
+
+import { Search } from '../../shared'
+import { SortField } from './sort-field.type'
+import {
+ RestExtractor,
+ RestService,
+ UserService
+} from '../../shared'
+import { Video } from './video.model'
+import { VideoDetails } from './video-details.model'
+import { VideoEdit } from './video-edit.model'
+import { VideoPagination } from './video-pagination.model'
+import {
+ UserVideoRate,
+ VideoRateType,
+ VideoUpdate,
+ VideoAbuseCreate,
+ UserVideoRateUpdate,
+ Video as VideoServerModel,
+ VideoDetails as VideoDetailsServerModel,
+ ResultList
+} from '../../../../../shared'
@Injectable()
export class VideoService {
- private static BASE_VIDEO_URL = '/api/v1/videos/';
+ private static BASE_VIDEO_URL = API_URL + '/api/v1/videos/'
- constructor(
- private authService: AuthService,
- private http: Http
+ constructor (
+ private authHttp: HttpClient,
+ private restExtractor: RestExtractor,
+ private restService: RestService
) {}
- getVideo(id: string) {
- return this.http.get(VideoService.BASE_VIDEO_URL + id)
- .map(res => <Video> res.json())
- .catch(this.handleError);
+ getVideo (uuid: string): Observable<VideoDetails> {
+ return this.authHttp.get<VideoDetailsServerModel>(VideoService.BASE_VIDEO_URL + uuid)
+ .map(videoHash => new VideoDetails(videoHash))
+ .catch((res) => this.restExtractor.handleError(res))
}
- getVideos(pagination: Pagination, sort: SortField) {
- const params = this.createPaginationParams(pagination);
+ updateVideo (video: VideoEdit) {
+ const language = video.language ? video.language : null
+
+ const body: VideoUpdate = {
+ name: video.name,
+ category: video.category,
+ licence: video.licence,
+ language,
+ description: video.description,
+ tags: video.tags,
+ nsfw: video.nsfw
+ }
+
+ return this.authHttp.put(VideoService.BASE_VIDEO_URL + video.id, body)
+ .map(this.restExtractor.extractDataBool)
+ .catch(this.restExtractor.handleError)
+ }
- if (sort) params.set('sort', sort);
+ uploadVideo (video: FormData) {
+ const req = new HttpRequest('POST', VideoService.BASE_VIDEO_URL + 'upload', video, { reportProgress: true })
- return this.http.get(VideoService.BASE_VIDEO_URL, { search: params })
- .map(res => res.json())
- .map(this.extractVideos)
- .catch(this.handleError);
+ return this.authHttp.request(req)
+ .catch(this.restExtractor.handleError)
}
- removeVideo(id: string) {
- const options = this.authService.getAuthRequestOptions();
- return this.http.delete(VideoService.BASE_VIDEO_URL + id, options)
- .map(res => <number> res.status)
- .catch(this.handleError);
+ getVideos (videoPagination: VideoPagination, sort: SortField) {
+ const pagination = this.videoPaginationToRestPagination(videoPagination)
+
+ let params = new HttpParams()
+ params = this.restService.addRestGetParams(params, pagination, sort)
+
+ return this.authHttp.get(VideoService.BASE_VIDEO_URL, { params })
+ .map(this.extractVideos)
+ .catch((res) => this.restExtractor.handleError(res))
}
- searchVideos(search: Search, pagination: Pagination, sort: SortField) {
- const params = this.createPaginationParams(pagination);
+ searchVideos (search: Search, videoPagination: VideoPagination, sort: SortField) {
+ const url = VideoService.BASE_VIDEO_URL + 'search/' + encodeURIComponent(search.value)
- if (search.field) params.set('field', search.field);
- if (sort) params.set('sort', sort);
+ const pagination = this.videoPaginationToRestPagination(videoPagination)
- return this.http.get(VideoService.BASE_VIDEO_URL + 'search/' + encodeURIComponent(search.value), { search: params })
- .map(res => res.json())
- .map(this.extractVideos)
- .catch(this.handleError);
+ let params = new HttpParams()
+ params = this.restService.addRestGetParams(params, pagination, sort)
+
+ if (search.field) params.set('field', search.field)
+
+ return this.authHttp.get<ResultList<VideoServerModel>>(url, { params })
+ .map(this.extractVideos)
+ .catch((res) => this.restExtractor.handleError(res))
+ }
+
+ removeVideo (id: number) {
+ return this.authHttp.delete(VideoService.BASE_VIDEO_URL + id)
+ .map(this.restExtractor.extractDataBool)
+ .catch((res) => this.restExtractor.handleError(res))
}
- private createPaginationParams(pagination: Pagination) {
- const params = new URLSearchParams();
- const start: number = (pagination.currentPage - 1) * pagination.itemsPerPage;
- const count: number = pagination.itemsPerPage;
+ reportVideo (id: number, reason: string) {
+ const url = VideoService.BASE_VIDEO_URL + id + '/abuse'
+ const body: VideoAbuseCreate = {
+ reason
+ }
- params.set('start', start.toString());
- params.set('count', count.toString());
+ return this.authHttp.post(url, body)
+ .map(this.restExtractor.extractDataBool)
+ .catch(res => this.restExtractor.handleError(res))
+ }
- return params;
+ setVideoLike (id: number) {
+ return this.setVideoRate(id, 'like')
}
- private extractVideos(body: any) {
- const videos_json = body.data;
- const totalVideos = body.total;
- const videos = [];
- for (const video_json of videos_json) {
- videos.push(new Video(video_json));
+ setVideoDislike (id: number) {
+ return this.setVideoRate(id, 'dislike')
+ }
+
+ getUserVideoRating (id: number): Observable<UserVideoRate> {
+ const url = UserService.BASE_USERS_URL + 'me/videos/' + id + '/rating'
+
+ return this.authHttp.get(url)
+ .catch(res => this.restExtractor.handleError(res))
+ }
+
+ private videoPaginationToRestPagination (videoPagination: VideoPagination) {
+ const start: number = (videoPagination.currentPage - 1) * videoPagination.itemsPerPage
+ const count: number = videoPagination.itemsPerPage
+
+ return { start, count }
+ }
+
+ private setVideoRate (id: number, rateType: VideoRateType) {
+ const url = VideoService.BASE_VIDEO_URL + id + '/rate'
+ const body: UserVideoRateUpdate = {
+ rating: rateType
}
- return { videos, totalVideos };
+ return this.authHttp.put(url, body)
+ .map(this.restExtractor.extractDataBool)
+ .catch(res => this.restExtractor.handleError(res))
}
- private handleError(error: Response) {
- console.error(error);
- return Observable.throw(error.json().error || 'Server error');
+ private extractVideos (result: ResultList<VideoServerModel>) {
+ const videosJson = result.data
+ const totalVideos = result.total
+ const videos = []
+
+ for (const videoJson of videosJson) {
+ videos.push(new Video(videoJson))
+ }
+
+ return { videos, totalVideos }
}
}