]>
Commit | Line | Data |
---|---|---|
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 { sendCreateVideoComment } from './activitypub/send' | |
9 | ||
10 | async function createVideoComment (obj: { | |
11 | text: string, | |
12 | inReplyToComment: VideoCommentModel | null, | |
13 | video: VideoModel | |
14 | account: AccountModel | |
15 | }, t: Sequelize.Transaction) { | |
16 | let originCommentId: number | null = null | |
17 | let inReplyToCommentId: number | null = null | |
18 | ||
19 | if (obj.inReplyToComment && obj.inReplyToComment !== null) { | |
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 } as any) // FIXME: sequelize typings | |
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 | await sendCreateVideoComment(savedComment, t) | |
41 | ||
42 | return savedComment | |
43 | } | |
44 | ||
45 | function buildFormattedCommentTree (resultList: ResultList<VideoCommentModel>): VideoCommentThreadTree { | |
46 | // Comments are sorted by id ASC | |
47 | const comments = resultList.data | |
48 | ||
49 | const comment = comments.shift() | |
50 | const thread: VideoCommentThreadTree = { | |
51 | comment: comment.toFormattedJSON(), | |
52 | children: [] | |
53 | } | |
54 | const idx = { | |
55 | [comment.id]: thread | |
56 | } | |
57 | ||
58 | while (comments.length !== 0) { | |
59 | const childComment = comments.shift() | |
60 | ||
61 | const childCommentThread: VideoCommentThreadTree = { | |
62 | comment: childComment.toFormattedJSON(), | |
63 | children: [] | |
64 | } | |
65 | ||
66 | const parentCommentThread = idx[childComment.inReplyToCommentId] | |
67 | // Maybe the parent comment was blocked by the admin/user | |
68 | if (!parentCommentThread) continue | |
69 | ||
70 | parentCommentThread.children.push(childCommentThread) | |
71 | idx[childComment.id] = childCommentThread | |
72 | } | |
73 | ||
74 | return thread | |
75 | } | |
76 | ||
77 | // --------------------------------------------------------------------------- | |
78 | ||
79 | export { | |
80 | createVideoComment, | |
81 | buildFormattedCommentTree | |
82 | } |