import { uniq } from 'lodash'
-import { FindAndCountOptions, FindOptions, Op, Order, QueryTypes, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize'
+import { FindOptions, Op, Order, QueryTypes, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize'
import {
AllowNull,
BelongsTo,
} from 'sequelize-typescript'
import { getServerActor } from '@server/models/application/application'
import { MAccount, MAccountId, MUserAccountId } from '@server/types/models'
-import { AttributesOnly } from '@shared/core-utils'
import { VideoPrivacy } from '@shared/models'
+import { AttributesOnly } from '@shared/typescript-utils'
import { ActivityTagObject, ActivityTombstoneObject } from '../../../shared/models/activitypub/objects/common-objects'
import { VideoCommentObject } from '../../../shared/models/activitypub/objects/video-comment-object'
import { VideoComment, VideoCommentAdmin } from '../../../shared/models/videos/comment/video-comment.model'
Object.assign(whereVideo, searchAttribute(searchVideo, 'name'))
}
- const query: FindAndCountOptions = {
- offset: start,
- limit: count,
- order: getCommentSort(sort),
- where,
- include: [
- {
- model: AccountModel.unscoped(),
- required: true,
- where: whereAccount,
- include: [
- {
- attributes: {
- exclude: unusedActorAttributesForAPI
- },
- model: ActorModel, // Default scope includes avatar and server
- required: true,
- where: whereActor
- }
- ]
- },
- {
- model: VideoModel.unscoped(),
- required: true,
- where: whereVideo
- }
- ]
+ const getQuery = (forCount: boolean) => {
+ return {
+ offset: start,
+ limit: count,
+ order: getCommentSort(sort),
+ where,
+ include: [
+ {
+ model: AccountModel.unscoped(),
+ required: true,
+ where: whereAccount,
+ include: [
+ {
+ attributes: {
+ exclude: unusedActorAttributesForAPI
+ },
+ model: forCount === true
+ ? ActorModel.unscoped() // Default scope includes avatar and server
+ : ActorModel,
+ required: true,
+ where: whereActor
+ }
+ ]
+ },
+ {
+ model: VideoModel.unscoped(),
+ required: true,
+ where: whereVideo
+ }
+ ]
+ }
}
- return VideoCommentModel
- .findAndCountAll(query)
- .then(({ rows, count }) => {
- return { total: count, data: rows }
- })
+ return Promise.all([
+ VideoCommentModel.count(getQuery(true)),
+ VideoCommentModel.findAll(getQuery(false))
+ ]).then(([ total, data ]) => ({ total, data }))
}
static async listThreadsForApi (parameters: {
}
}
- const scopesList: (string | ScopeOptions)[] = [
+ const findScopesList: (string | ScopeOptions)[] = [
ScopeNames.WITH_ACCOUNT_FOR_API,
{
method: [ ScopeNames.ATTRIBUTES_FOR_API, blockerAccountIds ]
}
]
- const queryCount = {
+ const countScopesList: ScopeOptions[] = [
+ {
+ method: [ ScopeNames.ATTRIBUTES_FOR_API, blockerAccountIds ]
+ }
+ ]
+
+ const notDeletedQueryCount = {
where: {
videoId,
deletedAt: null,
}
return Promise.all([
- VideoCommentModel.scope(scopesList).findAndCountAll(queryList),
- VideoCommentModel.count(queryCount)
- ]).then(([ { rows, count }, totalNotDeletedComments ]) => {
+ VideoCommentModel.scope(findScopesList).findAll(queryList),
+ VideoCommentModel.scope(countScopesList).count(queryList),
+ VideoCommentModel.count(notDeletedQueryCount)
+ ]).then(([ rows, count, totalNotDeletedComments ]) => {
return { total: count, data: rows, totalNotDeletedComments }
})
}
}
]
- return VideoCommentModel.scope(scopes)
- .findAndCountAll(query)
- .then(({ rows, count }) => {
- return { total: count, data: rows }
- })
+ return Promise.all([
+ VideoCommentModel.count(query),
+ VideoCommentModel.scope(scopes).findAll(query)
+ ]).then(([ total, data ]) => ({ total, data }))
}
static listThreadParentComments (comment: MCommentId, t: Transaction, order: 'ASC' | 'DESC' = 'ASC'): Promise<MCommentOwner[]> {
transaction: t
}
- return VideoCommentModel.findAndCountAll<MComment>(query)
+ return Promise.all([
+ VideoCommentModel.count(query),
+ VideoCommentModel.findAll<MComment>(query)
+ ]).then(([ total, data ]) => ({ total, data }))
}
static async listForFeed (parameters: {
if (accountId) {
whereAnd.push({
- [Op.eq]: accountId
+ accountId
})
}
return {
type: 'Note' as 'Note',
id: this.url,
+
content: this.text,
+ mediaType: 'text/markdown',
+
inReplyTo,
updated: this.updatedAt.toISOString(),
published: this.createdAt.toISOString(),