From bf1f650817dadfd5eeee9e5e0b6b6938c136e25d Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 22 Dec 2017 10:50:07 +0100 Subject: Add comments controller --- server/lib/video-comment.ts | 74 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 server/lib/video-comment.ts (limited to 'server/lib/video-comment.ts') diff --git a/server/lib/video-comment.ts b/server/lib/video-comment.ts new file mode 100644 index 000000000..edb72d4e2 --- /dev/null +++ b/server/lib/video-comment.ts @@ -0,0 +1,74 @@ +import * as Sequelize from 'sequelize' +import { ResultList } from '../../shared/models' +import { VideoCommentThread } from '../../shared/models/videos/video-comment.model' +import { VideoModel } from '../models/video/video' +import { VideoCommentModel } from '../models/video/video-comment' +import { getVideoCommentActivityPubUrl } from './activitypub' + +async function createVideoComment (obj: { + text: string, + inReplyToComment: number, + video: VideoModel + actorId: number +}, t: Sequelize.Transaction) { + let originCommentId: number = null + if (obj.inReplyToComment) { + const repliedComment = await VideoCommentModel.loadById(obj.inReplyToComment) + if (!repliedComment) throw new Error('Unknown replied comment.') + + originCommentId = repliedComment.originCommentId || repliedComment.id + } + + const comment = await VideoCommentModel.create({ + text: obj.text, + originCommentId, + inReplyToComment: obj.inReplyToComment, + videoId: obj.video.id, + actorId: obj.actorId + }, { transaction: t }) + + comment.set('url', getVideoCommentActivityPubUrl(obj.video, comment)) + + return comment.save({ transaction: t }) +} + +function buildFormattedCommentTree (resultList: ResultList): VideoCommentThread { + // Comments are sorted by id ASC + const comments = resultList.data + + const comment = comments.shift() + const thread: VideoCommentThread = { + comment: comment.toFormattedJSON(), + children: [] + } + const idx = { + [comment.id]: thread + } + + while (comments.length !== 0) { + const childComment = comments.shift() + + const childCommentThread: VideoCommentThread = { + comment: childComment.toFormattedJSON(), + children: [] + } + + const parentCommentThread = idx[childComment.inReplyToCommentId] + if (!parentCommentThread) { + const msg = `Cannot format video thread tree, parent ${childComment.inReplyToCommentId} not found for child ${childComment.id}` + throw new Error(msg) + } + + parentCommentThread.children.push(childCommentThread) + idx[childComment.id] = childCommentThread + } + + return thread +} + +// --------------------------------------------------------------------------- + +export { + createVideoComment, + buildFormattedCommentTree +} -- cgit v1.2.3