]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - client/src/app/videos/+video-watch/comment/video-comment.service.ts
Handle line feeds in comments
[github/Chocobozzz/PeerTube.git] / client / src / app / videos / +video-watch / comment / video-comment.service.ts
1 import { HttpClient, HttpParams } from '@angular/common/http'
2 import { Injectable } from '@angular/core'
3 import 'rxjs/add/operator/catch'
4 import 'rxjs/add/operator/map'
5 import { immutableAssign, lineFeedToHtml } from '@app/shared/misc/utils'
6 import { Observable } from 'rxjs/Observable'
7 import { ResultList } from '../../../../../../shared/models'
8 import {
9 VideoComment as VideoCommentServerModel, VideoCommentCreate,
10 VideoCommentThreadTree
11 } from '../../../../../../shared/models/videos/video-comment.model'
12 import { environment } from '../../../../environments/environment'
13 import { RestExtractor, RestService } from '../../../shared/rest'
14 import { ComponentPagination } from '../../../shared/rest/component-pagination.model'
15 import { SortField } from '../../../shared/video/sort-field.type'
16 import { VideoComment } from './video-comment.model'
17
18 @Injectable()
19 export class VideoCommentService {
20 private static BASE_VIDEO_URL = environment.apiUrl + '/api/v1/videos/'
21
22 constructor (
23 private authHttp: HttpClient,
24 private restExtractor: RestExtractor,
25 private restService: RestService
26 ) {}
27
28 addCommentThread (videoId: number | string, comment: VideoCommentCreate) {
29 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comment-threads'
30 const normalizedComment = lineFeedToHtml(comment, 'text')
31
32 return this.authHttp.post(url, normalizedComment)
33 .map(data => this.extractVideoComment(data['comment']))
34 .catch(this.restExtractor.handleError)
35 }
36
37 addCommentReply (videoId: number | string, inReplyToCommentId: number, comment: VideoCommentCreate) {
38 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comments/' + inReplyToCommentId
39 const normalizedComment = lineFeedToHtml(comment, 'text')
40
41 return this.authHttp.post(url, normalizedComment)
42 .map(data => this.extractVideoComment(data['comment']))
43 .catch(this.restExtractor.handleError)
44 }
45
46 getVideoCommentThreads (
47 videoId: number | string,
48 componentPagination: ComponentPagination,
49 sort: SortField
50 ): Observable<{ comments: VideoComment[], totalComments: number}> {
51 const pagination = this.restService.componentPaginationToRestPagination(componentPagination)
52
53 let params = new HttpParams()
54 params = this.restService.addRestGetParams(params, pagination, sort)
55
56 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comment-threads'
57 return this.authHttp
58 .get(url, { params })
59 .map(this.extractVideoComments)
60 .catch((res) => this.restExtractor.handleError(res))
61 }
62
63 getVideoThreadComments (videoId: number | string, threadId: number): Observable<VideoCommentThreadTree> {
64 const url = `${VideoCommentService.BASE_VIDEO_URL + videoId}/comment-threads/${threadId}`
65
66 return this.authHttp
67 .get(url)
68 .map(tree => this.extractVideoCommentTree(tree as VideoCommentThreadTree))
69 .catch((res) => this.restExtractor.handleError(res))
70 }
71
72 deleteVideoComment (videoId: number | string, commentId: number) {
73 const url = `${VideoCommentService.BASE_VIDEO_URL + videoId}/comments/${commentId}`
74
75 return this.authHttp
76 .delete(url)
77 .map(this.restExtractor.extractDataBool)
78 .catch((res) => this.restExtractor.handleError(res))
79 }
80
81 private extractVideoComment (videoComment: VideoCommentServerModel) {
82 return new VideoComment(videoComment)
83 }
84
85 private extractVideoComments (result: ResultList<VideoCommentServerModel>) {
86 const videoCommentsJson = result.data
87 const totalComments = result.total
88 const comments = []
89
90 for (const videoCommentJson of videoCommentsJson) {
91 comments.push(new VideoComment(videoCommentJson))
92 }
93
94 return { comments, totalComments }
95 }
96
97 private extractVideoCommentTree (tree: VideoCommentThreadTree) {
98 if (!tree) return tree
99
100 tree.comment = new VideoComment(tree.comment)
101 tree.children.forEach(c => this.extractVideoCommentTree(c))
102
103 return tree
104 }
105 }