]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/models/account/account-video-rate.ts
Merge branch 'release/3.2.0' into develop
[github/Chocobozzz/PeerTube.git] / server / models / account / account-video-rate.ts
index d9c52949114becc9b603f7cb0874aa947df6cbce..ee6dbc6da055dd6f3aafc3f6661997172404b948 100644 (file)
@@ -7,11 +7,12 @@ import {
   MAccountVideoRateAccountVideo,
   MAccountVideoRateFormattable
 } from '@server/types/models/video/video-rate'
+import { AttributesOnly } from '@shared/core-utils'
 import { AccountVideoRate } from '../../../shared'
 import { VideoRateType } from '../../../shared/models/videos'
 import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
 import { CONSTRAINTS_FIELDS, VIDEO_RATE_TYPES } from '../../initializers/constants'
-import { ActorModel } from '../activitypub/actor'
+import { ActorModel } from '../actor/actor'
 import { buildLocalAccountIdsIn, getSort, throwIfNotValid } from '../utils'
 import { VideoModel } from '../video/video'
 import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from '../video/video-channel'
@@ -42,7 +43,7 @@ import { AccountModel } from './account'
     }
   ]
 })
-export class AccountVideoRateModel extends Model {
+export class AccountVideoRateModel extends Model<Partial<AttributesOnly<AccountVideoRateModel>>> {
 
   @AllowNull(false)
   @Column(DataType.ENUM(...values(VIDEO_RATE_TYPES)))
@@ -146,10 +147,22 @@ export class AccountVideoRateModel extends Model {
     return AccountVideoRateModel.findAndCountAll(query)
   }
 
+  static listRemoteRateUrlsOfLocalVideos () {
+    const query = `SELECT "accountVideoRate".url FROM "accountVideoRate" ` +
+      `INNER JOIN account ON account.id = "accountVideoRate"."accountId" ` +
+      `INNER JOIN actor ON actor.id = account."actorId" AND actor."serverId" IS NOT NULL ` +
+      `INNER JOIN video ON video.id = "accountVideoRate"."videoId" AND video.remote IS FALSE`
+
+    return AccountVideoRateModel.sequelize.query<{ url: string }>(query, {
+      type: QueryTypes.SELECT,
+      raw: true
+    }).then(rows => rows.map(r => r.url))
+  }
+
   static loadLocalAndPopulateVideo (
     rateType: VideoRateType,
     accountName: string,
-    videoId: number | string,
+    videoId: number,
     t?: Transaction
   ): Promise<MAccountVideoRateAccountVideo> {
     const options: FindOptions = {
@@ -241,21 +254,7 @@ export class AccountVideoRateModel extends Model {
 
       await AccountVideoRateModel.destroy(query)
 
-      const field = type === 'like'
-        ? 'likes'
-        : 'dislikes'
-
-      const rawQuery = `UPDATE "video" SET "${field}" = ` +
-        '(' +
-          'SELECT COUNT(id) FROM "accountVideoRate" WHERE "accountVideoRate"."videoId" = "video"."id" AND type = :rateType' +
-        ') ' +
-        'WHERE "video"."id" = :videoId'
-
-      return AccountVideoRateModel.sequelize.query(rawQuery, {
-        transaction: t,
-        replacements: { videoId, rateType: type },
-        type: QueryTypes.UPDATE
-      })
+      return VideoModel.updateRatesOf(videoId, type, t)
     })
   }