+import { VideoRateType } from '../../../shared/models/videos'
+import * as Bluebird from 'bluebird'
+import { getOrCreateActorAndServerAndModel } from './actor'
+import { AccountVideoRateModel } from '../../models/account/account-video-rate'
+import { logger } from '../../helpers/logger'
+import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers'
+
+async function createRates (actorUrls: string[], video: VideoModel, rate: VideoRateType) {
+ let rateCounts = 0
+
+ await Bluebird.map(actorUrls, async actorUrl => {
+ try {
+ const actor = await getOrCreateActorAndServerAndModel(actorUrl)
+ const [ , created ] = await AccountVideoRateModel
+ .findOrCreate({
+ where: {
+ videoId: video.id,
+ accountId: actor.Account.id
+ },
+ defaults: {
+ videoId: video.id,
+ accountId: actor.Account.id,
+ type: rate
+ }
+ })
+
+ if (created) rateCounts += 1
+ } catch (err) {
+ logger.warn('Cannot add rate %s for actor %s.', rate, actorUrl, { err })
+ }
+ }, { concurrency: CRAWL_REQUEST_CONCURRENCY })
+
+ logger.info('Adding %d %s to video %s.', rateCounts, rate, video.uuid)
+
+ // This is "likes" and "dislikes"
+ if (rateCounts !== 0) await video.increment(rate + 's', { by: rateCounts })
+
+ return
+}