-import { Injectable } from '@angular/core';
-import { Http } from '@angular/http';
-import { Observable } from 'rxjs/Observable';
-import 'rxjs/add/operator/catch';
-import 'rxjs/add/operator/map';
-
-import { Search } from '../../shared';
-import { SortField } from './sort-field.type';
-import { AuthService } from '../../core';
-import { AuthHttp, RestExtractor, RestPagination, RestService, ResultList } 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 authHttp: AuthHttp,
- private http: Http,
+ constructor (
+ private authHttp: HttpClient,
private restExtractor: RestExtractor,
private restService: RestService
) {}
- getVideo(id: string): Observable<Video> {
- return this.http.get(VideoService.BASE_VIDEO_URL + id)
- .map(this.restExtractor.extractDataGet)
- .map(video_hash => new Video(video_hash))
- .catch((res) => this.restExtractor.handleError(res));
+ 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: RestPagination, sort: SortField) {
- const params = this.restService.buildRestGetParams(pagination, sort);
+ updateVideo (video: VideoEdit) {
+ const language = video.language ? video.language : null
- return this.http.get(VideoService.BASE_VIDEO_URL, { search: params })
- .map(res => res.json())
- .map(this.extractVideos)
- .catch((res) => this.restExtractor.handleError(res));
- }
+ const body: VideoUpdate = {
+ name: video.name,
+ category: video.category,
+ licence: video.licence,
+ language,
+ description: video.description,
+ tags: video.tags,
+ nsfw: video.nsfw
+ }
- removeVideo(id: string) {
- return this.authHttp.delete(VideoService.BASE_VIDEO_URL + id)
+ return this.authHttp.put(VideoService.BASE_VIDEO_URL + video.id, body)
.map(this.restExtractor.extractDataBool)
- .catch((res) => this.restExtractor.handleError(res));
+ .catch(this.restExtractor.handleError)
}
- searchVideos(search: Search, pagination: RestPagination, sort: SortField) {
- const params = this.restService.buildRestGetParams(pagination, sort);
+ uploadVideo (video: FormData) {
+ const req = new HttpRequest('POST', VideoService.BASE_VIDEO_URL + 'upload', video, { reportProgress: true })
- if (search.field) params.set('field', search.field);
+ return this.authHttp.request(req)
+ .catch(this.restExtractor.handleError)
+ }
- return this.http.get(VideoService.BASE_VIDEO_URL + 'search/' + encodeURIComponent(search.value), { search: params })
- .map(this.restExtractor.extractDataList)
- .map(this.extractVideos)
- .catch((res) => this.restExtractor.handleError(res));
+ 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))
}
- reportVideo(id: string, reason: string) {
- const body = {
+ searchVideos (search: Search, videoPagination: VideoPagination, sort: SortField) {
+ const url = VideoService.BASE_VIDEO_URL + 'search/' + encodeURIComponent(search.value)
+
+ const pagination = this.videoPaginationToRestPagination(videoPagination)
+
+ 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))
+ }
+
+ reportVideo (id: number, reason: string) {
+ const url = VideoService.BASE_VIDEO_URL + id + '/abuse'
+ const body: VideoAbuseCreate = {
reason
- };
- const url = VideoService.BASE_VIDEO_URL + id + '/abuse';
+ }
return this.authHttp.post(url, body)
- .map(this.restExtractor.extractDataBool)
- .catch((res) => this.restExtractor.handleError(res));
+ .map(this.restExtractor.extractDataBool)
+ .catch(res => this.restExtractor.handleError(res))
+ }
+
+ setVideoLike (id: number) {
+ return this.setVideoRate(id, 'like')
+ }
+
+ setVideoDislike (id: number) {
+ return this.setVideoRate(id, 'dislike')
}
- private extractVideos(result: ResultList) {
- const videosJson = result.data;
- const totalVideos = result.total;
- const videos = [];
+ 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 this.authHttp.put(url, body)
+ .map(this.restExtractor.extractDataBool)
+ .catch(res => this.restExtractor.handleError(res))
+ }
+
+ 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));
+ videos.push(new Video(videoJson))
}
- return { videos, totalVideos };
+ return { videos, totalVideos }
}
}