- static searchAndPopulateAccountAndServerAndTags (value: string, start: number, count: number, sort: string) {
- const serverInclude: IIncludeOptions = {
- model: ServerModel,
- required: false
- }
-
- const accountInclude: IIncludeOptions = {
- model: AccountModel,
- include: [
- {
- model: ActorModel,
- required: true,
- include: [ serverInclude ]
- }
- ]
- }
-
- const videoChannelInclude: IIncludeOptions = {
- model: VideoChannelModel,
- include: [ accountInclude ],
- required: true
- }
-
- const tagInclude: IIncludeOptions = {
- model: TagModel
- }
-
- const query: IFindOptions<VideoModel> = {
- distinct: true, // Because we have tags
- offset: start,
- limit: count,
- order: [ getSort(sort) ],
- where: {}
- }
-
- // TODO: search on tags too
- // const escapedValue = Video['sequelize'].escape('%' + value + '%')
- // query.where['id'][Sequelize.Op.in] = Video['sequelize'].literal(
- // `(SELECT "VideoTags"."videoId"
- // FROM "Tags"
- // INNER JOIN "VideoTags" ON "Tags"."id" = "VideoTags"."tagId"
- // WHERE name ILIKE ${escapedValue}
- // )`
- // )
-
- // TODO: search on account too
- // accountInclude.where = {
- // name: {
- // [Sequelize.Op.iLike]: '%' + value + '%'
- // }
- // }
- query.where['name'] = {
- [Sequelize.Op.iLike]: '%' + value + '%'
- }
-
- query.include = [
- videoChannelInclude, tagInclude
- ]
-
- return VideoModel.scope([ ScopeNames.AVAILABLE_FOR_LIST ])
- .findAndCountAll(query).then(({ rows, count }) => {
- return {
- data: rows,
- total: count
- }
- })
- }
-