feat: 凍結されたユーザーのコンテンツを見えないようにする (MisskeyIO#134)

ついでにEntityServiceの型定義、meのoptionalをやめる
This commit is contained in:
まっちゃとーにゅ 2023-08-08 20:13:05 +09:00 committed by GitHub
parent 3b73874196
commit 7f0acd3ea4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
70 changed files with 742 additions and 325 deletions

View file

@ -9,7 +9,16 @@ import { awaitAll } from '@/misc/prelude/await-all.js';
import type { User } from '@/models/entities/User.js';
import type { Note } from '@/models/entities/Note.js';
import type { NoteReaction } from '@/models/entities/NoteReaction.js';
import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepository, PollVotesRepository, NoteReactionsRepository, ChannelsRepository, DriveFilesRepository } from '@/models/index.js';
import type {
ChannelsRepository,
DriveFilesRepository,
FollowingsRepository,
NoteReactionsRepository,
NotesRepository,
PollsRepository,
PollVotesRepository,
UsersRepository,
} from '@/models/index.js';
import { bindThis } from '@/decorators.js';
import { isNotNull } from '@/misc/is-not-null.js';
import type { OnModuleInit } from '@nestjs/common';
@ -253,13 +262,17 @@ export class NoteEntityService implements OnModuleInit {
}
@bindThis
public async packAttachedFiles(fileIds: Note['fileIds'], packedFiles: Map<Note['fileIds'][number], Packed<'DriveFile'> | null>): Promise<Packed<'DriveFile'>[]> {
public async packAttachedFiles(
fileIds: Note['fileIds'],
packedFiles: Map<Note['fileIds'][number], Packed<'DriveFile'> | null>,
me: { id: User['id'] } | null | undefined,
): Promise<Packed<'DriveFile'>[]> {
const missingIds = [];
for (const id of fileIds) {
if (!packedFiles.has(id)) missingIds.push(id);
}
if (missingIds.length) {
const additionalMap = await this.driveFileEntityService.packManyByIdsMap(missingIds);
const additionalMap = await this.driveFileEntityService.packManyByIdsMap(missingIds, me);
for (const [k, v] of additionalMap) {
packedFiles.set(k, v);
}
@ -270,7 +283,7 @@ export class NoteEntityService implements OnModuleInit {
@bindThis
public async pack(
src: Note['id'] | Note,
me?: { id: User['id'] } | null | undefined,
me: { id: User['id'] } | null | undefined,
options?: {
detail?: boolean;
skipHide?: boolean;
@ -326,7 +339,7 @@ export class NoteEntityService implements OnModuleInit {
emojis: host != null ? this.customEmojiService.populateEmojis(note.emojis, host) : undefined,
tags: note.tags.length > 0 ? note.tags : undefined,
fileIds: note.fileIds,
files: packedFiles != null ? this.packAttachedFiles(note.fileIds, packedFiles) : this.driveFileEntityService.packManyByIds(note.fileIds),
files: packedFiles != null ? this.packAttachedFiles(note.fileIds, packedFiles, me) : this.driveFileEntityService.packManyByIds(note.fileIds, me),
replyId: note.replyId,
renoteId: note.renoteId,
channelId: note.channelId ?? undefined,
@ -387,12 +400,12 @@ export class NoteEntityService implements OnModuleInit {
@bindThis
public async packMany(
notes: Note[],
me?: { id: User['id'] } | null | undefined,
me: { id: User['id'] } | null | undefined,
options?: {
detail?: boolean;
skipHide?: boolean;
},
) {
) : Promise<Packed<'Note'>[]> {
if (notes.length === 0) return [];
const meId = me ? me.id : null;
@ -414,15 +427,17 @@ export class NoteEntityService implements OnModuleInit {
await this.customEmojiService.prefetchEmojis(this.aggregateNoteEmojis(notes));
// TODO: 本当は renote とか reply がないのに renoteId とか replyId があったらここで解決しておく
const fileIds = notes.map(n => [n.fileIds, n.renote?.fileIds, n.reply?.fileIds]).flat(2).filter(isNotNull);
const packedFiles = fileIds.length > 0 ? await this.driveFileEntityService.packManyByIdsMap(fileIds) : new Map();
const packedFiles = fileIds.length > 0 ? await this.driveFileEntityService.packManyByIdsMap(fileIds, me) : new Map();
return await Promise.all(notes.map(n => this.pack(n, me, {
return (await Promise.allSettled(notes.map(n => this.pack(n, me, {
...options,
_hint_: {
myReactions: myReactionsMap,
packedFiles,
},
})));
}))))
.filter(result => result.status === 'fulfilled')
.map(result => (result as PromiseFulfilledResult<Packed<'Note'>>).value);
}
@bindThis