Split types and typings
[oweals/peertube.git] / server / lib / redundancy.ts
index 78d84e02e97d7d8648ff8f4bed3eac99ea7fc5ed..da620b607aa98db1d31d4e598d5490205a5db3f6 100644 (file)
@@ -1,8 +1,12 @@
 import { VideoRedundancyModel } from '../models/redundancy/video-redundancy'
 import { sendUndoCacheFile } from './activitypub/send'
 import { Transaction } from 'sequelize'
-import { getServerActor } from '../helpers/utils'
-import { MVideoRedundancyVideo } from '@server/typings/models'
+import { MActorSignature, MVideoRedundancyVideo } from '@server/types/models'
+import { CONFIG } from '@server/initializers/config'
+import { logger } from '@server/helpers/logger'
+import { ActorFollowModel } from '@server/models/activitypub/actor-follow'
+import { Activity } from '@shared/models'
+import { getServerActor } from '@server/models/application/application'
 
 async function removeVideoRedundancy (videoRedundancy: MVideoRedundancyVideo, t?: Transaction) {
   const serverActor = await getServerActor()
@@ -21,9 +25,30 @@ async function removeRedundanciesOfServer (serverId: number) {
   }
 }
 
+async function isRedundancyAccepted (activity: Activity, byActor: MActorSignature) {
+  const configAcceptFrom = CONFIG.REMOTE_REDUNDANCY.VIDEOS.ACCEPT_FROM
+  if (configAcceptFrom === 'nobody') {
+    logger.info('Do not accept remote redundancy %s due instance accept policy.', activity.id)
+    return false
+  }
+
+  if (configAcceptFrom === 'followings') {
+    const serverActor = await getServerActor()
+    const allowed = await ActorFollowModel.isFollowedBy(byActor.id, serverActor.id)
+
+    if (allowed !== true) {
+      logger.info('Do not accept remote redundancy %s because actor %s is not followed by our instance.', activity.id, byActor.url)
+      return false
+    }
+  }
+
+  return true
+}
+
 // ---------------------------------------------------------------------------
 
 export {
+  isRedundancyAccepted,
   removeRedundanciesOfServer,
   removeVideoRedundancy
 }