Add ability to set to private a public/unlisted video

pull/1913/head
Chocobozzz 2019-06-06 16:44:02 +02:00
parent 6091983127
commit 46a6db245f
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
3 changed files with 34 additions and 13 deletions

View File

@ -199,11 +199,10 @@ async function addVideo (req: express.Request, res: express.Response) {
const video = new VideoModel(videoData) const video = new VideoModel(videoData)
video.url = getVideoActivityPubUrl(video) // We use the UUID, so set the URL after building the object video.url = getVideoActivityPubUrl(video) // We use the UUID, so set the URL after building the object
const videoFileData = { const videoFile = new VideoFileModel({
extname: extname(videoPhysicalFile.filename), extname: extname(videoPhysicalFile.filename),
size: videoPhysicalFile.size size: videoPhysicalFile.size
} })
const videoFile = new VideoFileModel(videoFileData)
if (videoFile.isAudio()) { if (videoFile.isAudio()) {
videoFile.resolution = DEFAULT_AUDIO_RESOLUTION videoFile.resolution = DEFAULT_AUDIO_RESOLUTION
@ -321,7 +320,9 @@ async function updateVideo (req: express.Request, res: express.Response) {
const videoFieldsSave = videoInstance.toJSON() const videoFieldsSave = videoInstance.toJSON()
const oldVideoAuditView = new VideoAuditView(videoInstance.toFormattedDetailsJSON()) const oldVideoAuditView = new VideoAuditView(videoInstance.toFormattedDetailsJSON())
const videoInfoToUpdate: VideoUpdate = req.body const videoInfoToUpdate: VideoUpdate = req.body
const wasPrivateVideo = videoInstance.privacy === VideoPrivacy.PRIVATE const wasPrivateVideo = videoInstance.privacy === VideoPrivacy.PRIVATE
const wasNotPrivateVideo = videoInstance.privacy !== VideoPrivacy.PRIVATE
const wasUnlistedVideo = videoInstance.privacy === VideoPrivacy.UNLISTED const wasUnlistedVideo = videoInstance.privacy === VideoPrivacy.UNLISTED
// Process thumbnail or create it from the video // Process thumbnail or create it from the video
@ -357,9 +358,15 @@ async function updateVideo (req: express.Request, res: express.Response) {
const newPrivacy = parseInt(videoInfoToUpdate.privacy.toString(), 10) const newPrivacy = parseInt(videoInfoToUpdate.privacy.toString(), 10)
videoInstance.privacy = newPrivacy videoInstance.privacy = newPrivacy
// The video was private, and is not anymore -> publish it
if (wasPrivateVideo === true && newPrivacy !== VideoPrivacy.PRIVATE) { if (wasPrivateVideo === true && newPrivacy !== VideoPrivacy.PRIVATE) {
videoInstance.publishedAt = new Date() videoInstance.publishedAt = new Date()
} }
// The video was not private, but now it is -> we need to unfederate it
if (wasNotPrivateVideo === true && newPrivacy === VideoPrivacy.PRIVATE) {
await VideoModel.sendDelete(videoInstance, { transaction: t })
}
} }
const videoInstanceUpdated = await videoInstance.save(sequelizeOptions) const videoInstanceUpdated = await videoInstance.save(sequelizeOptions)

View File

@ -111,18 +111,10 @@ const videosUpdateValidator = getCommonVideoEditAttributes().concat([
if (areErrorsInScheduleUpdate(req, res)) return cleanUpReqFiles(req) if (areErrorsInScheduleUpdate(req, res)) return cleanUpReqFiles(req)
if (!await doesVideoExist(req.params.id, res)) return cleanUpReqFiles(req) if (!await doesVideoExist(req.params.id, res)) return cleanUpReqFiles(req)
const video = res.locals.video
// Check if the user who did the request is able to update the video // Check if the user who did the request is able to update the video
const user = res.locals.oauth.token.User const user = res.locals.oauth.token.User
if (!checkUserCanManageVideo(user, res.locals.video, UserRight.UPDATE_ANY_VIDEO, res)) return cleanUpReqFiles(req) if (!checkUserCanManageVideo(user, res.locals.video, UserRight.UPDATE_ANY_VIDEO, res)) return cleanUpReqFiles(req)
if (video.privacy !== VideoPrivacy.PRIVATE && req.body.privacy === VideoPrivacy.PRIVATE) {
cleanUpReqFiles(req)
return res.status(409)
.json({ error: 'Cannot set "private" a video that was not private.' })
}
if (req.body.channelId && !await doesVideoChannelOfAccountExist(req.body.channelId, user, res)) return cleanUpReqFiles(req) if (req.body.channelId && !await doesVideoChannelOfAccountExist(req.body.channelId, user, res)) return cleanUpReqFiles(req)
return next() return next()

View File

@ -6,8 +6,7 @@ import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enu
import { import {
cleanupTests, cleanupTests,
flushAndRunMultipleServers, flushAndRunMultipleServers,
getVideosList, getVideosList, getVideosListWithToken,
killallServers,
ServerInfo, ServerInfo,
setAccessTokensToServers, setAccessTokensToServers,
uploadVideo uploadVideo
@ -153,6 +152,29 @@ describe('Test video privacy', function () {
} }
}) })
it('Should set this new video as private', async function () {
this.timeout(10000)
await updateVideo(servers[0].url, servers[0].accessToken, privateVideoId, { privacy: VideoPrivacy.PRIVATE })
await waitJobs(servers)
for (const server of servers) {
const res = await getVideosList(server.url)
expect(res.body.total).to.equal(0)
expect(res.body.data).to.have.lengthOf(0)
}
{
const res = await getMyVideos(servers[0].url, servers[0].accessToken, 0, 5)
expect(res.body.total).to.equal(1)
expect(res.body.data).to.have.lengthOf(1)
expect(res.body.data[0].name).to.equal('super video public')
}
})
after(async function () { after(async function () {
await cleanupTests(servers) await cleanupTests(servers)
}) })