X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fvideos%2Frate.ts;h=6b26a8eee68b662f7a21d331cbcd59e2a66343a9;hb=d17c7b4e8c52317bdc874917387b7a49f6cf8b01;hp=0c6a988cfbdb0b69118cd4da662df7c7c301c009;hpb=a2431b7dcbc72c05101dcdbe631ff84a823aeb51;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/videos/rate.ts b/server/controllers/api/videos/rate.ts index 0c6a988cf..6b26a8eee 100644 --- a/server/controllers/api/videos/rate.ts +++ b/server/controllers/api/videos/rate.ts @@ -1,19 +1,19 @@ -import * as express from 'express' -import { UserVideoRateUpdate } from '../../../../shared' -import { logger, retryTransactionWrapper } from '../../../helpers' -import { VIDEO_RATE_TYPES } from '../../../initializers' -import { database as db } from '../../../initializers/database' -import { sendVideoRateChangeToFollowers, sendVideoRateChangeToOrigin } from '../../../lib/activitypub/videos' -import { asyncMiddleware, authenticate, videoRateValidator } from '../../../middlewares' -import { AccountInstance } from '../../../models/account/account-interface' -import { VideoInstance } from '../../../models/video/video-interface' +import express from 'express' +import { HttpStatusCode, UserVideoRateUpdate } from '@shared/models' +import { logger } from '../../../helpers/logger' +import { VIDEO_RATE_TYPES } from '../../../initializers/constants' +import { sequelizeTypescript } from '../../../initializers/database' +import { getLocalRateUrl, sendVideoRateChange } from '../../../lib/activitypub/video-rates' +import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate, videoUpdateRateValidator } from '../../../middlewares' +import { AccountModel } from '../../../models/account/account' +import { AccountVideoRateModel } from '../../../models/account/account-video-rate' const rateVideoRouter = express.Router() rateVideoRouter.put('/:id/rate', authenticate, - asyncMiddleware(videoRateValidator), - asyncMiddleware(rateVideoRetryWrapper) + asyncMiddleware(videoUpdateRateValidator), + asyncRetryTransactionMiddleware(rateVideo) ) // --------------------------------------------------------------------------- @@ -24,26 +24,20 @@ export { // --------------------------------------------------------------------------- -async function rateVideoRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) { - const options = { - arguments: [ req, res ], - errorMessage: 'Cannot update the user video rate.' - } - - await retryTransactionWrapper(rateVideo, options) - - return res.type('json').status(204).end() -} - async function rateVideo (req: express.Request, res: express.Response) { const body: UserVideoRateUpdate = req.body const rateType = body.rating - const videoInstance: VideoInstance = res.locals.video - const accountInstance: AccountInstance = res.locals.oauth.token.User.Account + const videoInstance = res.locals.videoAll + const userAccount = res.locals.oauth.token.User.Account - await db.sequelize.transaction(async t => { + await sequelizeTypescript.transaction(async t => { const sequelizeOptions = { transaction: t } - const previousRate = await db.AccountVideoRate.load(accountInstance.id, videoInstance.id, t) + + const accountInstance = await AccountModel.load(userAccount.id, t) + const previousRate = await AccountVideoRateModel.load(accountInstance.id, videoInstance.id, t) + + // Same rate, nothing do to + if (rateType === 'none' && !previousRate || previousRate?.type === rateType) return let likesToIncrement = 0 let dislikesToIncrement = 0 @@ -54,24 +48,25 @@ async function rateVideo (req: express.Request, res: express.Response) { // There was a previous rate, update it if (previousRate) { // We will remove the previous rate, so we will need to update the video count attribute - if (previousRate.type === VIDEO_RATE_TYPES.LIKE) likesToIncrement-- - else if (previousRate.type === VIDEO_RATE_TYPES.DISLIKE) dislikesToIncrement-- + if (previousRate.type === 'like') likesToIncrement-- + else if (previousRate.type === 'dislike') dislikesToIncrement-- if (rateType === 'none') { // Destroy previous rate - await previousRate.destroy() + await previousRate.destroy(sequelizeOptions) } else { // Update previous rate previousRate.type = rateType - - await previousRate.save() + previousRate.url = getLocalRateUrl(rateType, userAccount.Actor, videoInstance) + await previousRate.save(sequelizeOptions) } } else if (rateType !== 'none') { // There was not a previous rate, insert a new one if there is a rate const query = { accountId: accountInstance.id, videoId: videoInstance.id, - type: rateType + type: rateType, + url: getLocalRateUrl(rateType, userAccount.Actor, videoInstance) } - await db.AccountVideoRate.create(query, sequelizeOptions) + await AccountVideoRateModel.create(query, sequelizeOptions) } const incrementQuery = { @@ -79,16 +74,14 @@ async function rateVideo (req: express.Request, res: express.Response) { dislikes: dislikesToIncrement } - // Even if we do not own the video we increment the attributes - // It is useful for the user to have a feedback await videoInstance.increment(incrementQuery, sequelizeOptions) - if (videoInstance.isOwned()) { - await sendVideoRateChangeToFollowers(accountInstance, videoInstance, likesToIncrement, dislikesToIncrement, t) - } else { - await sendVideoRateChangeToOrigin(accountInstance, videoInstance, likesToIncrement, dislikesToIncrement, t) - } + await sendVideoRateChange(accountInstance, videoInstance, likesToIncrement, dislikesToIncrement, t) + + logger.info('Account video rate for video %s of account %s updated.', videoInstance.name, accountInstance.name) }) - logger.info('Account video rate for video %s of account %s updated.', videoInstance.name, accountInstance.name) + return res.type('json') + .status(HttpStatusCode.NO_CONTENT_204) + .end() }