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/activitypub/url.ts | 13 ++++---- server/lib/video-comment.ts | 74 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 server/lib/video-comment.ts (limited to 'server/lib') diff --git a/server/lib/activitypub/url.ts b/server/lib/activitypub/url.ts index bb2d4d11e..729bb8dda 100644 --- a/server/lib/activitypub/url.ts +++ b/server/lib/activitypub/url.ts @@ -3,17 +3,18 @@ import { ActorModel } from '../../models/activitypub/actor' import { ActorFollowModel } from '../../models/activitypub/actor-follow' import { VideoModel } from '../../models/video/video' import { VideoAbuseModel } from '../../models/video/video-abuse' +import { VideoCommentModel } from '../../models/video/video-comment' function getVideoActivityPubUrl (video: VideoModel) { return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid } -function getVideoChannelActivityPubUrl (videoChannelUUID: string) { - return CONFIG.WEBSERVER.URL + '/video-channels/' + videoChannelUUID +function getVideoCommentActivityPubUrl (video: VideoModel, videoComment: VideoCommentModel) { + return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid + '#comment-' + videoComment.id } -function getApplicationActivityPubUrl () { - return CONFIG.WEBSERVER.URL + '/application/peertube' +function getVideoChannelActivityPubUrl (videoChannelUUID: string) { + return CONFIG.WEBSERVER.URL + '/video-channels/' + videoChannelUUID } function getAccountActivityPubUrl (accountName: string) { @@ -63,7 +64,6 @@ function getUndoActivityPubUrl (originalUrl: string) { } export { - getApplicationActivityPubUrl, getVideoActivityPubUrl, getVideoChannelActivityPubUrl, getAccountActivityPubUrl, @@ -75,5 +75,6 @@ export { getUndoActivityPubUrl, getVideoViewActivityPubUrl, getVideoLikeActivityPubUrl, - getVideoDislikeActivityPubUrl + getVideoDislikeActivityPubUrl, + getVideoCommentActivityPubUrl } 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