diff --git a/packages/backend/src/core/MetaService.ts b/packages/backend/src/core/MetaService.ts index 5ae9a6fc8..1744f6421 100644 --- a/packages/backend/src/core/MetaService.ts +++ b/packages/backend/src/core/MetaService.ts @@ -3,6 +3,7 @@ import { DataSource } from 'typeorm'; import Redis from 'ioredis'; import { DI } from '@/di-symbols.js'; import { Meta } from '@/models/entities/Meta.js'; +import { GlobalEventService } from '@/core/GlobalEventService.js'; import type { OnApplicationShutdown } from '@nestjs/common'; @Injectable() @@ -16,6 +17,8 @@ export class MetaService implements OnApplicationShutdown { @Inject(DI.db) private db: DataSource, + + private globalEventService: GlobalEventService, ) { this.onMessage = this.onMessage.bind(this); @@ -31,6 +34,22 @@ export class MetaService implements OnApplicationShutdown { this.redisSubscriber.on('message', this.onMessage); } + private async onMessage(_, data): Promise { + const obj = JSON.parse(data); + + if (obj.channel === 'internal') { + const { type, body } = obj.message; + switch (type) { + case 'metaUpdated': { + this.cache = body; + break; + } + default: + break; + } + } + } + public async fetch(noCache = false): Promise { if (!noCache && this.cache) return this.cache; @@ -65,20 +84,34 @@ export class MetaService implements OnApplicationShutdown { }); } - private async onMessage(_, data) { - const obj = JSON.parse(data); + public async update(data: Partial): Promise { + const updated = await this.db.transaction(async transactionalEntityManager => { + const metas = await transactionalEntityManager.find(Meta, { + order: { + id: 'DESC', + }, + }); - if (obj.channel === 'internal') { - const { type, body } = obj.message; - switch (type) { - case 'metaUpdated': { - this.cache = body; - break; - } - default: - break; + const meta = metas[0]; + + if (meta) { + await transactionalEntityManager.update(Meta, meta.id, data); + + const metas = await transactionalEntityManager.find(Meta, { + order: { + id: 'DESC', + }, + }); + + return metas[0]; + } else { + return await transactionalEntityManager.save(Meta, data); } - } + }); + + this.globalEventService.publishInternalEvent('metaUpdated', updated); + + return updated; } public onApplicationShutdown(signal?: string | undefined) { diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index 0ab0780e3..48fae9b94 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -1,11 +1,12 @@ import { Inject, Injectable } from '@nestjs/common'; import { DataSource } from 'typeorm'; -import { Meta } from '@/models/entities/Meta.js'; +import type { Meta } from '@/models/entities/Meta.js'; import { ModerationLogService } from '@/core/ModerationLogService.js'; import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { DI } from '@/di-symbols.js'; import { GlobalEventService } from '@/core/GlobalEventService.js'; +import { MetaService } from '@/core/MetaService.js'; export const meta = { tags: ['admin'], @@ -116,7 +117,7 @@ export default class extends Endpoint { @Inject(DI.db) private db: DataSource, - private globalEventService: GlobalEventService, + private metaService: MetaService, private moderationLogService: ModerationLogService, ) { super(meta, paramDef, async (ps, me) => { @@ -438,32 +439,7 @@ export default class extends Endpoint { set.enableActiveEmailValidation = ps.enableActiveEmailValidation; } - const updated = await this.db.transaction(async transactionalEntityManager => { - const metas = await transactionalEntityManager.find(Meta, { - order: { - id: 'DESC', - }, - }); - - const meta = metas[0]; - - if (meta) { - await transactionalEntityManager.update(Meta, meta.id, set); - - const metas = await transactionalEntityManager.find(Meta, { - order: { - id: 'DESC', - }, - }); - - return metas[0]; - } else { - return await transactionalEntityManager.save(Meta, set); - } - }); - - this.globalEventService.publishInternalEvent('metaUpdated', updated); - + await this.metaService.update(set); this.moderationLogService.insertModerationLog(me, 'updateMeta'); }); }