aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/models/video.js
diff options
context:
space:
mode:
authorGreen-Star <Green-Star@users.noreply.github.com>2017-04-26 21:22:10 +0200
committerBigard Florian <florian.bigard@gmail.com>2017-04-26 21:22:10 +0200
commit198b205c10dba362b9ae1ef6895b29d7e0dd685f (patch)
tree3be413139784f7445e775cbecccc6091a738360b /server/models/video.js
parent00871a261787ae1ed8446861ba2bd5eea9faca6d (diff)
downloadPeerTube-198b205c10dba362b9ae1ef6895b29d7e0dd685f.tar.gz
PeerTube-198b205c10dba362b9ae1ef6895b29d7e0dd685f.tar.zst
PeerTube-198b205c10dba362b9ae1ef6895b29d7e0dd685f.zip
Add ability for an administrator to remove any video (#61)
* Add ability for an admin to remove every video on the pod. * Server: add BlacklistedVideos relation. * Server: Insert in BlacklistedVideos relation upon deletion of a video. * Server: Modify BlacklistedVideos schema to add Pod id information. * Server: Moving insertion of a blacklisted video from the `afterDestroy` hook into the process of deletion of a video. To avoid inserting a video when it is removed on its origin pod. When a video is removed on its origin pod, the `afterDestroy` hook is fire, but no request is made on the delete('/:videoId') interface. Hence, we insert into `BlacklistedVideos` only on request on delete('/:videoId') (if requirements for insertion are met). * Server: Add removeVideoFromBlacklist hook on deletion of a video. We are going to proceed in another way :). We will add a new route : /:videoId/blacklist to blacklist a video. We do not blacklist a video upon its deletion now (to distinguish a video blacklist from a regular video delete) When we blacklist a video, the video remains in the DB, so we don't have any concern about its update. It just doesn't appear in the video list. When we remove a video, we then have to remove it from the blacklist too. We could also remove a video from the blacklist to 'unremove' it and make it appear again in the video list (will be another feature). * Server: Add handler for new route post(/:videoId/blacklist) * Client: Add isBlacklistable method * Client: Update isRemovableBy method. * Client: Move 'Delete video' feature from the video-list to the video-watch module. * Server: Exclude blacklisted videos from the video list * Server: Use findAll() in BlacklistedVideos.list() method * Server: Fix addVideoToBlacklist function. * Client: Add blacklist feature. * Server: Use JavaScript Standard Style. * Server: In checkUserCanDeleteVideo, move the callback call inside the db callback function * Server: Modify BlacklistVideo relation * Server: Modifiy Videos methods. * Server: Add checkVideoIsBlacklistable method * Server: Rewrite addVideoToBlacklist method * Server: Fix checkVideoIsBlacklistable method * Server: Add return to addVideoToBlacklist method
Diffstat (limited to 'server/models/video.js')
-rw-r--r--server/models/video.js48
1 files changed, 38 insertions, 10 deletions
diff --git a/server/models/video.js b/server/models/video.js
index 39eb28ed9..1addfa682 100644
--- a/server/models/video.js
+++ b/server/models/video.js
@@ -16,6 +16,7 @@ const logger = require('../helpers/logger')
16const friends = require('../lib/friends') 16const friends = require('../lib/friends')
17const modelUtils = require('./utils') 17const modelUtils = require('./utils')
18const customVideosValidators = require('../helpers/custom-validators').videos 18const customVideosValidators = require('../helpers/custom-validators').videos
19const db = require('../initializers/database')
19 20
20// --------------------------------------------------------------------------- 21// ---------------------------------------------------------------------------
21 22
@@ -201,7 +202,8 @@ module.exports = function (sequelize, DataTypes) {
201 isOwned, 202 isOwned,
202 toFormatedJSON, 203 toFormatedJSON,
203 toAddRemoteJSON, 204 toAddRemoteJSON,
204 toUpdateRemoteJSON 205 toUpdateRemoteJSON,
206 removeFromBlacklist
205 }, 207 },
206 hooks: { 208 hooks: {
207 beforeValidate, 209 beforeValidate,
@@ -528,6 +530,7 @@ function list (callback) {
528} 530}
529 531
530function listForApi (start, count, sort, callback) { 532function listForApi (start, count, sort, callback) {
533 // Exclude Blakclisted videos from the list
531 const query = { 534 const query = {
532 offset: start, 535 offset: start,
533 limit: count, 536 limit: count,
@@ -540,7 +543,12 @@ function listForApi (start, count, sort, callback) {
540 }, 543 },
541 544
542 this.sequelize.models.Tag 545 this.sequelize.models.Tag
543 ] 546 ],
547 where: {
548 id: { $notIn: this.sequelize.literal(
549 '(SELECT "BlacklistedVideos"."videoId" FROM "BlacklistedVideos")'
550 )}
551 }
544 } 552 }
545 553
546 return this.findAndCountAll(query).asCallback(function (err, result) { 554 return this.findAndCountAll(query).asCallback(function (err, result) {
@@ -648,7 +656,11 @@ function searchAndPopulateAuthorAndPodAndTags (value, field, start, count, sort,
648 } 656 }
649 657
650 const query = { 658 const query = {
651 where: {}, 659 where: {
660 id: { $notIn: this.sequelize.literal(
661 '(SELECT "BlacklistedVideos"."videoId" FROM "BlacklistedVideos")'
662 )}
663 },
652 offset: start, 664 offset: start,
653 limit: count, 665 limit: count,
654 distinct: true, // For the count, a video can have many tags 666 distinct: true, // For the count, a video can have many tags
@@ -661,13 +673,9 @@ function searchAndPopulateAuthorAndPodAndTags (value, field, start, count, sort,
661 query.where.infoHash = infoHash 673 query.where.infoHash = infoHash
662 } else if (field === 'tags') { 674 } else if (field === 'tags') {
663 const escapedValue = this.sequelize.escape('%' + value + '%') 675 const escapedValue = this.sequelize.escape('%' + value + '%')
664 query.where = { 676 query.where.id.$in = this.sequelize.literal(
665 id: { 677 '(SELECT "VideoTags"."videoId" FROM "Tags" INNER JOIN "VideoTags" ON "Tags"."id" = "VideoTags"."tagId" WHERE name LIKE ' + escapedValue + ')'
666 $in: this.sequelize.literal( 678 )
667 '(SELECT "VideoTags"."videoId" FROM "Tags" INNER JOIN "VideoTags" ON "Tags"."id" = "VideoTags"."tagId" WHERE name LIKE ' + escapedValue + ')'
668 )
669 }
670 }
671 } else if (field === 'host') { 679 } else if (field === 'host') {
672 // FIXME: Include our pod? (not stored in the database) 680 // FIXME: Include our pod? (not stored in the database)
673 podInclude.where = { 681 podInclude.where = {
@@ -755,3 +763,23 @@ function generateImage (video, videoPath, folder, imageName, size, callback) {
755 }) 763 })
756 .thumbnail(options) 764 .thumbnail(options)
757} 765}
766
767function removeFromBlacklist (video, callback) {
768 // Find the blacklisted video
769 db.BlacklistedVideo.loadByVideoId(video.id, function (err, video) {
770 // If an error occured, stop here
771 if (err) {
772 logger.error('Error when fetching video from blacklist.', { error: err })
773
774 return callback(err)
775 }
776
777 // If we found the video, remove it from the blacklist
778 if (video) {
779 video.destroy().asCallback(callback)
780 } else {
781 // If haven't found it, simply ignore it and do nothing
782 return callback()
783 }
784 })
785}