- VideoChannelInstance,
- VideoChannelAttributes,
-
- VideoChannelMethods
-} from './video-channel-interface'
-
-let VideoChannel: Sequelize.Model<VideoChannelInstance, VideoChannelAttributes>
-let toFormattedJSON: VideoChannelMethods.ToFormattedJSON
-let toAddRemoteJSON: VideoChannelMethods.ToAddRemoteJSON
-let toUpdateRemoteJSON: VideoChannelMethods.ToUpdateRemoteJSON
-let isOwned: VideoChannelMethods.IsOwned
-let countByAuthor: VideoChannelMethods.CountByAuthor
-let listOwned: VideoChannelMethods.ListOwned
-let listForApi: VideoChannelMethods.ListForApi
-let listByAuthor: VideoChannelMethods.ListByAuthor
-let loadByIdAndAuthor: VideoChannelMethods.LoadByIdAndAuthor
-let loadByUUID: VideoChannelMethods.LoadByUUID
-let loadAndPopulateAuthor: VideoChannelMethods.LoadAndPopulateAuthor
-let loadByUUIDAndPopulateAuthor: VideoChannelMethods.LoadByUUIDAndPopulateAuthor
-let loadByHostAndUUID: VideoChannelMethods.LoadByHostAndUUID
-let loadAndPopulateAuthorAndVideos: VideoChannelMethods.LoadAndPopulateAuthorAndVideos
-
-export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
- VideoChannel = sequelize.define<VideoChannelInstance, VideoChannelAttributes>('VideoChannel',
- {
- uuid: {
- type: DataTypes.UUID,
- defaultValue: DataTypes.UUIDV4,
- allowNull: false,
- validate: {
- isUUID: 4
- }
- },
- name: {
- type: DataTypes.STRING,
- allowNull: false,
- validate: {
- nameValid: value => {
- const res = isVideoChannelNameValid(value)
- if (res === false) throw new Error('Video channel name is not valid.')
- }
- }
- },
- description: {
- type: DataTypes.STRING,
- allowNull: true,
- validate: {
- descriptionValid: value => {
- const res = isVideoChannelDescriptionValid(value)
- if (res === false) throw new Error('Video channel description is not valid.')
- }
- }
- },
- remote: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: false
- }
- },
- {
- indexes: [
- {
- fields: [ 'authorId' ]
- }
- ],
- hooks: {
- afterDestroy
- }
- }
- )
-
- const classMethods = [
- associate,
-
- listForApi,
- listByAuthor,
- listOwned,
- loadByIdAndAuthor,
- loadAndPopulateAuthor,
- loadByUUIDAndPopulateAuthor,
- loadByUUID,
- loadByHostAndUUID,
- loadAndPopulateAuthorAndVideos,
- countByAuthor
- ]
- const instanceMethods = [
- isOwned,
- toFormattedJSON,
- toAddRemoteJSON,
- toUpdateRemoteJSON
- ]
- addMethodsToModel(VideoChannel, classMethods, instanceMethods)
-
- return VideoChannel
-}
-
-// ------------------------------ METHODS ------------------------------
-
-isOwned = function (this: VideoChannelInstance) {
- return this.remote === false
-}
-
-toFormattedJSON = function (this: VideoChannelInstance) {
- const json = {
- id: this.id,
- uuid: this.uuid,
- name: this.name,
- description: this.description,
- isLocal: this.isOwned(),
- createdAt: this.createdAt,
- updatedAt: this.updatedAt
- }
-
- if (this.Author !== undefined) {
- json['owner'] = {
- name: this.Author.name,
- uuid: this.Author.uuid
- }
- }
-
- if (Array.isArray(this.Videos)) {
- json['videos'] = this.Videos.map(v => v.toFormattedJSON())
+ AllowNull,
+ BeforeDestroy,
+ BelongsTo,
+ Column,
+ CreatedAt,
+ DataType,
+ Default,
+ DefaultScope,
+ ForeignKey,
+ HasMany,
+ Is,
+ Model,
+ Scopes,
+ Sequelize,
+ Table,
+ UpdatedAt
+} from 'sequelize-typescript'
+import { ActivityPubActor } from '../../../shared/models/activitypub'
+import { VideoChannel } from '../../../shared/models/videos'
+import {
+ isVideoChannelDescriptionValid,
+ isVideoChannelNameValid,
+ isVideoChannelSupportValid
+} from '../../helpers/custom-validators/video-channels'
+import { sendDeleteActor } from '../../lib/activitypub/send'
+import { AccountModel } from '../account/account'
+import { ActorModel, unusedActorAttributesForAPI } from '../activitypub/actor'
+import { buildTrigramSearchIndex, createSimilarityAttribute, getSort, throwIfNotValid } from '../utils'
+import { VideoModel } from './video'
+import { CONSTRAINTS_FIELDS } from '../../initializers'
+import { ServerModel } from '../server/server'
+import { DefineIndexesOptions } from 'sequelize'
+
+// FIXME: Define indexes here because there is an issue with TS and Sequelize.literal when called directly in the annotation
+const indexes: DefineIndexesOptions[] = [
+ buildTrigramSearchIndex('video_channel_name_trigram', 'name'),
+
+ {
+ fields: [ 'accountId' ]
+ },
+ {
+ fields: [ 'actorId' ]