1 import express from 'express'
2 import { LocalVideoViewerModel } from '@server/models/view/local-video-viewer'
3 import { VideoStatsTimeserieMetric, VideoStatsTimeserieQuery } from '@shared/models'
7 videoOverallStatsValidator,
8 videoRetentionStatsValidator,
9 videoTimeserieStatsValidator
10 } from '../../../middlewares'
12 const statsRouter = express.Router()
14 statsRouter.get('/:videoId/stats/overall',
16 asyncMiddleware(videoOverallStatsValidator),
17 asyncMiddleware(getOverallStats)
20 statsRouter.get('/:videoId/stats/timeseries/:metric',
22 asyncMiddleware(videoTimeserieStatsValidator),
23 asyncMiddleware(getTimeserieStats)
26 statsRouter.get('/:videoId/stats/retention',
28 asyncMiddleware(videoRetentionStatsValidator),
29 asyncMiddleware(getRetentionStats)
32 // ---------------------------------------------------------------------------
38 // ---------------------------------------------------------------------------
40 async function getOverallStats (req: express.Request, res: express.Response) {
41 const video = res.locals.videoAll
43 const stats = await LocalVideoViewerModel.getOverallStats(video)
45 return res.json(stats)
48 async function getRetentionStats (req: express.Request, res: express.Response) {
49 const video = res.locals.videoAll
51 const stats = await LocalVideoViewerModel.getRetentionStats(video)
53 return res.json(stats)
56 async function getTimeserieStats (req: express.Request, res: express.Response) {
57 const video = res.locals.videoAll
58 const metric = req.params.metric as VideoStatsTimeserieMetric
60 const query = req.query as VideoStatsTimeserieQuery
62 const stats = await LocalVideoViewerModel.getTimeserieStats({
65 startDate: query.startDate ?? buildOneMonthAgo().toISOString(),
66 endDate: query.endDate ?? new Date().toISOString()
69 return res.json(stats)
72 function buildOneMonthAgo () {
73 const monthAgo = new Date()
74 monthAgo.setHours(0, 0, 0, 0)
76 monthAgo.setDate(monthAgo.getDate() - 29)