Improve check services parameters tests
[oweals/peertube.git] / server / lib / video-comment.ts
1 import * as Sequelize from 'sequelize'
2 import { ResultList } from '../../shared/models'
3 import { VideoCommentThreadTree } from '../../shared/models/videos/video-comment.model'
4 import { AccountModel } from '../models/account/account'
5 import { VideoModel } from '../models/video/video'
6 import { VideoCommentModel } from '../models/video/video-comment'
7 import { getVideoCommentActivityPubUrl } from './activitypub'
8 import { sendCreateVideoCommentToOrigin, sendCreateVideoCommentToVideoFollowers } from './activitypub/send'
9
10 async function createVideoComment (obj: {
11   text: string,
12   inReplyToComment: VideoCommentModel,
13   video: VideoModel
14   account: AccountModel
15 }, t: Sequelize.Transaction) {
16   let originCommentId: number = null
17   let inReplyToCommentId: number = null
18
19   if (obj.inReplyToComment) {
20     originCommentId = obj.inReplyToComment.originCommentId || obj.inReplyToComment.id
21     inReplyToCommentId = obj.inReplyToComment.id
22   }
23
24   const comment = await VideoCommentModel.create({
25     text: obj.text,
26     originCommentId,
27     inReplyToCommentId,
28     videoId: obj.video.id,
29     accountId: obj.account.id,
30     url: 'fake url'
31   }, { transaction: t, validate: false })
32
33   comment.set('url', getVideoCommentActivityPubUrl(obj.video, comment))
34
35   const savedComment = await comment.save({ transaction: t })
36   savedComment.InReplyToVideoComment = obj.inReplyToComment
37   savedComment.Video = obj.video
38   savedComment.Account = obj.account
39
40   if (savedComment.Video.isOwned()) {
41     await sendCreateVideoCommentToVideoFollowers(savedComment, t)
42   } else {
43     await sendCreateVideoCommentToOrigin(savedComment, t)
44   }
45
46   return savedComment
47 }
48
49 function buildFormattedCommentTree (resultList: ResultList<VideoCommentModel>): VideoCommentThreadTree {
50   // Comments are sorted by id ASC
51   const comments = resultList.data
52
53   const comment = comments.shift()
54   const thread: VideoCommentThreadTree = {
55     comment: comment.toFormattedJSON(),
56     children: []
57   }
58   const idx = {
59     [comment.id]: thread
60   }
61
62   while (comments.length !== 0) {
63     const childComment = comments.shift()
64
65     const childCommentThread: VideoCommentThreadTree = {
66       comment: childComment.toFormattedJSON(),
67       children: []
68     }
69
70     const parentCommentThread = idx[childComment.inReplyToCommentId]
71     if (!parentCommentThread) {
72       const msg = `Cannot format video thread tree, parent ${childComment.inReplyToCommentId} not found for child ${childComment.id}`
73       throw new Error(msg)
74     }
75
76     parentCommentThread.children.push(childCommentThread)
77     idx[childComment.id] = childCommentThread
78   }
79
80   return thread
81 }
82
83 // ---------------------------------------------------------------------------
84
85 export {
86   createVideoComment,
87   buildFormattedCommentTree
88 }