diff options
author | Chocobozzz <me@florianbigard.com> | 2022-05-05 14:12:57 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2022-05-05 14:13:14 +0200 |
commit | 49f0468d44468528c2fb2c8b0efd19cdaeeec43d (patch) | |
tree | 4fd07d5da74506729a1cbbe67548bfd9c6c76849 /server/models | |
parent | f18a060a83d7053897173b2a24fb7984893131c7 (diff) | |
download | PeerTube-49f0468d44468528c2fb2c8b0efd19cdaeeec43d.tar.gz PeerTube-49f0468d44468528c2fb2c8b0efd19cdaeeec43d.tar.zst PeerTube-49f0468d44468528c2fb2c8b0efd19cdaeeec43d.zip |
Add filter by start/end date overall stats in api
Diffstat (limited to 'server/models')
-rw-r--r-- | server/models/view/local-video-viewer.ts | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/server/models/view/local-video-viewer.ts b/server/models/view/local-video-viewer.ts index 5928ba5f6..2862f8b96 100644 --- a/server/models/view/local-video-viewer.ts +++ b/server/models/view/local-video-viewer.ts | |||
@@ -100,10 +100,28 @@ export class LocalVideoViewerModel extends Model<Partial<AttributesOnly<LocalVid | |||
100 | }) | 100 | }) |
101 | } | 101 | } |
102 | 102 | ||
103 | static async getOverallStats (video: MVideo): Promise<VideoStatsOverall> { | 103 | static async getOverallStats (options: { |
104 | const options = { | 104 | video: MVideo |
105 | startDate?: string | ||
106 | endDate?: string | ||
107 | }): Promise<VideoStatsOverall> { | ||
108 | const { video, startDate, endDate } = options | ||
109 | |||
110 | const queryOptions = { | ||
105 | type: QueryTypes.SELECT as QueryTypes.SELECT, | 111 | type: QueryTypes.SELECT as QueryTypes.SELECT, |
106 | replacements: { videoId: video.id } | 112 | replacements: { videoId: video.id } as any |
113 | } | ||
114 | |||
115 | let dateWhere = '' | ||
116 | |||
117 | if (startDate) { | ||
118 | dateWhere += ' AND "localVideoViewer"."startDate" >= :startDate' | ||
119 | queryOptions.replacements.startDate = startDate | ||
120 | } | ||
121 | |||
122 | if (endDate) { | ||
123 | dateWhere += ' AND "localVideoViewer"."endDate" <= :endDate' | ||
124 | queryOptions.replacements.endDate = endDate | ||
107 | } | 125 | } |
108 | 126 | ||
109 | const watchTimeQuery = `SELECT ` + | 127 | const watchTimeQuery = `SELECT ` + |
@@ -111,9 +129,9 @@ export class LocalVideoViewerModel extends Model<Partial<AttributesOnly<LocalVid | |||
111 | `AVG("localVideoViewer"."watchTime") AS "averageWatchTime" ` + | 129 | `AVG("localVideoViewer"."watchTime") AS "averageWatchTime" ` + |
112 | `FROM "localVideoViewer" ` + | 130 | `FROM "localVideoViewer" ` + |
113 | `INNER JOIN "video" ON "video"."id" = "localVideoViewer"."videoId" ` + | 131 | `INNER JOIN "video" ON "video"."id" = "localVideoViewer"."videoId" ` + |
114 | `WHERE "videoId" = :videoId` | 132 | `WHERE "videoId" = :videoId ${dateWhere}` |
115 | 133 | ||
116 | const watchTimePromise = LocalVideoViewerModel.sequelize.query<any>(watchTimeQuery, options) | 134 | const watchTimePromise = LocalVideoViewerModel.sequelize.query<any>(watchTimeQuery, queryOptions) |
117 | 135 | ||
118 | const watchPeakQuery = `WITH "watchPeakValues" AS ( | 136 | const watchPeakQuery = `WITH "watchPeakValues" AS ( |
119 | SELECT "startDate" AS "dateBreakpoint", 1 AS "inc" | 137 | SELECT "startDate" AS "dateBreakpoint", 1 AS "inc" |
@@ -122,7 +140,7 @@ export class LocalVideoViewerModel extends Model<Partial<AttributesOnly<LocalVid | |||
122 | UNION ALL | 140 | UNION ALL |
123 | SELECT "endDate" AS "dateBreakpoint", -1 AS "inc" | 141 | SELECT "endDate" AS "dateBreakpoint", -1 AS "inc" |
124 | FROM "localVideoViewer" | 142 | FROM "localVideoViewer" |
125 | WHERE "videoId" = :videoId | 143 | WHERE "videoId" = :videoId ${dateWhere} |
126 | ) | 144 | ) |
127 | SELECT "dateBreakpoint", "concurrent" | 145 | SELECT "dateBreakpoint", "concurrent" |
128 | FROM ( | 146 | FROM ( |
@@ -132,14 +150,14 @@ export class LocalVideoViewerModel extends Model<Partial<AttributesOnly<LocalVid | |||
132 | ) tmp | 150 | ) tmp |
133 | ORDER BY "concurrent" DESC | 151 | ORDER BY "concurrent" DESC |
134 | FETCH FIRST 1 ROW ONLY` | 152 | FETCH FIRST 1 ROW ONLY` |
135 | const watchPeakPromise = LocalVideoViewerModel.sequelize.query<any>(watchPeakQuery, options) | 153 | const watchPeakPromise = LocalVideoViewerModel.sequelize.query<any>(watchPeakQuery, queryOptions) |
136 | 154 | ||
137 | const countriesQuery = `SELECT country, COUNT(country) as viewers ` + | 155 | const countriesQuery = `SELECT country, COUNT(country) as viewers ` + |
138 | `FROM "localVideoViewer" ` + | 156 | `FROM "localVideoViewer" ` + |
139 | `WHERE "videoId" = :videoId AND country IS NOT NULL ` + | 157 | `WHERE "videoId" = :videoId AND country IS NOT NULL ${dateWhere} ` + |
140 | `GROUP BY country ` + | 158 | `GROUP BY country ` + |
141 | `ORDER BY viewers DESC` | 159 | `ORDER BY viewers DESC` |
142 | const countriesPromise = LocalVideoViewerModel.sequelize.query<any>(countriesQuery, options) | 160 | const countriesPromise = LocalVideoViewerModel.sequelize.query<any>(countriesQuery, queryOptions) |
143 | 161 | ||
144 | const [ rowsWatchTime, rowsWatchPeak, rowsCountries ] = await Promise.all([ | 162 | const [ rowsWatchTime, rowsWatchPeak, rowsCountries ] = await Promise.all([ |
145 | watchTimePromise, | 163 | watchTimePromise, |