From 26e3e98ff0e222a9fb9226938ac6902af77921bd Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 3 May 2022 11:38:07 +0200 Subject: Support live session in server --- server/models/video/video-live-session.ts | 142 ++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 server/models/video/video-live-session.ts (limited to 'server/models/video/video-live-session.ts') diff --git a/server/models/video/video-live-session.ts b/server/models/video/video-live-session.ts new file mode 100644 index 000000000..2b4cde9f8 --- /dev/null +++ b/server/models/video/video-live-session.ts @@ -0,0 +1,142 @@ +import { FindOptions } from 'sequelize' +import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript' +import { MVideoLiveSession, MVideoLiveSessionReplay } from '@server/types/models' +import { uuidToShort } from '@shared/extra-utils' +import { LiveVideoError, LiveVideoSession } from '@shared/models' +import { AttributesOnly } from '@shared/typescript-utils' +import { VideoModel } from './video' + +export enum ScopeNames { + WITH_REPLAY = 'WITH_REPLAY' +} + +@Scopes(() => ({ + [ScopeNames.WITH_REPLAY]: { + include: [ + { + model: VideoModel.unscoped(), + as: 'ReplayVideo', + required: false + } + ] + } +})) +@Table({ + tableName: 'videoLiveSession', + indexes: [ + { + fields: [ 'replayVideoId' ], + unique: true + }, + { + fields: [ 'liveVideoId' ] + } + ] +}) +export class VideoLiveSessionModel extends Model>> { + + @CreatedAt + createdAt: Date + + @UpdatedAt + updatedAt: Date + + @AllowNull(false) + @Column(DataType.DATE) + startDate: Date + + @AllowNull(true) + @Column(DataType.DATE) + endDate: Date + + @AllowNull(true) + @Column + error: LiveVideoError + + @ForeignKey(() => VideoModel) + @Column + replayVideoId: number + + @BelongsTo(() => VideoModel, { + foreignKey: { + allowNull: true, + name: 'replayVideoId' + }, + as: 'ReplayVideo', + onDelete: 'set null' + }) + ReplayVideo: VideoModel + + @ForeignKey(() => VideoModel) + @Column + liveVideoId: number + + @BelongsTo(() => VideoModel, { + foreignKey: { + allowNull: true, + name: 'liveVideoId' + }, + as: 'LiveVideo', + onDelete: 'set null' + }) + LiveVideo: VideoModel + + static load (id: number): Promise { + return VideoLiveSessionModel.findOne({ + where: { id } + }) + } + + static findSessionOfReplay (replayVideoId: number) { + const query = { + where: { + replayVideoId + } + } + + return VideoLiveSessionModel.scope(ScopeNames.WITH_REPLAY).findOne(query) + } + + static findCurrentSessionOf (videoId: number) { + return VideoLiveSessionModel.findOne({ + where: { + liveVideoId: videoId, + endDate: null + }, + order: [ [ 'startDate', 'DESC' ] ] + }) + } + + static listSessionsOfLiveForAPI (options: { videoId: number }) { + const { videoId } = options + + const query: FindOptions = { + where: { + liveVideoId: videoId + }, + order: [ [ 'startDate', 'ASC' ] ] + } + + return VideoLiveSessionModel.scope(ScopeNames.WITH_REPLAY).findAll(query) + } + + toFormattedJSON (this: MVideoLiveSessionReplay): LiveVideoSession { + const replayVideo = this.ReplayVideo + ? { + id: this.ReplayVideo.id, + uuid: this.ReplayVideo.uuid, + shortUUID: uuidToShort(this.ReplayVideo.uuid) + } + : undefined + + return { + id: this.id, + startDate: this.startDate.toISOString(), + endDate: this.endDate + ? this.endDate.toISOString() + : null, + replayVideo, + error: this.error + } + } +} -- cgit v1.2.3