import { AllowNull, BelongsToMany, Column, CreatedAt, Model, Table, UpdatedAt } from 'sequelize-typescript' import { Transaction } from 'sequelize/types' import { MTracker } from '@server/types/models/server/tracker' import { AttributesOnly } from '@shared/typescript-utils' import { VideoModel } from '../video/video' import { VideoTrackerModel } from './video-tracker' @Table({ tableName: 'tracker', indexes: [ { fields: [ 'url' ], unique: true } ] }) export class TrackerModel extends Model>> { @AllowNull(false) @Column url: string @CreatedAt createdAt: Date @UpdatedAt updatedAt: Date @BelongsToMany(() => VideoModel, { foreignKey: 'trackerId', through: () => VideoTrackerModel, onDelete: 'CASCADE' }) Videos: VideoModel[] static listUrlsByVideoId (videoId: number) { const query = { include: [ { attributes: [ 'id' ], model: VideoModel.unscoped(), required: true, where: { id: videoId } } ] } return TrackerModel.findAll(query) .then(rows => rows.map(rows => rows.url)) } static findOrCreateTrackers (trackers: string[], transaction: Transaction): Promise { if (trackers === null) return Promise.resolve([]) const tasks: Promise[] = [] trackers.forEach(tracker => { const query = { where: { url: tracker }, defaults: { url: tracker }, transaction } const promise = TrackerModel.findOrCreate(query) .then(([ trackerInstance ]) => trackerInstance) tasks.push(promise) }) return Promise.all(tasks) } }