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 { HttpClient, HttpParams, HttpRequest } from '@angular/common/http'
import { Search } from '../../shared'
import { SortField } from './sort-field.type'
-import { AuthService } from '../../core'
import {
- AuthHttp,
RestExtractor,
- RestPagination,
RestService,
- ResultList,
UserService
} from '../../shared'
import { Video } from './video.model'
-import { UserVideoRate, VideoRateType } from '../../../../../shared'
+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_URL + '/api/v1/videos/'
- videoCategories: Array<{ id: number, label: string }> = []
- videoLicences: Array<{ id: number, label: string }> = []
- videoLanguages: Array<{ id: number, label: string }> = []
-
constructor (
- private authService: AuthService,
- private authHttp: AuthHttp,
- private http: Http,
+ 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, 10),
- 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, 10),
- 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, 10),
- label: data[languageKey]
- })
- })
- })
- }
-
- getVideo (id: string): Observable<Video> {
- return this.http.get(VideoService.BASE_VIDEO_URL + id)
- .map(this.restExtractor.extractDataGet)
- .map(videoHash => new Video(videoHash))
- .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))
}
- updateVideo (video: Video) {
+ updateVideo (video: VideoEdit) {
const language = video.language ? video.language : null
- const body = {
+ const body: VideoUpdate = {
name: video.name,
category: video.category,
licence: video.licence,
language,
description: video.description,
- tags: video.tags
+ tags: video.tags,
+ nsfw: video.nsfw
}
- const headers = new Headers({ 'Content-Type': 'application/json' })
- const options = new RequestOptions({ headers: headers })
-
- 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)
}
- 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)
+ 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)
+
+ 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.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))
+ 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) {
+ reportVideo (id: number, reason: string) {
const url = VideoService.BASE_VIDEO_URL + id + '/abuse'
- const body = {
+ 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) {
+ setVideoLike (id: number) {
return this.setVideoRate(id, 'like')
}
- setVideoDislike (id: string) {
+ setVideoDislike (id: number) {
return this.setVideoRate(id, 'dislike')
}
- getUserVideoRating (id: string): Observable<UserVideoRate> {
- 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))
}
- blacklistVideo (id: string) {
- return this.authHttp.post(VideoService.BASE_VIDEO_URL + id + '/blacklist', {})
- .map(this.restExtractor.extractDataBool)
- .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: string, rateType: VideoRateType) {
+ private setVideoRate (id: number, rateType: VideoRateType) {
const url = VideoService.BASE_VIDEO_URL + id + '/rate'
- const body = {
+ 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) {
+ 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))
}