5728350267
* fix: muted user query also checks instances This way it can be ensured that the instance mute is used everywhere it is required without checking the whole codebase again. Muted users and muted instances should be used together anyways. * fix lint
71 lines
2.3 KiB
TypeScript
71 lines
2.3 KiB
TypeScript
import { Brackets } from 'typeorm';
|
|
import { Notes } from '@/models/index.js';
|
|
import define from '../../define.js';
|
|
import { makePaginationQuery } from '../../common/make-pagination-query.js';
|
|
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
|
|
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
|
|
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
|
|
|
|
export const meta = {
|
|
tags: ['notes'],
|
|
|
|
requireCredential: false,
|
|
|
|
res: {
|
|
type: 'array',
|
|
optional: false, nullable: false,
|
|
items: {
|
|
type: 'object',
|
|
optional: false, nullable: false,
|
|
ref: 'Note',
|
|
},
|
|
},
|
|
} as const;
|
|
|
|
export const paramDef = {
|
|
type: 'object',
|
|
properties: {
|
|
noteId: { type: 'string', format: 'misskey:id' },
|
|
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
|
|
sinceId: { type: 'string', format: 'misskey:id' },
|
|
untilId: { type: 'string', format: 'misskey:id' },
|
|
},
|
|
required: ['noteId'],
|
|
} as const;
|
|
|
|
// eslint-disable-next-line import/no-default-export
|
|
export default define(meta, paramDef, async (ps, user) => {
|
|
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
|
|
.andWhere(new Brackets(qb => { qb
|
|
.where('note.replyId = :noteId', { noteId: ps.noteId })
|
|
.orWhere(new Brackets(qb => { qb
|
|
.where('note.renoteId = :noteId', { noteId: ps.noteId })
|
|
.andWhere(new Brackets(qb => { qb
|
|
.where('note.text IS NOT NULL')
|
|
.orWhere('note.fileIds != \'{}\'')
|
|
.orWhere('note.hasPoll = TRUE');
|
|
}));
|
|
}));
|
|
}))
|
|
.innerJoinAndSelect('note.user', 'user')
|
|
.leftJoinAndSelect('user.avatar', 'avatar')
|
|
.leftJoinAndSelect('user.banner', 'banner')
|
|
.leftJoinAndSelect('note.reply', 'reply')
|
|
.leftJoinAndSelect('note.renote', 'renote')
|
|
.leftJoinAndSelect('reply.user', 'replyUser')
|
|
.leftJoinAndSelect('replyUser.avatar', 'replyUserAvatar')
|
|
.leftJoinAndSelect('replyUser.banner', 'replyUserBanner')
|
|
.leftJoinAndSelect('renote.user', 'renoteUser')
|
|
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
|
|
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
|
|
|
|
generateVisibilityQuery(query, user);
|
|
if (user) {
|
|
generateMutedUserQuery(query, user);
|
|
generateBlockedUserQuery(query, user);
|
|
}
|
|
|
|
const notes = await query.take(ps.limit).getMany();
|
|
|
|
return await Notes.packMany(notes, user);
|
|
});
|