X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Faccount%2Faccount-video-rate.ts;h=2185619520367fece76b0b7590cef16a40c74c57;hb=c55e3d7227fe1453869e309025996b9d75256d5d;hp=a6edbeee8b2b8ac8a2d9e48077f9a7de468166fe;hpb=8d5e65349deebd499c0be10fe02d535a77d58ddb;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/account/account-video-rate.ts b/server/models/account/account-video-rate.ts index a6edbeee8..218561952 100644 --- a/server/models/account/account-video-rate.ts +++ b/server/models/account/account-video-rate.ts @@ -1,22 +1,22 @@ import { values } from 'lodash' -import { FindOptions, Op, Transaction } from 'sequelize' +import { FindOptions, Op, QueryTypes, Transaction } from 'sequelize' import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' -import { VideoRateType } from '../../../shared/models/videos' -import { CONSTRAINTS_FIELDS, VIDEO_RATE_TYPES } from '../../initializers/constants' -import { VideoModel } from '../video/video' -import { AccountModel } from './account' -import { ActorModel } from '../activitypub/actor' -import { buildLocalAccountIdsIn, getSort, throwIfNotValid } from '../utils' -import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' -import { AccountVideoRate } from '../../../shared' -import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from '../video/video-channel' -import * as Bluebird from 'bluebird' import { MAccountVideoRate, MAccountVideoRateAccountUrl, MAccountVideoRateAccountVideo, MAccountVideoRateFormattable -} from '@server/typings/models/video/video-rate' +} from '@server/types/models/video/video-rate' +import { AttributesOnly } from '@shared/typescript-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 '../actor/actor' +import { buildLocalAccountIdsIn, getSort, throwIfNotValid } from '../utils' +import { VideoModel } from '../video/video' +import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from '../video/video-channel' +import { AccountModel } from './account' /* Account rates per video. @@ -43,7 +43,7 @@ import { } ] }) -export class AccountVideoRateModel extends Model { +export class AccountVideoRateModel extends Model>> { @AllowNull(false) @Column(DataType.ENUM(...values(VIDEO_RATE_TYPES))) @@ -84,7 +84,7 @@ export class AccountVideoRateModel extends Model { }) Account: AccountModel - static load (accountId: number, videoId: number, transaction?: Transaction): Bluebird { + static load (accountId: number, videoId: number, transaction?: Transaction): Promise { const options: FindOptions = { where: { accountId, @@ -96,10 +96,10 @@ export class AccountVideoRateModel extends Model { return AccountVideoRateModel.findOne(options) } - static loadByAccountAndVideoOrUrl (accountId: number, videoId: number, url: string, t?: Transaction): Bluebird { + static loadByAccountAndVideoOrUrl (accountId: number, videoId: number, url: string, t?: Transaction): Promise { const options: FindOptions = { where: { - [ Op.or]: [ + [Op.or]: [ { accountId, videoId @@ -116,10 +116,10 @@ export class AccountVideoRateModel extends Model { } static listByAccountForApi (options: { - start: number, - count: number, - sort: string, - type?: string, + start: number + count: number + sort: string + type?: string accountId: number }) { const query: FindOptions = { @@ -135,7 +135,7 @@ export class AccountVideoRateModel extends Model { required: true, include: [ { - model: VideoChannelModel.scope({ method: [VideoChannelScopeNames.SUMMARY, { withAccount: true } as SummaryOptions ] }), + model: VideoChannelModel.scope({ method: [ VideoChannelScopeNames.SUMMARY, { withAccount: true } as SummaryOptions ] }), required: true } ] @@ -147,12 +147,24 @@ 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, t?: Transaction - ): Bluebird { + ): Promise { const options: FindOptions = { where: { videoId, @@ -168,7 +180,8 @@ export class AccountVideoRateModel extends Model { model: ActorModel.unscoped(), required: true, where: { - preferredUsername: accountName + preferredUsername: accountName, + serverId: null } } ] @@ -239,17 +252,9 @@ export class AccountVideoRateModel extends Model { transaction: t } - const deleted = await AccountVideoRateModel.destroy(query) - - const options = { - transaction: t, - where: { - id: videoId - } - } + await AccountVideoRateModel.destroy(query) - if (type === 'like') await VideoModel.increment({ likes: -deleted }, options) - else if (type === 'dislike') await VideoModel.increment({ dislikes: -deleted }, options) + return VideoModel.updateRatesOf(videoId, type, t) }) }