]>
Commit | Line | Data |
---|---|---|
b2111066 C |
1 | import express from 'express' |
2 | import { sendView } from '@server/lib/activitypub/send/send-view' | |
3 | import { Hooks } from '@server/lib/plugins/hooks' | |
4 | import { VideoViewsManager } from '@server/lib/views/video-views-manager' | |
5 | import { getServerActor } from '@server/models/application/application' | |
6 | import { MVideoId } from '@server/types/models' | |
7 | import { HttpStatusCode, VideoView } from '@shared/models' | |
8 | import { asyncMiddleware, methodsValidator, openapiOperationDoc, optionalAuthenticate, videoViewValidator } from '../../../middlewares' | |
9 | import { UserVideoHistoryModel } from '../../../models/user/user-video-history' | |
10 | ||
11 | const viewRouter = express.Router() | |
12 | ||
13 | viewRouter.all( | |
14 | [ '/:videoId/views', '/:videoId/watching' ], | |
15 | openapiOperationDoc({ operationId: 'addView' }), | |
16 | methodsValidator([ 'PUT', 'POST' ]), | |
17 | optionalAuthenticate, | |
18 | asyncMiddleware(videoViewValidator), | |
19 | asyncMiddleware(viewVideo) | |
20 | ) | |
21 | ||
22 | // --------------------------------------------------------------------------- | |
23 | ||
24 | export { | |
25 | viewRouter | |
26 | } | |
27 | ||
28 | // --------------------------------------------------------------------------- | |
29 | ||
30 | async function viewVideo (req: express.Request, res: express.Response) { | |
31 | const video = res.locals.onlyVideo | |
32 | ||
33 | const body = req.body as VideoView | |
34 | ||
35 | const ip = req.ip | |
36 | const { successView, successViewer } = await VideoViewsManager.Instance.processLocalView({ | |
37 | video, | |
38 | ip, | |
39 | currentTime: body.currentTime, | |
40 | viewEvent: body.viewEvent | |
41 | }) | |
42 | ||
43 | if (successView) { | |
44 | await sendView({ byActor: await getServerActor(), video, type: 'view' }) | |
45 | ||
46 | Hooks.runAction('action:api.video.viewed', { video: video, ip, req, res }) | |
47 | } | |
48 | ||
49 | if (successViewer) { | |
50 | await sendView({ byActor: await getServerActor(), video, type: 'viewer' }) | |
51 | } | |
52 | ||
53 | await updateUserHistoryIfNeeded(body, video, res) | |
54 | ||
55 | return res.status(HttpStatusCode.NO_CONTENT_204).end() | |
56 | } | |
57 | ||
58 | async function updateUserHistoryIfNeeded (body: VideoView, video: MVideoId, res: express.Response) { | |
59 | const user = res.locals.oauth?.token.User | |
60 | if (!user) return | |
61 | if (user.videosHistoryEnabled !== true) return | |
62 | ||
63 | await UserVideoHistoryModel.upsert({ | |
64 | videoId: video.id, | |
65 | userId: user.id, | |
66 | currentTime: body.currentTime | |
67 | }) | |
68 | } |