X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fcontrollers%2Fapi%2Fvideos%2Frate.ts;h=b1732837d1518c08f7e58a85b2863e5a0e91ffe1;hb=a2377d15ee09301cf4cc5434ad865a21918da15f;hp=727984506158d5731893237656b48788405aa7ad;hpb=53abc4c272be9ecc951274458d054dbaf86e594d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/controllers/api/videos/rate.ts b/server/controllers/api/videos/rate.ts index 727984506..b1732837d 100644 --- a/server/controllers/api/videos/rate.ts +++ b/server/controllers/api/videos/rate.ts @@ -1,32 +1,19 @@ import * as express from 'express' - -import { database as db } from '../../../initializers/database' -import { - logger, - retryTransactionWrapper -} from '../../../helpers' -import { - VIDEO_RATE_TYPES, - REQUEST_VIDEO_EVENT_TYPES, - REQUEST_VIDEO_QADU_TYPES -} from '../../../initializers' -import { - addEventsToRemoteVideo, - quickAndDirtyUpdatesVideoToFriends -} from '../../../lib' -import { - authenticate, - videoRateValidator, - asyncMiddleware -} from '../../../middlewares' import { UserVideoRateUpdate } from '../../../../shared' +import { logger } from '../../../helpers/logger' +import { sequelizeTypescript, VIDEO_RATE_TYPES } from '../../../initializers' +import { sendVideoRateChange } from '../../../lib/activitypub' +import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate, videoRateValidator } from '../../../middlewares' +import { AccountModel } from '../../../models/account/account' +import { AccountVideoRateModel } from '../../../models/account/account-video-rate' +import { VideoModel } from '../../../models/video/video' const rateVideoRouter = express.Router() rateVideoRouter.put('/:id/rate', authenticate, - videoRateValidator, - asyncMiddleware(rateVideoRetryWrapper) + asyncMiddleware(videoRateValidator), + asyncRetryTransactionMiddleware(rateVideo) ) // --------------------------------------------------------------------------- @@ -37,26 +24,15 @@ 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 = res.locals.video - const userInstance = res.locals.oauth.token.User + const videoInstance: VideoModel = res.locals.video + const accountInstance: AccountModel = 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.UserVideoRate.load(userInstance.id, videoInstance.id, t) + const previousRate = await AccountVideoRateModel.load(accountInstance.id, videoInstance.id, t) let likesToIncrement = 0 let dislikesToIncrement = 0 @@ -71,20 +47,19 @@ async function rateVideo (req: express.Request, res: express.Response) { else if (previousRate.type === VIDEO_RATE_TYPES.DISLIKE) dislikesToIncrement-- if (rateType === 'none') { // Destroy previous rate - await previousRate.destroy() + await previousRate.destroy({ transaction: t }) } else { // Update previous rate previousRate.type = rateType - - await previousRate.save() + await previousRate.save({ transaction: t }) } } else if (rateType !== 'none') { // There was not a previous rate, insert a new one if there is a rate const query = { - userId: userInstance.id, + accountId: accountInstance.id, videoId: videoInstance.id, type: rateType } - await db.UserVideoRate.create(query, sequelizeOptions) + await AccountVideoRateModel.create(query, sequelizeOptions) } const incrementQuery = { @@ -92,52 +67,12 @@ 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) - // Send a event to original pod - if (videoInstance.isOwned() === false) { - - const eventsParams = [] - - if (likesToIncrement !== 0) { - eventsParams.push({ - videoId: videoInstance.id, - type: REQUEST_VIDEO_EVENT_TYPES.LIKES, - count: likesToIncrement - }) - } - - if (dislikesToIncrement !== 0) { - eventsParams.push({ - videoId: videoInstance.id, - type: REQUEST_VIDEO_EVENT_TYPES.DISLIKES, - count: dislikesToIncrement - }) - } - - await addEventsToRemoteVideo(eventsParams, t) - } else { // We own the video, we need to send a quick and dirty update to friends to notify the counts changed - const qadusParams = [] - - if (likesToIncrement !== 0) { - qadusParams.push({ - videoId: videoInstance.id, - type: REQUEST_VIDEO_QADU_TYPES.LIKES - }) - } - - if (dislikesToIncrement !== 0) { - qadusParams.push({ - videoId: videoInstance.id, - type: REQUEST_VIDEO_QADU_TYPES.DISLIKES - }) - } - - await quickAndDirtyUpdatesVideoToFriends(qadusParams, t) - } + await sendVideoRateChange(accountInstance, videoInstance, likesToIncrement, dislikesToIncrement, t) }) - logger.info('User video rate for video %s of user %s updated.', videoInstance.name, userInstance.username) + logger.info('Account video rate for video %s of account %s updated.', videoInstance.name, accountInstance.name) + + return res.type('json').status(204).end() }