循環参照エラーを解消

This commit is contained in:
tamaina 2025-07-24 12:19:42 +09:00
parent 6af0c44712
commit ea87e2318a
3 changed files with 39 additions and 4 deletions

View File

@ -16,7 +16,7 @@ import { bindThis } from '@/decorators.js';
import type { PrivateKeyWithPem } from '@misskey-dev/node-http-message-signatures'; import type { PrivateKeyWithPem } from '@misskey-dev/node-http-message-signatures';
@Injectable() @Injectable()
export class AccountUpdateService { export class AccountUpdateService implements OnModuleInit {
private apDeliverManagerService: ApDeliverManagerService; private apDeliverManagerService: ApDeliverManagerService;
constructor( constructor(
private moduleRef: ModuleRef, private moduleRef: ModuleRef,
@ -30,6 +30,10 @@ export class AccountUpdateService {
) { ) {
} }
async onModuleInit() {
this.apDeliverManagerService = this.moduleRef.get(ApDeliverManagerService.name);
}
private async createUpdatePersonActivity(user: MiLocalUser) { private async createUpdatePersonActivity(user: MiLocalUser) {
return this.apRendererService.addContext( return this.apRendererService.addContext(
this.apRendererService.renderUpdate( this.apRendererService.renderUpdate(

View File

@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-only * SPDX-License-Identifier: AGPL-3.0-only
*/ */
import { Inject, Injectable } from '@nestjs/common'; import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
import { IsNull, Not } from 'typeorm'; import { IsNull, Not } from 'typeorm';
import { DI } from '@/di-symbols.js'; import { DI } from '@/di-symbols.js';
import type { FollowingsRepository } from '@/models/_.js'; import type { FollowingsRepository } from '@/models/_.js';
@ -17,6 +17,7 @@ import type Logger from '@/logger.js';
import { UserKeypairService } from '../UserKeypairService.js'; import { UserKeypairService } from '../UserKeypairService.js';
import { ApLoggerService } from './ApLoggerService.js'; import { ApLoggerService } from './ApLoggerService.js';
import type { PrivateKeyWithPem } from '@misskey-dev/node-http-message-signatures'; import type { PrivateKeyWithPem } from '@misskey-dev/node-http-message-signatures';
import { ModuleRef } from '@nestjs/core';
interface IRecipe { interface IRecipe {
type: string; type: string;
@ -212,21 +213,27 @@ class DeliverManager {
} }
@Injectable() @Injectable()
export class ApDeliverManagerService { export class ApDeliverManagerService implements OnModuleInit {
private logger: Logger; private logger: Logger;
private accountUpdateService: AccountUpdateService;
constructor( constructor(
private moduleRef: ModuleRef,
@Inject(DI.followingsRepository) @Inject(DI.followingsRepository)
private followingsRepository: FollowingsRepository, private followingsRepository: FollowingsRepository,
private userKeypairService: UserKeypairService, private userKeypairService: UserKeypairService,
private queueService: QueueService, private queueService: QueueService,
private accountUpdateService: AccountUpdateService,
private apLoggerService: ApLoggerService, private apLoggerService: ApLoggerService,
) { ) {
this.logger = this.apLoggerService.logger.createSubLogger('deliver-manager'); this.logger = this.apLoggerService.logger.createSubLogger('deliver-manager');
} }
async onModuleInit() {
this.accountUpdateService = this.moduleRef.get(AccountUpdateService.name);
}
/** /**
* Deliver activity to followers * Deliver activity to followers
* @param actor * @param actor

View File

@ -31,6 +31,7 @@ import { ApDeliverManagerService } from '@/core/activitypub/ApDeliverManagerServ
import { RelayService } from '@/core/RelayService.js'; import { RelayService } from '@/core/RelayService.js';
import { ApLoggerService } from '@/core/activitypub/ApLoggerService.js'; import { ApLoggerService } from '@/core/activitypub/ApLoggerService.js';
import { MiRemoteUser } from '@/models/User.js'; import { MiRemoteUser } from '@/models/User.js';
import { UserKeypairService } from '@/core/UserKeypairService.js';
function genHost() { function genHost() {
return randomString() + '.example.com'; return randomString() + '.example.com';
@ -47,6 +48,9 @@ describe('UserSuspendService', () => {
let globalEventService: jest.Mocked<GlobalEventService>; let globalEventService: jest.Mocked<GlobalEventService>;
let apRendererService: jest.Mocked<ApRendererService>; let apRendererService: jest.Mocked<ApRendererService>;
let moderationLogService: jest.Mocked<ModerationLogService>; let moderationLogService: jest.Mocked<ModerationLogService>;
let userKeypairService: jest.Mocked<UserKeypairService>;
let accountUpdateService: AccountUpdateService;
let apDeliverManagerService: ApDeliverManagerService;
async function createUser(data: Partial<MiUser> = {}): Promise<MiUser> { async function createUser(data: Partial<MiUser> = {}): Promise<MiUser> {
const user = { const user = {
@ -92,6 +96,14 @@ describe('UserSuspendService', () => {
UserSuspendService, UserSuspendService,
AccountUpdateService, AccountUpdateService,
ApDeliverManagerService, ApDeliverManagerService,
{
provide: AccountUpdateService.name,
useExisting: AccountUpdateService,
},
{
provide: ApDeliverManagerService.name,
useExisting: ApDeliverManagerService,
},
{ {
provide: UserEntityService, provide: UserEntityService,
useFactory: () => ({ useFactory: () => ({
@ -145,6 +157,12 @@ describe('UserSuspendService', () => {
}, },
}), }),
}, },
{
provide: UserKeypairService,
useFactory: () => ({
refreshAndPrepareEd25519KeyPair: jest.fn(),
}),
}
], ],
}).compile(); }).compile();
@ -159,6 +177,12 @@ describe('UserSuspendService', () => {
globalEventService = app.get<GlobalEventService>(GlobalEventService) as jest.Mocked<GlobalEventService>; globalEventService = app.get<GlobalEventService>(GlobalEventService) as jest.Mocked<GlobalEventService>;
apRendererService = app.get<ApRendererService>(ApRendererService) as jest.Mocked<ApRendererService>; apRendererService = app.get<ApRendererService>(ApRendererService) as jest.Mocked<ApRendererService>;
moderationLogService = app.get<ModerationLogService>(ModerationLogService) as jest.Mocked<ModerationLogService>; moderationLogService = app.get<ModerationLogService>(ModerationLogService) as jest.Mocked<ModerationLogService>;
userKeypairService = app.get<UserKeypairService>(UserKeypairService) as jest.Mocked<UserKeypairService>;
apDeliverManagerService = app.get<ApDeliverManagerService>(ApDeliverManagerService);
await apDeliverManagerService.onModuleInit();
accountUpdateService = app.get<AccountUpdateService>(AccountUpdateService.name);
await accountUpdateService.onModuleInit();
}); });
beforeEach(() => { beforeEach(() => {