DefaultScope,
ForeignKey,
HasMany,
- IFindOptions,
Is,
Model,
Scopes,
import { ActorModel, unusedActorAttributesForAPI } from '../activitypub/actor'
import { buildServerIdsFollowedBy, buildTrigramSearchIndex, createSimilarityAttribute, getSort, throwIfNotValid } from '../utils'
import { VideoModel } from './video'
-import { CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers'
+import { CONSTRAINTS_FIELDS, WEBSERVER } from '../../initializers/constants'
import { ServerModel } from '../server/server'
-import { DefineIndexesOptions } from 'sequelize'
+import { FindOptions, ModelIndexesOptions, Op } from 'sequelize'
import { AvatarModel } from '../avatar/avatar'
import { VideoPlaylistModel } from './video-playlist'
// FIXME: Define indexes here because there is an issue with TS and Sequelize.literal when called directly in the annotation
-const indexes: DefineIndexesOptions[] = [
+const indexes: ModelIndexesOptions[] = [
buildTrigramSearchIndex('video_channel_name_trigram', 'name'),
{
actorId: number
}
-@DefaultScope({
+@DefaultScope(() => ({
include: [
{
- model: () => ActorModel,
+ model: ActorModel,
required: true
}
]
-})
-@Scopes({
+}))
+@Scopes(() => ({
[ScopeNames.SUMMARY]: (withAccount = false) => {
- const base: IFindOptions<VideoChannelModel> = {
+ const base: FindOptions = {
attributes: [ 'name', 'description', 'id', 'actorId' ],
include: [
{
- attributes: [ 'uuid', 'preferredUsername', 'url', 'serverId', 'avatarId' ],
+ attributes: [ 'preferredUsername', 'url', 'serverId', 'avatarId' ],
model: ActorModel.unscoped(),
required: true,
include: [
},
model: ActorModel,
where: {
- [Sequelize.Op.or]: [
+ [Op.or]: [
{
serverId: null
},
{
serverId: {
- [ Sequelize.Op.in ]: Sequelize.literal(inQueryInstanceFollow)
+ [ Op.in ]: Sequelize.literal(inQueryInstanceFollow)
}
}
]
[ScopeNames.WITH_ACCOUNT]: {
include: [
{
- model: () => AccountModel,
+ model: AccountModel,
required: true
}
]
},
[ScopeNames.WITH_VIDEOS]: {
include: [
- () => VideoModel
+ VideoModel
]
},
[ScopeNames.WITH_ACTOR]: {
include: [
- () => ActorModel
+ ActorModel
]
}
-})
+}))
@Table({
tableName: 'videoChannel',
indexes
@AllowNull(true)
@Default(null)
- @Is('VideoChannelDescription', value => throwIfNotValid(value, isVideoChannelDescriptionValid, 'description'))
+ @Is('VideoChannelDescription', value => throwIfNotValid(value, isVideoChannelDescriptionValid, 'description', true))
@Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_CHANNELS.DESCRIPTION.max))
description: string
@AllowNull(true)
@Default(null)
- @Is('VideoChannelSupport', value => throwIfNotValid(value, isVideoChannelSupportValid, 'support'))
+ @Is('VideoChannelSupport', value => throwIfNotValid(value, isVideoChannelSupportValid, 'support', true))
@Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_CHANNELS.SUPPORT.max))
support: string
limit: options.count,
order: getSort(options.sort),
where: {
- [Sequelize.Op.or]: [
+ [Op.or]: [
Sequelize.literal(
'lower(immutable_unaccent("VideoChannelModel"."name")) % lower(immutable_unaccent(' + escapedSearch + '))'
),
})
}
- static listByAccount (accountId: number) {
+ static listByAccount (options: {
+ accountId: number,
+ start: number,
+ count: number,
+ sort: string
+ }) {
const query = {
- order: getSort('createdAt'),
+ offset: options.start,
+ limit: options.count,
+ order: getSort(options.sort),
include: [
{
model: AccountModel,
where: {
- id: accountId
+ id: options.accountId
},
required: true
}
.findByPk(id)
}
- static loadByUUIDAndPopulateAccount (uuid: string) {
- const query = {
- include: [
- {
- model: ActorModel,
- required: true,
- where: {
- uuid
- }
- }
- ]
- }
-
- return VideoChannelModel
- .scope([ ScopeNames.WITH_ACCOUNT ])
- .findOne(query)
- }
-
static loadByUrlAndPopulateAccount (url: string) {
const query = {
include: [
return {
id: this.id,
- uuid: actor.uuid,
name: actor.name,
displayName: this.getDisplayName(),
url: actor.url,