Added "total views" in the my channels list (#5007)
* Added "total views" in the my channels list Implements https://github.com/Chocobozzz/PeerTube/issues/4331 * Fix lint * applied suggested change * updated openAPI spec for the use "withStats" when getting video channels * applied code change * removed GROUP BY in query * Fixed test
This commit is contained in:
parent
b0185d7351
commit
c6f8ca4d65
|
@ -36,6 +36,8 @@
|
||||||
|
|
||||||
<div i18n class="video-channel-videos">{videoChannel.videosCount, plural, =0 {No videos} =1 {1 video} other {{{ videoChannel.videosCount }} videos}}</div>
|
<div i18n class="video-channel-videos">{videoChannel.videosCount, plural, =0 {No videos} =1 {1 video} other {{{ videoChannel.videosCount }} videos}}</div>
|
||||||
|
|
||||||
|
<div i18n class="video-channel-views">{videoChannel.totalViews, plural, =0 {No views} =1 {1 view} other {{{ videoChannel.totalViews }} views}}</div>
|
||||||
|
|
||||||
<div class="video-channel-buttons">
|
<div class="video-channel-buttons">
|
||||||
<my-edit-button label [routerLink]="[ '/manage/update', videoChannel.nameWithHost ]"></my-edit-button>
|
<my-edit-button label [routerLink]="[ '/manage/update', videoChannel.nameWithHost ]"></my-edit-button>
|
||||||
<my-delete-button label (click)="deleteVideoChannel(videoChannel)"></my-delete-button>
|
<my-delete-button label (click)="deleteVideoChannel(videoChannel)"></my-delete-button>
|
||||||
|
|
|
@ -27,6 +27,7 @@ export class VideoChannel extends Actor implements ServerVideoChannel {
|
||||||
videosCount?: number
|
videosCount?: number
|
||||||
|
|
||||||
viewsPerDay?: ViewsPerDate[]
|
viewsPerDay?: ViewsPerDate[]
|
||||||
|
totalViews?: number
|
||||||
|
|
||||||
static GET_ACTOR_AVATAR_URL (actor: { avatars: { width: number, url?: string, path: string }[] }, size: number) {
|
static GET_ACTOR_AVATAR_URL (actor: { avatars: { width: number, url?: string, path: string }[] }, size: number) {
|
||||||
return Actor.GET_ACTOR_AVATAR_URL(actor, size)
|
return Actor.GET_ACTOR_AVATAR_URL(actor, size)
|
||||||
|
@ -74,6 +75,10 @@ export class VideoChannel extends Actor implements ServerVideoChannel {
|
||||||
this.viewsPerDay = hash.viewsPerDay.map(v => ({ ...v, date: new Date(v.date) }))
|
this.viewsPerDay = hash.viewsPerDay.map(v => ({ ...v, date: new Date(v.date) }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hash.totalViews !== null && hash.totalViews !== undefined) {
|
||||||
|
this.totalViews = hash.totalViews
|
||||||
|
}
|
||||||
|
|
||||||
if (hash.ownerAccount) {
|
if (hash.ownerAccount) {
|
||||||
this.ownerAccount = hash.ownerAccount
|
this.ownerAccount = hash.ownerAccount
|
||||||
this.ownerBy = Actor.CREATE_BY_STRING(hash.ownerAccount.name, hash.ownerAccount.host)
|
this.ownerBy = Actor.CREATE_BY_STRING(hash.ownerAccount.name, hash.ownerAccount.host)
|
||||||
|
|
|
@ -311,6 +311,16 @@ export type SummaryOptions = {
|
||||||
')'
|
')'
|
||||||
),
|
),
|
||||||
'viewsPerDay'
|
'viewsPerDay'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
literal(
|
||||||
|
'(' +
|
||||||
|
'SELECT COALESCE(SUM("video".views), 0) AS totalViews ' +
|
||||||
|
'FROM "video" ' +
|
||||||
|
'WHERE "video"."channelId" = "VideoChannelModel"."id"' +
|
||||||
|
')'
|
||||||
|
),
|
||||||
|
'totalViews'
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -766,6 +776,8 @@ ON "Account->Actor"."serverId" = "Account->Actor->Server"."id"`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const totalViews = this.get('totalViews') as number
|
||||||
|
|
||||||
const actor = this.Actor.toFormattedJSON()
|
const actor = this.Actor.toFormattedJSON()
|
||||||
const videoChannel = {
|
const videoChannel = {
|
||||||
id: this.id,
|
id: this.id,
|
||||||
|
@ -779,6 +791,7 @@ ON "Account->Actor"."serverId" = "Account->Actor->Server"."id"`
|
||||||
|
|
||||||
videosCount,
|
videosCount,
|
||||||
viewsPerDay,
|
viewsPerDay,
|
||||||
|
totalViews,
|
||||||
|
|
||||||
avatars: actor.avatars,
|
avatars: actor.avatars,
|
||||||
|
|
||||||
|
|
|
@ -478,6 +478,25 @@ describe('Test video channels', function () {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('Should report correct total views count', async function () {
|
||||||
|
// check if there's the property
|
||||||
|
{
|
||||||
|
const { data } = await servers[0].channels.listByAccount({ accountName, withStats: true })
|
||||||
|
|
||||||
|
for (const channel of data) {
|
||||||
|
expect(channel).to.haveOwnProperty('totalViews')
|
||||||
|
expect(channel.totalViews).to.be.a('number')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the totalViews count can be updated
|
||||||
|
{
|
||||||
|
const { data } = await servers[0].channels.listByAccount({ accountName, withStats: true })
|
||||||
|
const channelWithView = data.find(channel => channel.id === servers[0].store.channel.id)
|
||||||
|
expect(channelWithView.totalViews).to.equal(2)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
it('Should report correct videos count', async function () {
|
it('Should report correct videos count', async function () {
|
||||||
const { data } = await servers[0].channels.listByAccount({ accountName, withStats: true })
|
const { data } = await servers[0].channels.listByAccount({ accountName, withStats: true })
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ export interface VideoChannel extends Actor {
|
||||||
|
|
||||||
videosCount?: number
|
videosCount?: number
|
||||||
viewsPerDay?: ViewsPerDate[] // chronologically ordered
|
viewsPerDay?: ViewsPerDate[] // chronologically ordered
|
||||||
|
totalViews?: number
|
||||||
|
|
||||||
banners: ActorImage[]
|
banners: ActorImage[]
|
||||||
|
|
||||||
|
|
|
@ -3602,7 +3602,7 @@ paths:
|
||||||
- $ref: '#/components/parameters/name'
|
- $ref: '#/components/parameters/name'
|
||||||
- name: withStats
|
- name: withStats
|
||||||
in: query
|
in: query
|
||||||
description: include view statistics for the last 30 days (only if authentified as the account user)
|
description: include daily view statistics for the last 30 days and total views (only if authentified as the account user)
|
||||||
schema:
|
schema:
|
||||||
type: boolean
|
type: boolean
|
||||||
- $ref: '#/components/parameters/start'
|
- $ref: '#/components/parameters/start'
|
||||||
|
|
Loading…
Reference in New Issue