parent
0b5e3a93a5
commit
65e7204ec9
@ -9,6 +9,7 @@ import { toString } from '../../mfm/to-string';
|
|||||||
import { parse } from '../../mfm/parse';
|
import { parse } from '../../mfm/parse';
|
||||||
import { Emoji } from '../entities/emoji';
|
import { Emoji } from '../entities/emoji';
|
||||||
import { concat } from '../../prelude/array';
|
import { concat } from '../../prelude/array';
|
||||||
|
import { NoteReaction } from '../entities/note-reaction';
|
||||||
|
|
||||||
export type PackedNote = SchemaType<typeof packedNoteSchema>;
|
export type PackedNote = SchemaType<typeof packedNoteSchema>;
|
||||||
|
|
||||||
@ -83,6 +84,9 @@ export class NoteRepository extends Repository<Note> {
|
|||||||
options?: {
|
options?: {
|
||||||
detail?: boolean;
|
detail?: boolean;
|
||||||
skipHide?: boolean;
|
skipHide?: boolean;
|
||||||
|
_hint_?: {
|
||||||
|
myReactions: Map<Note['id'], NoteReaction | null>;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
): Promise<PackedNote> {
|
): Promise<PackedNote> {
|
||||||
const opts = Object.assign({
|
const opts = Object.assign({
|
||||||
@ -188,6 +192,16 @@ export class NoteRepository extends Repository<Note> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function populateMyReaction() {
|
async function populateMyReaction() {
|
||||||
|
if (options?._hint_?.myReactions) {
|
||||||
|
const reaction = options._hint_.myReactions.get(note.id);
|
||||||
|
if (reaction) {
|
||||||
|
return convertLegacyReaction(reaction.reaction);
|
||||||
|
} else if (reaction === null) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
// 実装上抜けがあるだけかもしれないので、「ヒントに含まれてなかったら(=undefinedなら)return」のようにはしない
|
||||||
|
}
|
||||||
|
|
||||||
const reaction = await NoteReactions.findOne({
|
const reaction = await NoteReactions.findOne({
|
||||||
userId: meId!,
|
userId: meId!,
|
||||||
noteId: note.id,
|
noteId: note.id,
|
||||||
@ -245,11 +259,13 @@ export class NoteRepository extends Repository<Note> {
|
|||||||
|
|
||||||
...(opts.detail ? {
|
...(opts.detail ? {
|
||||||
reply: note.replyId ? this.pack(note.replyId, meId, {
|
reply: note.replyId ? this.pack(note.replyId, meId, {
|
||||||
detail: false
|
detail: false,
|
||||||
|
_hint_: options?._hint_
|
||||||
}) : undefined,
|
}) : undefined,
|
||||||
|
|
||||||
renote: note.renoteId ? this.pack(note.renoteId, meId, {
|
renote: note.renoteId ? this.pack(note.renoteId, meId, {
|
||||||
detail: true
|
detail: true,
|
||||||
|
_hint_: options?._hint_
|
||||||
}) : undefined,
|
}) : undefined,
|
||||||
|
|
||||||
poll: note.hasPoll ? populatePoll() : undefined,
|
poll: note.hasPoll ? populatePoll() : undefined,
|
||||||
@ -272,7 +288,7 @@ export class NoteRepository extends Repository<Note> {
|
|||||||
return packed;
|
return packed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public packMany(
|
public async packMany(
|
||||||
notes: (Note['id'] | Note)[],
|
notes: (Note['id'] | Note)[],
|
||||||
me?: User['id'] | User | null | undefined,
|
me?: User['id'] | User | null | undefined,
|
||||||
options?: {
|
options?: {
|
||||||
@ -280,7 +296,30 @@ export class NoteRepository extends Repository<Note> {
|
|||||||
skipHide?: boolean;
|
skipHide?: boolean;
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
return Promise.all(notes.map(n => this.pack(n, me, options)));
|
if (notes.length === 0) return [];
|
||||||
|
|
||||||
|
const meId = me ? typeof me === 'string' ? me : me.id : null;
|
||||||
|
const noteIds = notes.map(n => typeof n === 'object' ? n.id : n);
|
||||||
|
const myReactionsMap = new Map<Note['id'], NoteReaction | null>();
|
||||||
|
if (meId) {
|
||||||
|
const renoteIds = notes.filter(n => (typeof n === 'object') && (n.renoteId != null)).map(n => (n as Note).renoteId!);
|
||||||
|
const targets = [...noteIds, ...renoteIds];
|
||||||
|
const myReactions = await NoteReactions.find({
|
||||||
|
userId: meId,
|
||||||
|
noteId: In(targets),
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const target of targets) {
|
||||||
|
myReactionsMap.set(target, myReactions.find(reaction => reaction.noteId === target) || null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return await Promise.all(notes.map(n => this.pack(n, me, {
|
||||||
|
...options,
|
||||||
|
_hint_: {
|
||||||
|
myReactions: myReactionsMap
|
||||||
|
}
|
||||||
|
})));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ import { isDuplicateKeyValueError } from '../../../misc/is-duplicate-key-value-e
|
|||||||
import { NoteReaction } from '../../../models/entities/note-reaction';
|
import { NoteReaction } from '../../../models/entities/note-reaction';
|
||||||
|
|
||||||
export default async (user: User, note: Note, reaction?: string) => {
|
export default async (user: User, note: Note, reaction?: string) => {
|
||||||
|
// TODO: cache
|
||||||
reaction = await toDbReaction(reaction, user.host);
|
reaction = await toDbReaction(reaction, user.host);
|
||||||
|
|
||||||
let record: NoteReaction;
|
let record: NoteReaction;
|
||||||
|
Loading…
Reference in New Issue
Block a user