mirror of
https://github.com/misskey-dev/misskey.git
synced 2024-12-27 10:20:27 +01:00
UserWebhook側の対処
This commit is contained in:
parent
872cefcfb8
commit
6f64691219
4 changed files with 32 additions and 66 deletions
|
@ -614,14 +614,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
|
|
||||||
this.roleService.addNoteToRoleTimeline(noteObj);
|
this.roleService.addNoteToRoleTimeline(noteObj);
|
||||||
|
|
||||||
this.webhookService.getActiveWebhooks().then(webhooks => {
|
this.webhookService.enqueueUserWebhook(user.id, 'note', { note: noteObj });
|
||||||
webhooks = webhooks.filter(x => x.userId === user.id && x.on.includes('note'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'note', {
|
|
||||||
note: noteObj,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const nm = new NotificationManager(this.mutingsRepository, this.notificationService, user, note);
|
const nm = new NotificationManager(this.mutingsRepository, this.notificationService, user, note);
|
||||||
|
|
||||||
|
@ -641,13 +634,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
if (!isThreadMuted) {
|
if (!isThreadMuted) {
|
||||||
nm.push(data.reply.userId, 'reply');
|
nm.push(data.reply.userId, 'reply');
|
||||||
this.globalEventService.publishMainStream(data.reply.userId, 'reply', noteObj);
|
this.globalEventService.publishMainStream(data.reply.userId, 'reply', noteObj);
|
||||||
|
this.webhookService.enqueueUserWebhook(data.reply.userId, 'reply', { note: noteObj });
|
||||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === data.reply!.userId && x.on.includes('reply'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'reply', {
|
|
||||||
note: noteObj,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -664,13 +651,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
// Publish event
|
// Publish event
|
||||||
if ((user.id !== data.renote.userId) && data.renote.userHost === null) {
|
if ((user.id !== data.renote.userId) && data.renote.userHost === null) {
|
||||||
this.globalEventService.publishMainStream(data.renote.userId, 'renote', noteObj);
|
this.globalEventService.publishMainStream(data.renote.userId, 'renote', noteObj);
|
||||||
|
this.webhookService.enqueueUserWebhook(data.renote.userId, 'renote', { note: noteObj });
|
||||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === data.renote!.userId && x.on.includes('renote'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'renote', {
|
|
||||||
note: noteObj,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -796,13 +777,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.globalEventService.publishMainStream(u.id, 'mention', detailPackedNote);
|
this.globalEventService.publishMainStream(u.id, 'mention', detailPackedNote);
|
||||||
|
this.webhookService.enqueueUserWebhook(u.id, 'mention', { note: detailPackedNote });
|
||||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === u.id && x.on.includes('mention'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'mention', {
|
|
||||||
note: detailPackedNote,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create notification
|
// Create notification
|
||||||
nm.push(u.id, 'mention');
|
nm.push(u.id, 'mention');
|
||||||
|
|
|
@ -118,13 +118,7 @@ export class UserBlockingService implements OnModuleInit {
|
||||||
schema: 'UserDetailedNotMe',
|
schema: 'UserDetailedNotMe',
|
||||||
}).then(async packed => {
|
}).then(async packed => {
|
||||||
this.globalEventService.publishMainStream(follower.id, 'unfollow', packed);
|
this.globalEventService.publishMainStream(follower.id, 'unfollow', packed);
|
||||||
|
this.webhookService.enqueueUserWebhook(follower.id, 'unfollow', { user: packed });
|
||||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'unfollow', {
|
|
||||||
user: packed,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -333,13 +333,7 @@ export class UserFollowingService implements OnModuleInit {
|
||||||
schema: 'UserDetailedNotMe',
|
schema: 'UserDetailedNotMe',
|
||||||
}).then(async packed => {
|
}).then(async packed => {
|
||||||
this.globalEventService.publishMainStream(follower.id, 'follow', packed);
|
this.globalEventService.publishMainStream(follower.id, 'follow', packed);
|
||||||
|
this.webhookService.enqueueUserWebhook(follower.id, 'follow', { user: packed });
|
||||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('follow'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'follow', {
|
|
||||||
user: packed,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,13 +341,7 @@ export class UserFollowingService implements OnModuleInit {
|
||||||
if (this.userEntityService.isLocalUser(followee)) {
|
if (this.userEntityService.isLocalUser(followee)) {
|
||||||
this.userEntityService.pack(follower.id, followee).then(async packed => {
|
this.userEntityService.pack(follower.id, followee).then(async packed => {
|
||||||
this.globalEventService.publishMainStream(followee.id, 'followed', packed);
|
this.globalEventService.publishMainStream(followee.id, 'followed', packed);
|
||||||
|
this.webhookService.enqueueUserWebhook(followee.id, 'followed', { user: packed });
|
||||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === followee.id && x.on.includes('followed'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'followed', {
|
|
||||||
user: packed,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 通知を作成
|
// 通知を作成
|
||||||
|
@ -400,13 +388,7 @@ export class UserFollowingService implements OnModuleInit {
|
||||||
schema: 'UserDetailedNotMe',
|
schema: 'UserDetailedNotMe',
|
||||||
}).then(async packed => {
|
}).then(async packed => {
|
||||||
this.globalEventService.publishMainStream(follower.id, 'unfollow', packed);
|
this.globalEventService.publishMainStream(follower.id, 'unfollow', packed);
|
||||||
|
this.webhookService.enqueueUserWebhook(follower.id, 'unfollow', { user: packed });
|
||||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'unfollow', {
|
|
||||||
user: packed,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -744,13 +726,7 @@ export class UserFollowingService implements OnModuleInit {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.globalEventService.publishMainStream(follower.id, 'unfollow', packedFollowee);
|
this.globalEventService.publishMainStream(follower.id, 'unfollow', packedFollowee);
|
||||||
|
this.webhookService.enqueueUserWebhook(follower.id, 'unfollow', { user: packedFollowee });
|
||||||
const webhooks = (await this.webhookService.getActiveWebhooks()).filter(x => x.userId === follower.id && x.on.includes('unfollow'));
|
|
||||||
for (const webhook of webhooks) {
|
|
||||||
this.queueService.userWebhookDeliver(webhook, 'unfollow', {
|
|
||||||
user: packedFollowee,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
|
|
@ -5,13 +5,14 @@
|
||||||
|
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
import { type WebhooksRepository } from '@/models/_.js';
|
import { MiUser, type WebhooksRepository } from '@/models/_.js';
|
||||||
import { MiWebhook, WebhookEventTypes } from '@/models/Webhook.js';
|
import { MiWebhook, WebhookEventTypes } from '@/models/Webhook.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { GlobalEvents } from '@/core/GlobalEventService.js';
|
import { GlobalEvents } from '@/core/GlobalEventService.js';
|
||||||
import type { OnApplicationShutdown } from '@nestjs/common';
|
|
||||||
import type { Packed } from '@/misc/json-schema.js';
|
import type { Packed } from '@/misc/json-schema.js';
|
||||||
|
import { QueueService } from '@/core/QueueService.js';
|
||||||
|
import type { OnApplicationShutdown } from '@nestjs/common';
|
||||||
|
|
||||||
export type UserWebhookPayload<T extends WebhookEventTypes> =
|
export type UserWebhookPayload<T extends WebhookEventTypes> =
|
||||||
T extends 'note' | 'reply' | 'renote' |'mention' ? {
|
T extends 'note' | 'reply' | 'renote' |'mention' ? {
|
||||||
|
@ -34,6 +35,7 @@ export class UserWebhookService implements OnApplicationShutdown {
|
||||||
private redisForSub: Redis.Redis,
|
private redisForSub: Redis.Redis,
|
||||||
@Inject(DI.webhooksRepository)
|
@Inject(DI.webhooksRepository)
|
||||||
private webhooksRepository: WebhooksRepository,
|
private webhooksRepository: WebhooksRepository,
|
||||||
|
private queueService: QueueService,
|
||||||
) {
|
) {
|
||||||
this.redisForSub.on('message', this.onMessage);
|
this.redisForSub.on('message', this.onMessage);
|
||||||
}
|
}
|
||||||
|
@ -75,6 +77,25 @@ export class UserWebhookService implements OnApplicationShutdown {
|
||||||
return query.getMany();
|
return query.getMany();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UserWebhook をWebhook配送キューに追加する
|
||||||
|
* @see QueueService.userWebhookDeliver
|
||||||
|
*/
|
||||||
|
@bindThis
|
||||||
|
public async enqueueUserWebhook<T extends WebhookEventTypes>(
|
||||||
|
userId: MiUser['id'],
|
||||||
|
type: T,
|
||||||
|
content: UserWebhookPayload<T>,
|
||||||
|
) {
|
||||||
|
const webhooks = await this.getActiveWebhooks()
|
||||||
|
.then(webhooks => webhooks.filter(webhook => webhook.userId === userId && webhook.on.includes(type)));
|
||||||
|
return Promise.all(
|
||||||
|
webhooks.map(webhook => {
|
||||||
|
return this.queueService.userWebhookDeliver(webhook, type, content);
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async onMessage(_: string, data: string): Promise<void> {
|
private async onMessage(_: string, data: string): Promise<void> {
|
||||||
const obj = JSON.parse(data);
|
const obj = JSON.parse(data);
|
||||||
|
|
Loading…
Reference in a new issue