diff options
Diffstat (limited to 'server/models')
-rw-r--r-- | server/models/user.js | 8 | ||||
-rw-r--r-- | server/models/video-blacklist.js | 89 | ||||
-rw-r--r-- | server/models/video.js | 48 |
3 files changed, 134 insertions, 11 deletions
diff --git a/server/models/user.js b/server/models/user.js index e64bab8ab..8f9c2bf65 100644 --- a/server/models/user.js +++ b/server/models/user.js | |||
@@ -79,7 +79,8 @@ module.exports = function (sequelize, DataTypes) { | |||
79 | }, | 79 | }, |
80 | instanceMethods: { | 80 | instanceMethods: { |
81 | isPasswordMatch, | 81 | isPasswordMatch, |
82 | toFormatedJSON | 82 | toFormatedJSON, |
83 | isAdmin | ||
83 | }, | 84 | }, |
84 | hooks: { | 85 | hooks: { |
85 | beforeCreate: beforeCreateOrUpdate, | 86 | beforeCreate: beforeCreateOrUpdate, |
@@ -117,6 +118,11 @@ function toFormatedJSON () { | |||
117 | createdAt: this.createdAt | 118 | createdAt: this.createdAt |
118 | } | 119 | } |
119 | } | 120 | } |
121 | |||
122 | function isAdmin () { | ||
123 | return this.role === constants.USER_ROLES.ADMIN | ||
124 | } | ||
125 | |||
120 | // ------------------------------ STATICS ------------------------------ | 126 | // ------------------------------ STATICS ------------------------------ |
121 | 127 | ||
122 | function associate (models) { | 128 | function associate (models) { |
diff --git a/server/models/video-blacklist.js b/server/models/video-blacklist.js new file mode 100644 index 000000000..02ea15760 --- /dev/null +++ b/server/models/video-blacklist.js | |||
@@ -0,0 +1,89 @@ | |||
1 | 'use strict' | ||
2 | |||
3 | const modelUtils = require('./utils') | ||
4 | |||
5 | // --------------------------------------------------------------------------- | ||
6 | |||
7 | module.exports = function (sequelize, DataTypes) { | ||
8 | const BlacklistedVideo = sequelize.define('BlacklistedVideo', | ||
9 | {}, | ||
10 | { | ||
11 | indexes: [ | ||
12 | { | ||
13 | fields: [ 'videoId' ], | ||
14 | unique: true | ||
15 | } | ||
16 | ], | ||
17 | classMethods: { | ||
18 | associate, | ||
19 | |||
20 | countTotal, | ||
21 | list, | ||
22 | listForApi, | ||
23 | loadById, | ||
24 | loadByVideoId | ||
25 | }, | ||
26 | instanceMethods: { | ||
27 | toFormatedJSON | ||
28 | }, | ||
29 | hooks: {} | ||
30 | } | ||
31 | ) | ||
32 | |||
33 | return BlacklistedVideo | ||
34 | } | ||
35 | |||
36 | // ------------------------------ METHODS ------------------------------ | ||
37 | |||
38 | function toFormatedJSON () { | ||
39 | return { | ||
40 | id: this.id, | ||
41 | videoId: this.videoId, | ||
42 | createdAt: this.createdAt | ||
43 | } | ||
44 | } | ||
45 | |||
46 | // ------------------------------ STATICS ------------------------------ | ||
47 | |||
48 | function associate (models) { | ||
49 | this.belongsTo(models.Video, { | ||
50 | foreignKey: 'videoId', | ||
51 | onDelete: 'cascade' | ||
52 | }) | ||
53 | } | ||
54 | |||
55 | function countTotal (callback) { | ||
56 | return this.count().asCallback(callback) | ||
57 | } | ||
58 | |||
59 | function list (callback) { | ||
60 | return this.findAll().asCallback(callback) | ||
61 | } | ||
62 | |||
63 | function listForApi (start, count, sort, callback) { | ||
64 | const query = { | ||
65 | offset: start, | ||
66 | limit: count, | ||
67 | order: [ modelUtils.getSort(sort) ] | ||
68 | } | ||
69 | |||
70 | return this.findAndCountAll(query).asCallback(function (err, result) { | ||
71 | if (err) return callback(err) | ||
72 | |||
73 | return callback(null, result.rows, result.count) | ||
74 | }) | ||
75 | } | ||
76 | |||
77 | function loadById (id, callback) { | ||
78 | return this.findById(id).asCallback(callback) | ||
79 | } | ||
80 | |||
81 | function loadByVideoId (id, callback) { | ||
82 | const query = { | ||
83 | where: { | ||
84 | videoId: id | ||
85 | } | ||
86 | } | ||
87 | |||
88 | return this.find(query).asCallback(callback) | ||
89 | } | ||
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') | |||
16 | const friends = require('../lib/friends') | 16 | const friends = require('../lib/friends') |
17 | const modelUtils = require('./utils') | 17 | const modelUtils = require('./utils') |
18 | const customVideosValidators = require('../helpers/custom-validators').videos | 18 | const customVideosValidators = require('../helpers/custom-validators').videos |
19 | const 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 | ||
530 | function listForApi (start, count, sort, callback) { | 532 | function 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 | |||
767 | function 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 | } | ||