diff --git a/packages/backend/src/server/web/FeedService.ts b/packages/backend/src/server/web/FeedService.ts index d6ca8ca670..8c6f5abe79 100644 --- a/packages/backend/src/server/web/FeedService.ts +++ b/packages/backend/src/server/web/FeedService.ts @@ -7,7 +7,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { In, IsNull } from 'typeorm'; import { Feed } from 'feed'; import { DI } from '@/di-symbols.js'; -import type { DriveFilesRepository, NotesRepository, UserProfilesRepository } from '@/models/_.js'; +import type { DriveFilesRepository, NotesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js'; import type { Config } from '@/config.js'; import type { MiUser } from '@/models/User.js'; import { UserEntityService } from '@/core/entities/UserEntityService.js'; @@ -19,13 +19,20 @@ import { parse as mfmParse } from 'mfm-js'; import { MiNote } from '@/models/Note.js'; import { isQuote, isRenote } from '@/misc/is-renote.js'; import { getNoteSummary } from '@/misc/get-note-summary.js'; +import Logger from '@/logger.js'; +import { LoggerService } from '@/core/LoggerService.js'; @Injectable() export class FeedService { + private readonly logger: Logger; + constructor( @Inject(DI.config) private config: Config, + @Inject(DI.usersRepository) + private usersRepository: UsersRepository, + @Inject(DI.userProfilesRepository) private userProfilesRepository: UserProfilesRepository, @@ -39,7 +46,10 @@ export class FeedService { private driveFileEntityService: DriveFileEntityService, private idService: IdService, private mfmService: MfmService, + + loggerService: LoggerService, ) { + this.logger = loggerService.getLogger('feed'); } @bindThis @@ -55,7 +65,6 @@ export class FeedService { const notes = await this.notesRepository.find({ where: { userId: user.id, - renoteId: IsNull(), visibility: In(['public', 'home']), }, order: { id: -1 }, @@ -82,7 +91,7 @@ export class FeedService { let contentStr = await this.noteToString(note, true); let next = note.renoteId ? note.renoteId : note.replyId; let depth = 10; - let noteintitle = true; + const noteintitle = true; let title = `Post by ${author.name}`; while (depth > 0 && next) { const finding = await this.findById(next); @@ -120,13 +129,13 @@ export class FeedService { } private escapeCDATA(str: string) { - return str.replaceAll("]]>", "]]]]>").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, ""); + return str?.replaceAll("]]>", "]]]]>").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, ""); } private async noteToString(note: MiNote, isTheNote = false) { const author = isTheNote ? null - : await this.userProfilesRepository.findOneByOrFail({ userId: note.userId }); + : await this.usersRepository.findOneByOrFail({ id: note.userId }); let outstr = author ? `${author.name}(@${author.username}@${ author.host ? author.host : this.config.host @@ -134,7 +143,7 @@ export class FeedService { note.renoteId ? "renotes" : note.replyId ? "replies" : "says" }:
` : ""; - const files = note.fileIds.length > 0 ? await this.driveFilesRepository.findBy({ + const files = note.fileIds?.length ? await this.driveFilesRepository.findBy({ id: In(note.fileIds), }) : []; let fileEle = ""; @@ -169,22 +178,20 @@ export class FeedService { return outstr; } - private async findById(id : String) { + private async findById(id : string) { let text = ""; let next = null; - const findings = await this.notesRepository.find({ - where: { - id: id, - renoteId: IsNull(), - visibility: In(['public', 'home']), - }, - order: { id: -1 }, - take: 1, + const findings = await this.notesRepository.findOneBy({ + id: id, + visibility: In(['public', 'home']), }); + if (findings) { text += `
`; text += await this.noteToString(findings); next = findings.renoteId ? findings.renoteId : findings.replyId; + } else { + this.logger.info(`Note ${id} not in scope`); } return { text, next }; }