UpdatedAt
} from 'sequelize-typescript'
import { MAccountActor } from '@server/types/models'
-import { AttributesOnly } from '@shared/core-utils'
+import { AttributesOnly, pick } from '@shared/core-utils'
import { ActivityPubActor } from '../../../shared/models/activitypub'
import { VideoChannel, VideoChannelSummary } from '../../../shared/models/videos'
import {
actorId: number
search?: string
host?: string
- names?: string[]
+ handles?: string[]
}
type AvailableWithStatsOptions = {
})
}
- if (options.names) {
- whereActorAnd.push({
- preferredUsername: {
- [Op.in]: options.names
+ let rootWhere: WhereOptions
+ if (options.handles) {
+ const or: WhereOptions[] = []
+
+ for (const handle of options.handles || []) {
+ const [ preferredUsername, host ] = handle.split('@')
+
+ if (!host) {
+ or.push({
+ '$Actor.preferredUsername$': preferredUsername,
+ '$Actor.serverId$': null
+ })
+ } else {
+ or.push({
+ '$Actor.preferredUsername$': preferredUsername,
+ '$Actor.Server.host$': host
+ })
}
- })
+ }
+
+ rootWhere = {
+ [Op.or]: or
+ }
}
return {
+ where: rootWhere,
include: [
{
attributes: {
sort: string
host?: string
- names?: string[]
+ handles?: string[]
}) {
let attributesInclude: any[] = [ literal('0 as similarity') ]
let where: WhereOptions
return VideoChannelModel
.scope({
- method: [ ScopeNames.FOR_API, { actorId: options.actorId, host: options.host, names: options.names } as AvailableForListOptions ]
+ method: [ ScopeNames.FOR_API, pick(options, [ 'actorId', 'host', 'handles' ]) as AvailableForListOptions ]
})
.findAndCountAll(query)
.then(({ rows, count }) => {