diff options
author | Chocobozzz <me@florianbigard.com> | 2018-09-20 10:13:13 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2018-09-20 11:45:59 +0200 |
commit | 91411dba928678c15a5e99d9795ae061909e397d (patch) | |
tree | 7ba6e340cc9eb6f993051fcac74eefd652cb0ffd | |
parent | fcc7c060374c3a547257d96af847352c14d6144b (diff) | |
download | PeerTube-91411dba928678c15a5e99d9795ae061909e397d.tar.gz PeerTube-91411dba928678c15a5e99d9795ae061909e397d.tar.zst PeerTube-91411dba928678c15a5e99d9795ae061909e397d.zip |
Limit associations fetch when loading token
-rw-r--r-- | server/controllers/api/users/index.ts | 16 | ||||
-rw-r--r-- | server/controllers/api/users/me.ts | 28 | ||||
-rw-r--r-- | server/controllers/api/video-channel.ts | 9 | ||||
-rw-r--r-- | server/controllers/api/videos/abuse.ts | 23 | ||||
-rw-r--r-- | server/controllers/api/videos/comment.ts | 14 | ||||
-rw-r--r-- | server/controllers/api/videos/ownership.ts | 13 | ||||
-rw-r--r-- | server/controllers/api/videos/rate.ts | 11 | ||||
-rw-r--r-- | server/lib/activitypub/videos.ts | 4 | ||||
-rw-r--r-- | server/lib/schedulers/youtube-dl-update-scheduler.ts | 7 | ||||
-rw-r--r-- | server/models/account/account.ts | 4 | ||||
-rw-r--r-- | server/models/oauth/oauth-token.ts | 26 |
11 files changed, 75 insertions, 80 deletions
diff --git a/server/controllers/api/users/index.ts b/server/controllers/api/users/index.ts index a299167e8..d1163900b 100644 --- a/server/controllers/api/users/index.ts +++ b/server/controllers/api/users/index.ts | |||
@@ -267,15 +267,9 @@ async function updateUser (req: express.Request, res: express.Response, next: ex | |||
267 | const user = await userToUpdate.save() | 267 | const user = await userToUpdate.save() |
268 | 268 | ||
269 | // Destroy user token to refresh rights | 269 | // Destroy user token to refresh rights |
270 | if (roleChanged) { | 270 | if (roleChanged) await OAuthTokenModel.deleteUserToken(userToUpdate.id) |
271 | await OAuthTokenModel.deleteUserToken(userToUpdate.id) | ||
272 | } | ||
273 | 271 | ||
274 | auditLogger.update( | 272 | auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView) |
275 | getAuditIdFromRes(res), | ||
276 | new UserAuditView(user.toFormattedJSON()), | ||
277 | oldUserAuditView | ||
278 | ) | ||
279 | 273 | ||
280 | // Don't need to send this update to followers, these attributes are not propagated | 274 | // Don't need to send this update to followers, these attributes are not propagated |
281 | 275 | ||
@@ -343,9 +337,5 @@ async function changeUserBlock (res: express.Response, user: UserModel, block: b | |||
343 | 337 | ||
344 | await Emailer.Instance.addUserBlockJob(user, block, reason) | 338 | await Emailer.Instance.addUserBlockJob(user, block, reason) |
345 | 339 | ||
346 | auditLogger.update( | 340 | auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView) |
347 | getAuditIdFromRes(res), | ||
348 | new UserAuditView(user.toFormattedJSON()), | ||
349 | oldUserAuditView | ||
350 | ) | ||
351 | } | 341 | } |
diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts index d4b7e3715..eba1e7edd 100644 --- a/server/controllers/api/users/me.ts +++ b/server/controllers/api/users/me.ts | |||
@@ -38,6 +38,7 @@ import { VideoFilter } from '../../../../shared/models/videos/video-query.type' | |||
38 | import { ActorFollowModel } from '../../../models/activitypub/actor-follow' | 38 | import { ActorFollowModel } from '../../../models/activitypub/actor-follow' |
39 | import { JobQueue } from '../../../lib/job-queue' | 39 | import { JobQueue } from '../../../lib/job-queue' |
40 | import { logger } from '../../../helpers/logger' | 40 | import { logger } from '../../../helpers/logger' |
41 | import { AccountModel } from '../../../models/account/account' | ||
41 | 42 | ||
42 | const auditLogger = auditLoggerFactory('users-me') | 43 | const auditLogger = auditLoggerFactory('users-me') |
43 | 44 | ||
@@ -329,19 +330,17 @@ async function updateMe (req: express.Request, res: express.Response, next: expr | |||
329 | if (body.autoPlayVideo !== undefined) user.autoPlayVideo = body.autoPlayVideo | 330 | if (body.autoPlayVideo !== undefined) user.autoPlayVideo = body.autoPlayVideo |
330 | 331 | ||
331 | await sequelizeTypescript.transaction(async t => { | 332 | await sequelizeTypescript.transaction(async t => { |
333 | const userAccount = await AccountModel.load(user.Account.id) | ||
334 | |||
332 | await user.save({ transaction: t }) | 335 | await user.save({ transaction: t }) |
333 | 336 | ||
334 | if (body.displayName !== undefined) user.Account.name = body.displayName | 337 | if (body.displayName !== undefined) userAccount.name = body.displayName |
335 | if (body.description !== undefined) user.Account.description = body.description | 338 | if (body.description !== undefined) userAccount.description = body.description |
336 | await user.Account.save({ transaction: t }) | 339 | await userAccount.save({ transaction: t }) |
337 | 340 | ||
338 | await sendUpdateActor(user.Account, t) | 341 | await sendUpdateActor(userAccount, t) |
339 | 342 | ||
340 | auditLogger.update( | 343 | auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView) |
341 | getAuditIdFromRes(res), | ||
342 | new UserAuditView(user.toFormattedJSON()), | ||
343 | oldUserAuditView | ||
344 | ) | ||
345 | }) | 344 | }) |
346 | 345 | ||
347 | return res.sendStatus(204) | 346 | return res.sendStatus(204) |
@@ -351,15 +350,12 @@ async function updateMyAvatar (req: express.Request, res: express.Response, next | |||
351 | const avatarPhysicalFile = req.files[ 'avatarfile' ][ 0 ] | 350 | const avatarPhysicalFile = req.files[ 'avatarfile' ][ 0 ] |
352 | const user: UserModel = res.locals.oauth.token.user | 351 | const user: UserModel = res.locals.oauth.token.user |
353 | const oldUserAuditView = new UserAuditView(user.toFormattedJSON()) | 352 | const oldUserAuditView = new UserAuditView(user.toFormattedJSON()) |
354 | const account = user.Account | ||
355 | 353 | ||
356 | const avatar = await updateActorAvatarFile(avatarPhysicalFile, account.Actor, account) | 354 | const userAccount = await AccountModel.load(user.Account.id) |
357 | 355 | ||
358 | auditLogger.update( | 356 | const avatar = await updateActorAvatarFile(avatarPhysicalFile, userAccount.Actor, userAccount) |
359 | getAuditIdFromRes(res), | 357 | |
360 | new UserAuditView(user.toFormattedJSON()), | 358 | auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView) |
361 | oldUserAuditView | ||
362 | ) | ||
363 | 359 | ||
364 | return res.json({ avatar: avatar.toFormattedJSON() }) | 360 | return res.json({ avatar: avatar.toFormattedJSON() }) |
365 | } | 361 | } |
diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts index 50dc44f7c..8fc340224 100644 --- a/server/controllers/api/video-channel.ts +++ b/server/controllers/api/video-channel.ts | |||
@@ -29,6 +29,7 @@ import { updateAvatarValidator } from '../../middlewares/validators/avatar' | |||
29 | import { updateActorAvatarFile } from '../../lib/avatar' | 29 | import { updateActorAvatarFile } from '../../lib/avatar' |
30 | import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../helpers/audit-logger' | 30 | import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../helpers/audit-logger' |
31 | import { resetSequelizeInstance } from '../../helpers/database-utils' | 31 | import { resetSequelizeInstance } from '../../helpers/database-utils' |
32 | import { UserModel } from '../../models/account/user' | ||
32 | 33 | ||
33 | const auditLogger = auditLoggerFactory('channels') | 34 | const auditLogger = auditLoggerFactory('channels') |
34 | const reqAvatarFile = createReqFiles([ 'avatarfile' ], IMAGE_MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.AVATARS_DIR }) | 35 | const reqAvatarFile = createReqFiles([ 'avatarfile' ], IMAGE_MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.AVATARS_DIR }) |
@@ -123,19 +124,17 @@ async function updateVideoChannelAvatar (req: express.Request, res: express.Resp | |||
123 | 124 | ||
124 | async function addVideoChannel (req: express.Request, res: express.Response) { | 125 | async function addVideoChannel (req: express.Request, res: express.Response) { |
125 | const videoChannelInfo: VideoChannelCreate = req.body | 126 | const videoChannelInfo: VideoChannelCreate = req.body |
126 | const account: AccountModel = res.locals.oauth.token.User.Account | ||
127 | 127 | ||
128 | const videoChannelCreated: VideoChannelModel = await sequelizeTypescript.transaction(async t => { | 128 | const videoChannelCreated: VideoChannelModel = await sequelizeTypescript.transaction(async t => { |
129 | const account = await AccountModel.load((res.locals.oauth.token.User as UserModel).Account.id, t) | ||
130 | |||
129 | return createVideoChannel(videoChannelInfo, account, t) | 131 | return createVideoChannel(videoChannelInfo, account, t) |
130 | }) | 132 | }) |
131 | 133 | ||
132 | setAsyncActorKeys(videoChannelCreated.Actor) | 134 | setAsyncActorKeys(videoChannelCreated.Actor) |
133 | .catch(err => logger.error('Cannot set async actor keys for account %s.', videoChannelCreated.Actor.uuid, { err })) | 135 | .catch(err => logger.error('Cannot set async actor keys for account %s.', videoChannelCreated.Actor.uuid, { err })) |
134 | 136 | ||
135 | auditLogger.create( | 137 | auditLogger.create(getAuditIdFromRes(res), new VideoChannelAuditView(videoChannelCreated.toFormattedJSON())) |
136 | getAuditIdFromRes(res), | ||
137 | new VideoChannelAuditView(videoChannelCreated.toFormattedJSON()) | ||
138 | ) | ||
139 | logger.info('Video channel with uuid %s created.', videoChannelCreated.Actor.uuid) | 138 | logger.info('Video channel with uuid %s created.', videoChannelCreated.Actor.uuid) |
140 | 139 | ||
141 | return res.json({ | 140 | return res.json({ |
diff --git a/server/controllers/api/videos/abuse.ts b/server/controllers/api/videos/abuse.ts index 08e11b00b..d0c81804b 100644 --- a/server/controllers/api/videos/abuse.ts +++ b/server/controllers/api/videos/abuse.ts | |||
@@ -21,6 +21,7 @@ import { AccountModel } from '../../../models/account/account' | |||
21 | import { VideoModel } from '../../../models/video/video' | 21 | import { VideoModel } from '../../../models/video/video' |
22 | import { VideoAbuseModel } from '../../../models/video/video-abuse' | 22 | import { VideoAbuseModel } from '../../../models/video/video-abuse' |
23 | import { auditLoggerFactory, VideoAbuseAuditView } from '../../../helpers/audit-logger' | 23 | import { auditLoggerFactory, VideoAbuseAuditView } from '../../../helpers/audit-logger' |
24 | import { UserModel } from '../../../models/account/user' | ||
24 | 25 | ||
25 | const auditLogger = auditLoggerFactory('abuse') | 26 | const auditLogger = auditLoggerFactory('abuse') |
26 | const abuseVideoRouter = express.Router() | 27 | const abuseVideoRouter = express.Router() |
@@ -95,17 +96,18 @@ async function deleteVideoAbuse (req: express.Request, res: express.Response) { | |||
95 | 96 | ||
96 | async function reportVideoAbuse (req: express.Request, res: express.Response) { | 97 | async function reportVideoAbuse (req: express.Request, res: express.Response) { |
97 | const videoInstance = res.locals.video as VideoModel | 98 | const videoInstance = res.locals.video as VideoModel |
98 | const reporterAccount = res.locals.oauth.token.User.Account as AccountModel | ||
99 | const body: VideoAbuseCreate = req.body | 99 | const body: VideoAbuseCreate = req.body |
100 | 100 | ||
101 | const abuseToCreate = { | ||
102 | reporterAccountId: reporterAccount.id, | ||
103 | reason: body.reason, | ||
104 | videoId: videoInstance.id, | ||
105 | state: VideoAbuseState.PENDING | ||
106 | } | ||
107 | |||
108 | const videoAbuse: VideoAbuseModel = await sequelizeTypescript.transaction(async t => { | 101 | const videoAbuse: VideoAbuseModel = await sequelizeTypescript.transaction(async t => { |
102 | const reporterAccount = await AccountModel.load((res.locals.oauth.token.User as UserModel).Account.id, t) | ||
103 | |||
104 | const abuseToCreate = { | ||
105 | reporterAccountId: reporterAccount.id, | ||
106 | reason: body.reason, | ||
107 | videoId: videoInstance.id, | ||
108 | state: VideoAbuseState.PENDING | ||
109 | } | ||
110 | |||
109 | const videoAbuseInstance = await VideoAbuseModel.create(abuseToCreate, { transaction: t }) | 111 | const videoAbuseInstance = await VideoAbuseModel.create(abuseToCreate, { transaction: t }) |
110 | videoAbuseInstance.Video = videoInstance | 112 | videoAbuseInstance.Video = videoInstance |
111 | videoAbuseInstance.Account = reporterAccount | 113 | videoAbuseInstance.Account = reporterAccount |
@@ -121,7 +123,6 @@ async function reportVideoAbuse (req: express.Request, res: express.Response) { | |||
121 | }) | 123 | }) |
122 | 124 | ||
123 | logger.info('Abuse report for video %s created.', videoInstance.name) | 125 | logger.info('Abuse report for video %s created.', videoInstance.name) |
124 | return res.json({ | 126 | |
125 | videoAbuse: videoAbuse.toFormattedJSON() | 127 | return res.json({ videoAbuse: videoAbuse.toFormattedJSON() }).end() |
126 | }).end() | ||
127 | } | 128 | } |
diff --git a/server/controllers/api/videos/comment.ts b/server/controllers/api/videos/comment.ts index 40ad54d09..dc25e1e85 100644 --- a/server/controllers/api/videos/comment.ts +++ b/server/controllers/api/videos/comment.ts | |||
@@ -24,6 +24,8 @@ import { | |||
24 | import { VideoModel } from '../../../models/video/video' | 24 | import { VideoModel } from '../../../models/video/video' |
25 | import { VideoCommentModel } from '../../../models/video/video-comment' | 25 | import { VideoCommentModel } from '../../../models/video/video-comment' |
26 | import { auditLoggerFactory, CommentAuditView, getAuditIdFromRes } from '../../../helpers/audit-logger' | 26 | import { auditLoggerFactory, CommentAuditView, getAuditIdFromRes } from '../../../helpers/audit-logger' |
27 | import { AccountModel } from '../../../models/account/account' | ||
28 | import { UserModel } from '../../../models/account/user' | ||
27 | 29 | ||
28 | const auditLogger = auditLoggerFactory('comments') | 30 | const auditLogger = auditLoggerFactory('comments') |
29 | const videoCommentRouter = express.Router() | 31 | const videoCommentRouter = express.Router() |
@@ -101,11 +103,13 @@ async function addVideoCommentThread (req: express.Request, res: express.Respons | |||
101 | const videoCommentInfo: VideoCommentCreate = req.body | 103 | const videoCommentInfo: VideoCommentCreate = req.body |
102 | 104 | ||
103 | const comment = await sequelizeTypescript.transaction(async t => { | 105 | const comment = await sequelizeTypescript.transaction(async t => { |
106 | const account = await AccountModel.load((res.locals.oauth.token.User as UserModel).Account.id, t) | ||
107 | |||
104 | return createVideoComment({ | 108 | return createVideoComment({ |
105 | text: videoCommentInfo.text, | 109 | text: videoCommentInfo.text, |
106 | inReplyToComment: null, | 110 | inReplyToComment: null, |
107 | video: res.locals.video, | 111 | video: res.locals.video, |
108 | account: res.locals.oauth.token.User.Account | 112 | account |
109 | }, t) | 113 | }, t) |
110 | }) | 114 | }) |
111 | 115 | ||
@@ -120,19 +124,19 @@ async function addVideoCommentReply (req: express.Request, res: express.Response | |||
120 | const videoCommentInfo: VideoCommentCreate = req.body | 124 | const videoCommentInfo: VideoCommentCreate = req.body |
121 | 125 | ||
122 | const comment = await sequelizeTypescript.transaction(async t => { | 126 | const comment = await sequelizeTypescript.transaction(async t => { |
127 | const account = await AccountModel.load((res.locals.oauth.token.User as UserModel).Account.id, t) | ||
128 | |||
123 | return createVideoComment({ | 129 | return createVideoComment({ |
124 | text: videoCommentInfo.text, | 130 | text: videoCommentInfo.text, |
125 | inReplyToComment: res.locals.videoComment, | 131 | inReplyToComment: res.locals.videoComment, |
126 | video: res.locals.video, | 132 | video: res.locals.video, |
127 | account: res.locals.oauth.token.User.Account | 133 | account |
128 | }, t) | 134 | }, t) |
129 | }) | 135 | }) |
130 | 136 | ||
131 | auditLogger.create(getAuditIdFromRes(res), new CommentAuditView(comment.toFormattedJSON())) | 137 | auditLogger.create(getAuditIdFromRes(res), new CommentAuditView(comment.toFormattedJSON())) |
132 | 138 | ||
133 | return res.json({ | 139 | return res.json({ comment: comment.toFormattedJSON() }).end() |
134 | comment: comment.toFormattedJSON() | ||
135 | }).end() | ||
136 | } | 140 | } |
137 | 141 | ||
138 | async function removeVideoComment (req: express.Request, res: express.Response) { | 142 | async function removeVideoComment (req: express.Request, res: express.Response) { |
diff --git a/server/controllers/api/videos/ownership.ts b/server/controllers/api/videos/ownership.ts index d26ed6cfc..5ea7d7c6a 100644 --- a/server/controllers/api/videos/ownership.ts +++ b/server/controllers/api/videos/ownership.ts | |||
@@ -19,6 +19,7 @@ import { VideoChannelModel } from '../../../models/video/video-channel' | |||
19 | import { getFormattedObjects } from '../../../helpers/utils' | 19 | import { getFormattedObjects } from '../../../helpers/utils' |
20 | import { changeVideoChannelShare } from '../../../lib/activitypub' | 20 | import { changeVideoChannelShare } from '../../../lib/activitypub' |
21 | import { sendUpdateVideo } from '../../../lib/activitypub/send' | 21 | import { sendUpdateVideo } from '../../../lib/activitypub/send' |
22 | import { UserModel } from '../../../models/account/user' | ||
22 | 23 | ||
23 | const ownershipVideoRouter = express.Router() | 24 | const ownershipVideoRouter = express.Router() |
24 | 25 | ||
@@ -58,26 +59,25 @@ export { | |||
58 | 59 | ||
59 | async function giveVideoOwnership (req: express.Request, res: express.Response) { | 60 | async function giveVideoOwnership (req: express.Request, res: express.Response) { |
60 | const videoInstance = res.locals.video as VideoModel | 61 | const videoInstance = res.locals.video as VideoModel |
61 | const initiatorAccount = res.locals.oauth.token.User.Account as AccountModel | 62 | const initiatorAccountId = (res.locals.oauth.token.User as UserModel).Account.id |
62 | const nextOwner = res.locals.nextOwner as AccountModel | 63 | const nextOwner = res.locals.nextOwner as AccountModel |
63 | 64 | ||
64 | await sequelizeTypescript.transaction(t => { | 65 | await sequelizeTypescript.transaction(t => { |
65 | return VideoChangeOwnershipModel.findOrCreate({ | 66 | return VideoChangeOwnershipModel.findOrCreate({ |
66 | where: { | 67 | where: { |
67 | initiatorAccountId: initiatorAccount.id, | 68 | initiatorAccountId, |
68 | nextOwnerAccountId: nextOwner.id, | 69 | nextOwnerAccountId: nextOwner.id, |
69 | videoId: videoInstance.id, | 70 | videoId: videoInstance.id, |
70 | status: VideoChangeOwnershipStatus.WAITING | 71 | status: VideoChangeOwnershipStatus.WAITING |
71 | }, | 72 | }, |
72 | defaults: { | 73 | defaults: { |
73 | initiatorAccountId: initiatorAccount.id, | 74 | initiatorAccountId, |
74 | nextOwnerAccountId: nextOwner.id, | 75 | nextOwnerAccountId: nextOwner.id, |
75 | videoId: videoInstance.id, | 76 | videoId: videoInstance.id, |
76 | status: VideoChangeOwnershipStatus.WAITING | 77 | status: VideoChangeOwnershipStatus.WAITING |
77 | }, | 78 | }, |
78 | transaction: t | 79 | transaction: t |
79 | }) | 80 | }) |
80 | |||
81 | }) | 81 | }) |
82 | 82 | ||
83 | logger.info('Ownership change for video %s created.', videoInstance.name) | 83 | logger.info('Ownership change for video %s created.', videoInstance.name) |
@@ -85,9 +85,10 @@ async function giveVideoOwnership (req: express.Request, res: express.Response) | |||
85 | } | 85 | } |
86 | 86 | ||
87 | async function listVideoOwnership (req: express.Request, res: express.Response) { | 87 | async function listVideoOwnership (req: express.Request, res: express.Response) { |
88 | const currentAccount = res.locals.oauth.token.User.Account as AccountModel | 88 | const currentAccountId = (res.locals.oauth.token.User as UserModel).Account.id |
89 | |||
89 | const resultList = await VideoChangeOwnershipModel.listForApi( | 90 | const resultList = await VideoChangeOwnershipModel.listForApi( |
90 | currentAccount.id, | 91 | currentAccountId, |
91 | req.query.start || 0, | 92 | req.query.start || 0, |
92 | req.query.count || 10, | 93 | req.query.count || 10, |
93 | req.query.sort || 'createdAt' | 94 | req.query.sort || 'createdAt' |
diff --git a/server/controllers/api/videos/rate.ts b/server/controllers/api/videos/rate.ts index b1732837d..dc322bb0c 100644 --- a/server/controllers/api/videos/rate.ts +++ b/server/controllers/api/videos/rate.ts | |||
@@ -28,10 +28,11 @@ async function rateVideo (req: express.Request, res: express.Response) { | |||
28 | const body: UserVideoRateUpdate = req.body | 28 | const body: UserVideoRateUpdate = req.body |
29 | const rateType = body.rating | 29 | const rateType = body.rating |
30 | const videoInstance: VideoModel = res.locals.video | 30 | const videoInstance: VideoModel = res.locals.video |
31 | const accountInstance: AccountModel = res.locals.oauth.token.User.Account | ||
32 | 31 | ||
33 | await sequelizeTypescript.transaction(async t => { | 32 | await sequelizeTypescript.transaction(async t => { |
34 | const sequelizeOptions = { transaction: t } | 33 | const sequelizeOptions = { transaction: t } |
34 | |||
35 | const accountInstance = await AccountModel.load(res.locals.oauth.token.User.Account.id, t) | ||
35 | const previousRate = await AccountVideoRateModel.load(accountInstance.id, videoInstance.id, t) | 36 | const previousRate = await AccountVideoRateModel.load(accountInstance.id, videoInstance.id, t) |
36 | 37 | ||
37 | let likesToIncrement = 0 | 38 | let likesToIncrement = 0 |
@@ -47,10 +48,10 @@ async function rateVideo (req: express.Request, res: express.Response) { | |||
47 | else if (previousRate.type === VIDEO_RATE_TYPES.DISLIKE) dislikesToIncrement-- | 48 | else if (previousRate.type === VIDEO_RATE_TYPES.DISLIKE) dislikesToIncrement-- |
48 | 49 | ||
49 | if (rateType === 'none') { // Destroy previous rate | 50 | if (rateType === 'none') { // Destroy previous rate |
50 | await previousRate.destroy({ transaction: t }) | 51 | await previousRate.destroy(sequelizeOptions) |
51 | } else { // Update previous rate | 52 | } else { // Update previous rate |
52 | previousRate.type = rateType | 53 | previousRate.type = rateType |
53 | await previousRate.save({ transaction: t }) | 54 | await previousRate.save(sequelizeOptions) |
54 | } | 55 | } |
55 | } else if (rateType !== 'none') { // There was not a previous rate, insert a new one if there is a rate | 56 | } else if (rateType !== 'none') { // There was not a previous rate, insert a new one if there is a rate |
56 | const query = { | 57 | const query = { |
@@ -70,9 +71,9 @@ async function rateVideo (req: express.Request, res: express.Response) { | |||
70 | await videoInstance.increment(incrementQuery, sequelizeOptions) | 71 | await videoInstance.increment(incrementQuery, sequelizeOptions) |
71 | 72 | ||
72 | await sendVideoRateChange(accountInstance, videoInstance, likesToIncrement, dislikesToIncrement, t) | 73 | await sendVideoRateChange(accountInstance, videoInstance, likesToIncrement, dislikesToIncrement, t) |
73 | }) | ||
74 | 74 | ||
75 | logger.info('Account video rate for video %s of account %s updated.', videoInstance.name, accountInstance.name) | 75 | logger.info('Account video rate for video %s of account %s updated.', videoInstance.name, accountInstance.name) |
76 | }) | ||
76 | 77 | ||
77 | return res.type('json').status(204).end() | 78 | return res.type('json').status(204).end() |
78 | } | 79 | } |
diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index 91231a187..48c0e0a5c 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts | |||
@@ -354,11 +354,11 @@ async function refreshVideoIfNeeded (options: { | |||
354 | syncParam: SyncParam, | 354 | syncParam: SyncParam, |
355 | refreshViews: boolean | 355 | refreshViews: boolean |
356 | }): Promise<VideoModel> { | 356 | }): Promise<VideoModel> { |
357 | if (!options.video.isOutdated()) return options.video | ||
358 | |||
357 | // We need more attributes if the argument video was fetched with not enough joints | 359 | // We need more attributes if the argument video was fetched with not enough joints |
358 | const video = options.fetchedType === 'all' ? options.video : await VideoModel.loadByUrlAndPopulateAccount(options.video.url) | 360 | const video = options.fetchedType === 'all' ? options.video : await VideoModel.loadByUrlAndPopulateAccount(options.video.url) |
359 | 361 | ||
360 | if (!video.isOutdated()) return video | ||
361 | |||
362 | try { | 362 | try { |
363 | const { response, videoObject } = await fetchRemoteVideo(video.url) | 363 | const { response, videoObject } = await fetchRemoteVideo(video.url) |
364 | if (response.statusCode === 404) { | 364 | if (response.statusCode === 404) { |
diff --git a/server/lib/schedulers/youtube-dl-update-scheduler.ts b/server/lib/schedulers/youtube-dl-update-scheduler.ts index 2fc8950fe..461cd045e 100644 --- a/server/lib/schedulers/youtube-dl-update-scheduler.ts +++ b/server/lib/schedulers/youtube-dl-update-scheduler.ts | |||
@@ -1,12 +1,5 @@ | |||
1 | |||
2 | |||
3 | import { AbstractScheduler } from './abstract-scheduler' | 1 | import { AbstractScheduler } from './abstract-scheduler' |
4 | import { SCHEDULER_INTERVALS_MS } from '../../initializers' | 2 | import { SCHEDULER_INTERVALS_MS } from '../../initializers' |
5 | import { logger } from '../../helpers/logger' | ||
6 | import * as request from 'request' | ||
7 | import { createWriteStream, ensureDir, writeFile } from 'fs-extra' | ||
8 | import { join } from 'path' | ||
9 | import { root } from '../../helpers/core-utils' | ||
10 | import { updateYoutubeDLBinary } from '../../helpers/youtube-dl' | 3 | import { updateYoutubeDLBinary } from '../../helpers/youtube-dl' |
11 | 4 | ||
12 | export class YoutubeDlUpdateScheduler extends AbstractScheduler { | 5 | export class YoutubeDlUpdateScheduler extends AbstractScheduler { |
diff --git a/server/models/account/account.ts b/server/models/account/account.ts index 6bbfc6f4e..580d920ce 100644 --- a/server/models/account/account.ts +++ b/server/models/account/account.ts | |||
@@ -134,8 +134,8 @@ export class AccountModel extends Model<AccountModel> { | |||
134 | return undefined | 134 | return undefined |
135 | } | 135 | } |
136 | 136 | ||
137 | static load (id: number) { | 137 | static load (id: number, transaction?: Sequelize.Transaction) { |
138 | return AccountModel.findById(id) | 138 | return AccountModel.findById(id, { transaction }) |
139 | } | 139 | } |
140 | 140 | ||
141 | static loadByUUID (uuid: string) { | 141 | static loadByUUID (uuid: string) { |
diff --git a/server/models/oauth/oauth-token.ts b/server/models/oauth/oauth-token.ts index 4c53848dc..1dd5e0289 100644 --- a/server/models/oauth/oauth-token.ts +++ b/server/models/oauth/oauth-token.ts | |||
@@ -1,9 +1,10 @@ | |||
1 | import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' | 1 | import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' |
2 | import { logger } from '../../helpers/logger' | 2 | import { logger } from '../../helpers/logger' |
3 | import { AccountModel } from '../account/account' | ||
4 | import { UserModel } from '../account/user' | 3 | import { UserModel } from '../account/user' |
5 | import { OAuthClientModel } from './oauth-client' | 4 | import { OAuthClientModel } from './oauth-client' |
6 | import { Transaction } from 'sequelize' | 5 | import { Transaction } from 'sequelize' |
6 | import { AccountModel } from '../account/account' | ||
7 | import { ActorModel } from '../activitypub/actor' | ||
7 | 8 | ||
8 | export type OAuthTokenInfo = { | 9 | export type OAuthTokenInfo = { |
9 | refreshToken: string | 10 | refreshToken: string |
@@ -17,18 +18,27 @@ export type OAuthTokenInfo = { | |||
17 | } | 18 | } |
18 | 19 | ||
19 | enum ScopeNames { | 20 | enum ScopeNames { |
20 | WITH_ACCOUNT = 'WITH_ACCOUNT' | 21 | WITH_USER = 'WITH_USER' |
21 | } | 22 | } |
22 | 23 | ||
23 | @Scopes({ | 24 | @Scopes({ |
24 | [ScopeNames.WITH_ACCOUNT]: { | 25 | [ScopeNames.WITH_USER]: { |
25 | include: [ | 26 | include: [ |
26 | { | 27 | { |
27 | model: () => UserModel, | 28 | model: () => UserModel.unscoped(), |
29 | required: true, | ||
28 | include: [ | 30 | include: [ |
29 | { | 31 | { |
30 | model: () => AccountModel, | 32 | attributes: [ 'id' ], |
31 | required: true | 33 | model: () => AccountModel.unscoped(), |
34 | required: true, | ||
35 | include: [ | ||
36 | { | ||
37 | attributes: [ 'id' ], | ||
38 | model: () => ActorModel.unscoped(), | ||
39 | required: true | ||
40 | } | ||
41 | ] | ||
32 | } | 42 | } |
33 | ] | 43 | ] |
34 | } | 44 | } |
@@ -138,7 +148,7 @@ export class OAuthTokenModel extends Model<OAuthTokenModel> { | |||
138 | } | 148 | } |
139 | } | 149 | } |
140 | 150 | ||
141 | return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT).findOne(query).then(token => { | 151 | return OAuthTokenModel.scope(ScopeNames.WITH_USER).findOne(query).then(token => { |
142 | if (token) token['user'] = token.User | 152 | if (token) token['user'] = token.User |
143 | 153 | ||
144 | return token | 154 | return token |
@@ -152,7 +162,7 @@ export class OAuthTokenModel extends Model<OAuthTokenModel> { | |||
152 | } | 162 | } |
153 | } | 163 | } |
154 | 164 | ||
155 | return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT) | 165 | return OAuthTokenModel.scope(ScopeNames.WITH_USER) |
156 | .findOne(query) | 166 | .findOne(query) |
157 | .then(token => { | 167 | .then(token => { |
158 | if (token) { | 168 | if (token) { |