aboutsummaryrefslogblamecommitdiffhomepage
path: root/server/helpers/custom-validators/remote/videos.ts
blob: 091cd2186b6e263d9e51a5484cad15e8d4330f24 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                                    
                   












                                    
                           

                   

                            



                                                                           
                                                           
                             
                               















                                                      
                                    


                                                      
                                                   





                                                                        
                                                               
                             
                               




                                
                                       


                                                                                  



       
                                                                 
                             
                               




                                    
                                           













                                                                                









                                          

                                                                              
                                                    







                                                      

                                        
                                        

                                          










                                                             

 
                                                


                                       
                                                   


                                          
                                                   


                                          
                                                        

                                                
import { has, values } from 'lodash'

import {
  REQUEST_ENDPOINTS,
  REQUEST_ENDPOINT_ACTIONS,
  REQUEST_VIDEO_EVENT_TYPES
} from '../../../initializers'
import { isArray } from '../misc'
import {
  isVideoAuthorValid,
  isVideoThumbnailDataValid,
  isVideoUUIDValid,
  isVideoAbuseReasonValid,
  isVideoAbuseReporterUsernameValid,
  isVideoViewsValid,
  isVideoLikesValid,
  isVideoDislikesValid,
  isVideoEventCountValid,
  isVideoDateValid,
  isVideoCategoryValid,
  isVideoLicenceValid,
  isVideoLanguageValid,
  isVideoNSFWValid,
  isVideoDescriptionValid,
  isVideoDurationValid,
  isVideoFileInfoHashValid,
  isVideoNameValid,
  isVideoTagsValid,
  isVideoFileExtnameValid,
  isVideoFileResolutionValid
} from '../videos'

const ENDPOINT_ACTIONS = REQUEST_ENDPOINT_ACTIONS[REQUEST_ENDPOINTS.VIDEOS]

function isEachRemoteRequestVideosValid (requests: any[]) {
  return isArray(requests) &&
    requests.every(request => {
      const video = request.data

      if (!video) return false

      return (
        isRequestTypeAddValid(request.type) &&
        isCommonVideoAttributesValid(video) &&
        isVideoAuthorValid(video.author) &&
        isVideoThumbnailDataValid(video.thumbnailData)
      ) ||
      (
        isRequestTypeUpdateValid(request.type) &&
        isCommonVideoAttributesValid(video)
      ) ||
      (
        isRequestTypeRemoveValid(request.type) &&
        isVideoUUIDValid(video.uuid)
      ) ||
      (
        isRequestTypeReportAbuseValid(request.type) &&
        isVideoUUIDValid(request.data.videoUUID) &&
        isVideoAbuseReasonValid(request.data.reportReason) &&
        isVideoAbuseReporterUsernameValid(request.data.reporterUsername)
      )
    })
}

function isEachRemoteRequestVideosQaduValid (requests: any[]) {
  return isArray(requests) &&
    requests.every(request => {
      const video = request.data

      if (!video) return false

      return (
        isVideoUUIDValid(video.uuid) &&
        (has(video, 'views') === false || isVideoViewsValid(video.views)) &&
        (has(video, 'likes') === false || isVideoLikesValid(video.likes)) &&
        (has(video, 'dislikes') === false || isVideoDislikesValid(video.dislikes))
      )
    })
}

function isEachRemoteRequestVideosEventsValid (requests: any[]) {
  return isArray(requests) &&
    requests.every(request => {
      const eventData = request.data

      if (!eventData) return false

      return (
        isVideoUUIDValid(eventData.uuid) &&
        values(REQUEST_VIDEO_EVENT_TYPES).indexOf(eventData.eventType) !== -1 &&
        isVideoEventCountValid(eventData.count)
      )
    })
}

// ---------------------------------------------------------------------------

export {
  isEachRemoteRequestVideosValid,
  isEachRemoteRequestVideosQaduValid,
  isEachRemoteRequestVideosEventsValid
}

declare global {
  namespace ExpressValidator {
    export interface Validator {
      isEachRemoteRequestVideosValid,
      isEachRemoteRequestVideosQaduValid,
      isEachRemoteRequestVideosEventsValid
    }
  }
}

// ---------------------------------------------------------------------------

function isCommonVideoAttributesValid (video: any) {
  return isVideoDateValid(video.createdAt) &&
         isVideoDateValid(video.updatedAt) &&
         isVideoCategoryValid(video.category) &&
         isVideoLicenceValid(video.licence) &&
         isVideoLanguageValid(video.language) &&
         isVideoNSFWValid(video.nsfw) &&
         isVideoDescriptionValid(video.description) &&
         isVideoDurationValid(video.duration) &&
         isVideoNameValid(video.name) &&
         isVideoTagsValid(video.tags) &&
         isVideoUUIDValid(video.uuid) &&
         isVideoViewsValid(video.views) &&
         isVideoLikesValid(video.likes) &&
         isVideoDislikesValid(video.dislikes) &&
         isArray(video.files) &&
         video.files.every(videoFile => {
           if (!videoFile) return false

           return (
             isVideoFileInfoHashValid(videoFile.infoHash) &&
             isVideoFileExtnameValid(videoFile.extname) &&
             isVideoFileResolutionValid(videoFile.resolution)
           )
         })
}

function isRequestTypeAddValid (value: string) {
  return value === ENDPOINT_ACTIONS.ADD
}

function isRequestTypeUpdateValid (value: string) {
  return value === ENDPOINT_ACTIONS.UPDATE
}

function isRequestTypeRemoveValid (value: string) {
  return value === ENDPOINT_ACTIONS.REMOVE
}

function isRequestTypeReportAbuseValid (value: string) {
  return value === ENDPOINT_ACTIONS.REPORT_ABUSE
}