MChannelAP,
MChannelFormattable,
MChannelSummaryFormattable
-} from '../../typings/models/video'
+} from '../../types/models/video'
export enum ScopeNames {
FOR_API = 'FOR_API',
type AvailableForListOptions = {
actorId: number
+ search?: string
}
type AvailableWithStatsOptions = {
}
export type SummaryOptions = {
+ actorRequired?: boolean // Default: true
withAccount?: boolean // Default: false
withAccountBlockerIds?: number[]
}
{
attributes: [ 'id', 'preferredUsername', 'url', 'serverId', 'avatarId' ],
model: ActorModel.unscoped(),
- required: true,
+ required: options.actorRequired ?? true,
include: [
{
attributes: [ 'host' ],
return {
attributes: {
include: [
+ [
+ literal('(SELECT COUNT(*) FROM "video" WHERE "channelId" = "VideoChannelModel"."id")'),
+ 'videosCount'
+ ],
[
literal(
'(' +
return VideoChannelModel.count(query)
}
- static listForApi (actorId: number, start: number, count: number, sort: string) {
+ static listForApi (parameters: {
+ actorId: number
+ start: number
+ count: number
+ sort: string
+ }) {
+ const { actorId } = parameters
+
const query = {
- offset: start,
- limit: count,
- order: getSort(sort)
+ offset: parameters.start,
+ limit: parameters.count,
+ order: getSort(parameters.sort)
}
const scopes = {
count: number
sort: string
withStats?: boolean
+ search?: string
}) {
+ const escapedSearch = VideoModel.sequelize.escape(options.search)
+ const escapedLikeSearch = VideoModel.sequelize.escape('%' + options.search + '%')
+ const where = options.search
+ ? {
+ [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 + '))'
+ )
+ ]
+ }
+ : null
+
const query = {
offset: options.start,
limit: options.count,
},
required: true
}
- ]
+ ],
+ where
}
const scopes: string | ScopeOptions | (string | ScopeOptions)[] = [ ScopeNames.WITH_ACTOR ]
}
toFormattedJSON (this: MChannelFormattable): VideoChannel {
- const viewsPerDay = this.get('viewsPerDay') as string
+ const viewsPerDayString = this.get('viewsPerDay') as string
+ const videosCount = this.get('videosCount') as number
+
+ let viewsPerDay: { date: Date, views: number }[]
+
+ if (viewsPerDayString) {
+ viewsPerDay = viewsPerDayString.split(',')
+ .map(v => {
+ const [ dateString, amount ] = v.split('|')
+
+ return {
+ date: new Date(dateString),
+ views: +amount
+ }
+ })
+ }
const actor = this.Actor.toFormattedJSON()
const videoChannel = {
createdAt: this.createdAt,
updatedAt: this.updatedAt,
ownerAccount: undefined,
- viewsPerDay: viewsPerDay
- ? viewsPerDay.split(',').map(v => {
- const o = v.split('|')
- return {
- date: new Date(o[0]),
- views: +o[1]
- }
- })
- : undefined
+ videosCount,
+ viewsPerDay
}
if (this.Account) videoChannel.ownerAccount = this.Account.toFormattedJSON()