]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/video-blacklist.ts
Handle external login errors
[github/Chocobozzz/PeerTube.git] / server / lib / video-blacklist.ts
index 985b89e319cea32ebba9fd388c75cdb7fc534703..3b90b1b9415982071d6deff43dacbeb18ec47b59 100644 (file)
@@ -1,31 +1,72 @@
-import * as sequelize from 'sequelize'
+import { Transaction } from 'sequelize'
 import { CONFIG } from '../initializers/config'
 import { UserRight, VideoBlacklistType } from '../../shared/models'
 import { VideoBlacklistModel } from '../models/video/video-blacklist'
-import { UserModel } from '../models/account/user'
-import { VideoModel } from '../models/video/video'
 import { logger } from '../helpers/logger'
 import { UserAdminFlag } from '../../shared/models/users/user-flag.model'
+import { Hooks } from './plugins/hooks'
+import { Notifier } from './notifier'
+import { MUser, MVideoBlacklistVideo, MVideoWithBlacklistLight } from '@server/typings/models'
 
-async function autoBlacklistVideoIfNeeded (video: VideoModel, user: UserModel, transaction: sequelize.Transaction) {
-  if (!CONFIG.AUTO_BLACKLIST.VIDEOS.OF_USERS.ENABLED) return false
+async function autoBlacklistVideoIfNeeded (parameters: {
+  video: MVideoWithBlacklistLight
+  user?: MUser
+  isRemote: boolean
+  isNew: boolean
+  notify?: boolean
+  transaction?: Transaction
+}) {
+  const { video, user, isRemote, isNew, notify = true, transaction } = parameters
+  const doAutoBlacklist = await Hooks.wrapFun(
+    autoBlacklistNeeded,
+    { video, user, isRemote, isNew },
+    'filter:video.auto-blacklist.result'
+  )
 
-  if (user.hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) || user.hasAdminFlag(UserAdminFlag.BY_PASS_VIDEO_AUTO_BLACKLIST)) return false
+  if (!doAutoBlacklist) return false
 
-  const sequelizeOptions = { transaction }
   const videoBlacklistToCreate = {
     videoId: video.id,
     unfederated: true,
     reason: 'Auto-blacklisted. Moderator review required.',
     type: VideoBlacklistType.AUTO_BEFORE_PUBLISHED
   }
-  await VideoBlacklistModel.create(videoBlacklistToCreate, sequelizeOptions)
+  const [ videoBlacklist ] = await VideoBlacklistModel.findOrCreate<MVideoBlacklistVideo>({
+    where: {
+      videoId: video.id
+    },
+    defaults: videoBlacklistToCreate,
+    transaction
+  })
+  video.VideoBlacklist = videoBlacklist
+
+  videoBlacklist.Video = video
+
+  if (notify) Notifier.Instance.notifyOnVideoAutoBlacklist(videoBlacklist)
 
   logger.info('Video %s auto-blacklisted.', video.uuid)
 
   return true
 }
 
+function autoBlacklistNeeded (parameters: {
+  video: MVideoWithBlacklistLight
+  isRemote: boolean
+  isNew: boolean
+  user?: MUser
+}) {
+  const { user, video, isRemote, isNew } = parameters
+
+  // Already blacklisted
+  if (video.VideoBlacklist) return false
+  if (!CONFIG.AUTO_BLACKLIST.VIDEOS.OF_USERS.ENABLED || !user) return false
+  if (isRemote || isNew === false) return false
+
+  if (user.hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) || user.hasAdminFlag(UserAdminFlag.BY_PASS_VIDEO_AUTO_BLACKLIST)) return false
+
+  return true
+}
+
 // ---------------------------------------------------------------------------
 
 export {