- const attributesInclude = []
- const escapedSearch = VideoModel.sequelize.escape(options.search)
- const escapedLikeSearch = VideoModel.sequelize.escape('%' + options.search + '%')
- attributesInclude.push(createSimilarityAttribute('VideoChannelModel.name', options.search))
+ const { actorId } = parameters
+
+ const query = {
+ offset: parameters.start,
+ limit: parameters.count,
+ order: getSort(parameters.sort)
+ }
+
+ const getScope = (forCount: boolean) => {
+ return { method: [ ScopeNames.FOR_API, { actorId, forCount } as AvailableForListOptions ] }
+ }
+
+ return Promise.all([
+ VideoChannelModel.scope(getScope(true)).count(),
+ VideoChannelModel.scope(getScope(false)).findAll(query)
+ ]).then(([ total, data ]) => ({ total, data }))
+ }
+
+ static searchForApi (options: Pick<AvailableForListOptions, 'actorId' | 'search' | 'host' | 'handles'> & {
+ start: number
+ count: number
+ sort: string
+ }) {
+ let attributesInclude: any[] = [ literal('0 as similarity') ]
+ let where: WhereOptions
+
+ if (options.search) {
+ const escapedSearch = VideoChannelModel.sequelize.escape(options.search)
+ const escapedLikeSearch = VideoChannelModel.sequelize.escape('%' + options.search + '%')
+ attributesInclude = [ createSimilarityAttribute('VideoChannelModel.name', options.search) ]
+
+ where = {
+ [Op.or]: [
+ Sequelize.literal(
+ 'lower(immutable_unaccent("VideoChannelModel"."name")) % lower(immutable_unaccent(' + escapedSearch + '))'
+ ),
+ Sequelize.literal(
+ 'lower(immutable_unaccent("VideoChannelModel"."name")) LIKE lower(immutable_unaccent(' + escapedLikeSearch + '))'
+ )
+ ]
+ }
+ }