summaryrefslogtreecommitdiff
path: root/packages/backend/src/GlobalModule.ts
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2024-10-18 21:14:49 +0000
committerdakkar <dakkar@thenautilus.net>2024-10-18 21:14:49 +0000
commitba17776b1961376b5369aa775e8910a227cc02ec (patch)
tree0d0579dd911a6c9b74ebc84195cacf10eafe0918 /packages/backend/src/GlobalModule.ts
parentmerge: Allow logged in users to refresh polls (!686) (diff)
parentMerge branch 'develop' into feature/2024.9.0 (diff)
downloadsharkey-ba17776b1961376b5369aa775e8910a227cc02ec.tar.gz
sharkey-ba17776b1961376b5369aa775e8910a227cc02ec.tar.bz2
sharkey-ba17776b1961376b5369aa775e8910a227cc02ec.zip
merge: version 2024.9.0 (!675)
View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/675 Approved-by: Julia <julia@insertdomain.name> Approved-by: Marie <github@yuugi.dev>
Diffstat (limited to 'packages/backend/src/GlobalModule.ts')
-rw-r--r--packages/backend/src/GlobalModule.ts73
1 files changed, 71 insertions, 2 deletions
diff --git a/packages/backend/src/GlobalModule.ts b/packages/backend/src/GlobalModule.ts
index 09971e8ca0..6ae8ccfbb3 100644
--- a/packages/backend/src/GlobalModule.ts
+++ b/packages/backend/src/GlobalModule.ts
@@ -13,6 +13,8 @@ import { createPostgresDataSource } from './postgres.js';
import { RepositoryModule } from './models/RepositoryModule.js';
import { allSettled } from './misc/promise-tracker.js';
import type { Provider, OnApplicationShutdown } from '@nestjs/common';
+import { MiMeta } from '@/models/Meta.js';
+import { GlobalEvents } from './core/GlobalEventService.js';
const $config: Provider = {
provide: DI.config,
@@ -78,11 +80,76 @@ const $redisForTimelines: Provider = {
inject: [DI.config],
};
+const $redisForReactions: Provider = {
+ provide: DI.redisForReactions,
+ useFactory: (config: Config) => {
+ return new Redis.Redis(config.redisForReactions);
+ },
+ inject: [DI.config],
+};
+
+const $meta: Provider = {
+ provide: DI.meta,
+ useFactory: async (db: DataSource, redisForSub: Redis.Redis) => {
+ const meta = await db.transaction(async transactionalEntityManager => {
+ // 過去のバグでレコードが複数出来てしまっている可能性があるので新しいIDを優先する
+ const metas = await transactionalEntityManager.find(MiMeta, {
+ order: {
+ id: 'DESC',
+ },
+ });
+
+ const meta = metas[0];
+
+ if (meta) {
+ return meta;
+ } else {
+ // metaが空のときfetchMetaが同時に呼ばれるとここが同時に呼ばれてしまうことがあるのでフェイルセーフなupsertを使う
+ const saved = await transactionalEntityManager
+ .upsert(
+ MiMeta,
+ {
+ id: 'x',
+ },
+ ['id'],
+ )
+ .then((x) => transactionalEntityManager.findOneByOrFail(MiMeta, x.identifiers[0]));
+
+ return saved;
+ }
+ });
+
+ async function onMessage(_: string, data: string): Promise<void> {
+ const obj = JSON.parse(data);
+
+ if (obj.channel === 'internal') {
+ const { type, body } = obj.message as GlobalEvents['internal']['payload'];
+ switch (type) {
+ case 'metaUpdated': {
+ for (const key in body.after) {
+ (meta as any)[key] = (body.after as any)[key];
+ }
+ meta.proxyAccount = null; // joinなカラムは通常取ってこないので
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+ redisForSub.on('message', onMessage);
+
+ return meta;
+ },
+ inject: [DI.db, DI.redisForSub],
+};
+
@Global()
@Module({
imports: [RepositoryModule],
- providers: [$config, $db, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines],
- exports: [$config, $db, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, RepositoryModule],
+ providers: [$config, $db, $meta, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, $redisForReactions],
+ exports: [$config, $db, $meta, $meilisearch, $redis, $redisForPub, $redisForSub, $redisForTimelines, $redisForReactions, RepositoryModule],
})
export class GlobalModule implements OnApplicationShutdown {
constructor(
@@ -91,6 +158,7 @@ export class GlobalModule implements OnApplicationShutdown {
@Inject(DI.redisForPub) private redisForPub: Redis.Redis,
@Inject(DI.redisForSub) private redisForSub: Redis.Redis,
@Inject(DI.redisForTimelines) private redisForTimelines: Redis.Redis,
+ @Inject(DI.redisForReactions) private redisForReactions: Redis.Redis,
) { }
public async dispose(): Promise<void> {
@@ -103,6 +171,7 @@ export class GlobalModule implements OnApplicationShutdown {
this.redisForPub.disconnect(),
this.redisForSub.disconnect(),
this.redisForTimelines.disconnect(),
+ this.redisForReactions.disconnect(),
]);
}