-import { Injectable } from '@angular/core';
-import { Http, Headers, RequestOptions } 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 { RateType } from './rate-type.type';
-import { AuthService } from '../../core';
+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 {
- AuthHttp,
RestExtractor,
- RestPagination,
RestService,
- ResultList,
UserService
-} from '../../shared';
-import { Video } from './video.model';
+} 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/';
-
- videoCategories: Array<{ id: number, label: string }> = [];
- videoLicences: Array<{ id: number, label: string }> = [];
- videoLanguages: Array<{ id: number, label: string }> = [];
+ 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
) {}
- loadVideoCategories() {
- return this.http.get(VideoService.BASE_VIDEO_URL + 'categories')
- .map(this.restExtractor.extractDataGet)
- .subscribe(data => {
- Object.keys(data).forEach(categoryKey => {
- this.videoCategories.push({
- id: parseInt(categoryKey),
- label: data[categoryKey]
- });
- });
- });
- }
-
- loadVideoLicences() {
- return this.http.get(VideoService.BASE_VIDEO_URL + 'licences')
- .map(this.restExtractor.extractDataGet)
- .subscribe(data => {
- Object.keys(data).forEach(licenceKey => {
- this.videoLicences.push({
- id: parseInt(licenceKey),
- label: data[licenceKey]
- });
- });
- });
- }
-
- loadVideoLanguages() {
- return this.http.get(VideoService.BASE_VIDEO_URL + 'languages')
- .map(this.restExtractor.extractDataGet)
- .subscribe(data => {
- Object.keys(data).forEach(languageKey => {
- this.videoLanguages.push({
- id: parseInt(languageKey),
- label: data[languageKey]
- });
- });
- });
+ 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))
}
- 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));
- }
+ updateVideo (video: VideoEdit) {
+ const language = video.language ? video.language : null
- updateVideo(video: Video) {
- const body = {
+ const body: VideoUpdate = {
name: video.name,
category: video.category,
licence: video.licence,
- language: video.language,
+ language,
description: video.description,
- tags: video.tags
- };
- const headers = new Headers({ 'Content-Type': 'application/json' });
- const options = new RequestOptions({ headers: headers });
+ tags: video.tags,
+ nsfw: video.nsfw
+ }
- return this.authHttp.put(`${VideoService.BASE_VIDEO_URL}/${video.id}`, body, options)
+ return this.authHttp.put(VideoService.BASE_VIDEO_URL + video.id, body)
.map(this.restExtractor.extractDataBool)
- .catch(this.restExtractor.handleError);
+ .catch(this.restExtractor.handleError)
}
- getVideos(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 })
- return this.http.get(VideoService.BASE_VIDEO_URL, { search: params })
- .map(res => res.json())
- .map(this.extractVideos)
- .catch((res) => this.restExtractor.handleError(res));
+ return this.authHttp.request(req)
+ .catch(this.restExtractor.handleError)
}
- removeVideo(id: string) {
- return this.authHttp.delete(VideoService.BASE_VIDEO_URL + id)
- .map(this.restExtractor.extractDataBool)
- .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))
}
- searchVideos(search: Search, pagination: RestPagination, sort: SortField) {
- const params = this.restService.buildRestGetParams(pagination, sort);
+ 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);
+ const pagination = this.videoPaginationToRestPagination(videoPagination)
- 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));
+ 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: string, reason: string) {
- const url = VideoService.BASE_VIDEO_URL + id + '/abuse';
- const body = {
+ reportVideo (id: number, reason: string) {
+ const url = VideoService.BASE_VIDEO_URL + id + '/abuse'
+ const body: VideoAbuseCreate = {
reason
- };
+ }
return this.authHttp.post(url, body)
.map(this.restExtractor.extractDataBool)
- .catch((res) => this.restExtractor.handleError(res));
+ .catch(res => this.restExtractor.handleError(res))
}
- setVideoLike(id: string) {
- return this.setVideoRate(id, 'like');
+ setVideoLike (id: number) {
+ return this.setVideoRate(id, 'like')
}
- setVideoDislike(id: string) {
- return this.setVideoRate(id, 'dislike');
+ setVideoDislike (id: number) {
+ return this.setVideoRate(id, 'dislike')
}
- getUserVideoRating(id: string) {
- const url = UserService.BASE_USERS_URL + '/me/videos/' + id + '/rating';
+ getUserVideoRating (id: number): Observable<UserVideoRate> {
+ const url = UserService.BASE_USERS_URL + 'me/videos/' + id + '/rating'
return this.authHttp.get(url)
- .map(this.restExtractor.extractDataGet)
- .catch((res) => this.restExtractor.handleError(res));
+ .catch(res => this.restExtractor.handleError(res))
}
- private setVideoRate(id: string, rateType: RateType) {
- const url = VideoService.BASE_VIDEO_URL + id + '/rate';
- const body = {
+ 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));
+ .catch(res => this.restExtractor.handleError(res))
}
- private extractVideos(result: ResultList) {
- const videosJson = result.data;
- const totalVideos = result.total;
- const videos = [];
+ 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 }
}
}