import { literal, Op } from 'sequelize' import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Model, Table } from 'sequelize-typescript' import { AttributesOnly } from '@peertube/peertube-typescript-utils' import { VideoModel } from '../video/video.js' /** * * Aggregate views of all videos federated with our instance * Mainly used by the trending/hot algorithms * */ @Table({ tableName: 'videoView', updatedAt: false, indexes: [ { fields: [ 'videoId' ] }, { fields: [ 'startDate' ] } ] }) export class VideoViewModel extends Model>> { @CreatedAt createdAt: Date @AllowNull(false) @Column(DataType.DATE) startDate: Date @AllowNull(false) @Column(DataType.DATE) endDate: Date @AllowNull(false) @Column views: number @ForeignKey(() => VideoModel) @Column videoId: number @BelongsTo(() => VideoModel, { foreignKey: { allowNull: false }, onDelete: 'CASCADE' }) Video: Awaited static removeOldRemoteViewsHistory (beforeDate: string) { const query = { where: { startDate: { [Op.lt]: beforeDate }, videoId: { [Op.in]: literal('(SELECT "id" FROM "video" WHERE "remote" IS TRUE)') } } } return VideoViewModel.destroy(query) } }