132 lines
4.3 KiB
TypeScript
132 lines
4.3 KiB
TypeScript
|
import * as express from 'express'
|
||
|
import { body, param } from 'express-validator/check'
|
||
|
import { logger } from '../../helpers'
|
||
|
import { isIdOrUUIDValid, isIdValid } from '../../helpers/custom-validators/misc'
|
||
|
import { isValidVideoCommentText } from '../../helpers/custom-validators/video-comments'
|
||
|
import { isVideoExist } from '../../helpers/custom-validators/videos'
|
||
|
import { VideoCommentModel } from '../../models/video/video-comment'
|
||
|
import { areValidationErrors } from './utils'
|
||
|
|
||
|
const listVideoCommentThreadsValidator = [
|
||
|
param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
|
||
|
|
||
|
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||
|
logger.debug('Checking blacklistRemove parameters.', { parameters: req.params })
|
||
|
|
||
|
if (areValidationErrors(req, res)) return
|
||
|
if (!await isVideoExist(req.params.videoId, res)) return
|
||
|
|
||
|
return next()
|
||
|
}
|
||
|
]
|
||
|
|
||
|
const listVideoThreadCommentsValidator = [
|
||
|
param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
|
||
|
param('threadId').custom(isIdValid).not().isEmpty().withMessage('Should have a valid threadId'),
|
||
|
|
||
|
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||
|
logger.debug('Checking blacklistRemove parameters.', { parameters: req.params })
|
||
|
|
||
|
if (areValidationErrors(req, res)) return
|
||
|
if (!await isVideoExist(req.params.videoId, res)) return
|
||
|
if (!await isVideoCommentThreadExist(req.params.threadId, req.params.videoId, res)) return
|
||
|
|
||
|
return next()
|
||
|
}
|
||
|
]
|
||
|
|
||
|
const addVideoCommentThreadValidator = [
|
||
|
param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
|
||
|
body('text').custom(isValidVideoCommentText).not().isEmpty().withMessage('Should have a valid comment text'),
|
||
|
|
||
|
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||
|
logger.debug('Checking blacklistRemove parameters.', { parameters: req.params })
|
||
|
|
||
|
if (areValidationErrors(req, res)) return
|
||
|
if (!await isVideoExist(req.params.videoId, res)) return
|
||
|
|
||
|
return next()
|
||
|
}
|
||
|
]
|
||
|
|
||
|
const addVideoCommentReplyValidator = [
|
||
|
param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
|
||
|
param('commentId').custom(isIdValid).not().isEmpty().withMessage('Should have a valid commentId'),
|
||
|
body('text').custom(isValidVideoCommentText).not().isEmpty().withMessage('Should have a valid comment text'),
|
||
|
|
||
|
async (req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||
|
logger.debug('Checking blacklistRemove parameters.', { parameters: req.params })
|
||
|
|
||
|
if (areValidationErrors(req, res)) return
|
||
|
if (!await isVideoExist(req.params.videoId, res)) return
|
||
|
if (!await isVideoCommentExist(req.params.commentId, req.params.videoId, res)) return
|
||
|
|
||
|
return next()
|
||
|
}
|
||
|
]
|
||
|
|
||
|
// ---------------------------------------------------------------------------
|
||
|
|
||
|
export {
|
||
|
listVideoCommentThreadsValidator,
|
||
|
listVideoThreadCommentsValidator,
|
||
|
addVideoCommentThreadValidator,
|
||
|
addVideoCommentReplyValidator
|
||
|
}
|
||
|
|
||
|
// ---------------------------------------------------------------------------
|
||
|
|
||
|
async function isVideoCommentThreadExist (id: number, videoId: number, res: express.Response) {
|
||
|
const videoComment = await VideoCommentModel.loadById(id)
|
||
|
|
||
|
if (!videoComment) {
|
||
|
res.status(404)
|
||
|
.json({ error: 'Video comment thread not found' })
|
||
|
.end()
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
if (videoComment.videoId !== videoId) {
|
||
|
res.status(400)
|
||
|
.json({ error: 'Video comment is associated to this video.' })
|
||
|
.end()
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
if (videoComment.inReplyToCommentId !== null) {
|
||
|
res.status(400)
|
||
|
.json({ error: 'Video comment is not a thread.' })
|
||
|
.end()
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
res.locals.videoCommentThread = videoComment
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
async function isVideoCommentExist (id: number, videoId: number, res: express.Response) {
|
||
|
const videoComment = await VideoCommentModel.loadById(id)
|
||
|
|
||
|
if (!videoComment) {
|
||
|
res.status(404)
|
||
|
.json({ error: 'Video comment thread not found' })
|
||
|
.end()
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
if (videoComment.videoId !== videoId) {
|
||
|
res.status(400)
|
||
|
.json({ error: 'Video comment is associated to this video.' })
|
||
|
.end()
|
||
|
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
res.locals.videoComment = videoComment
|
||
|
return true
|
||
|
}
|