summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/stream/channels/messaging.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/server/api/stream/channels/messaging.ts')
-rw-r--r--packages/backend/src/server/api/stream/channels/messaging.ts75
1 files changed, 60 insertions, 15 deletions
diff --git a/packages/backend/src/server/api/stream/channels/messaging.ts b/packages/backend/src/server/api/stream/channels/messaging.ts
index 877d44c38e..5bf20c4101 100644
--- a/packages/backend/src/server/api/stream/channels/messaging.ts
+++ b/packages/backend/src/server/api/stream/channels/messaging.ts
@@ -1,11 +1,14 @@
-import { readUserMessagingMessage, readGroupMessagingMessage, deliverReadActivity } from '../../common/read-messaging-message.js';
+import { Inject, Injectable } from '@nestjs/common';
+import { UserGroupJoiningsRepository, UsersRepository, MessagingMessagesRepository } from '@/models/index.js';
+import type { User, ILocalUser, IRemoteUser } from '@/models/entities/User.js';
+import type { UserGroup } from '@/models/entities/UserGroup.js';
+import { MessagingService } from '@/core/MessagingService.js';
+import { UserEntityService } from '@/core/entities/UserEntityService.js';
+import { DI } from '@/di-symbols.js';
import Channel from '../channel.js';
-import { UserGroupJoinings, Users, MessagingMessages } from '@/models/index.js';
-import { User, ILocalUser, IRemoteUser } from '@/models/entities/user.js';
-import { UserGroup } from '@/models/entities/user-group.js';
-import { StreamMessages } from '../types.js';
+import type { StreamMessages } from '../types.js';
-export default class extends Channel {
+class MessagingChannel extends Channel {
public readonly chName = 'messaging';
public static shouldShare = false;
public static requireCredential = true;
@@ -17,7 +20,16 @@ export default class extends Channel {
private typers: Record<User['id'], Date> = {};
private emitTypersIntervalId: ReturnType<typeof setInterval>;
- constructor(id: string, connection: Channel['connection']) {
+ constructor(
+ private usersRepository: UsersRepository,
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
+ private messagingMessagesRepository: MessagingMessagesRepository,
+ private userEntityService: UserEntityService,
+ private messagingService: MessagingService,
+
+ id: string,
+ connection: Channel['connection'],
+ ) {
super(id, connection);
this.onEvent = this.onEvent.bind(this);
this.onMessage = this.onMessage.bind(this);
@@ -26,12 +38,12 @@ export default class extends Channel {
public async init(params: any) {
this.otherpartyId = params.otherparty;
- this.otherparty = this.otherpartyId ? await Users.findOneByOrFail({ id: this.otherpartyId }) : null;
+ this.otherparty = this.otherpartyId ? await this.usersRepository.findOneByOrFail({ id: this.otherpartyId }) : null;
this.groupId = params.group;
// Check joining
if (this.groupId) {
- const joining = await UserGroupJoinings.findOneBy({
+ const joining = await this.userGroupJoiningsRepository.findOneBy({
userId: this.user!.id,
userGroupId: this.groupId,
});
@@ -68,16 +80,16 @@ export default class extends Channel {
switch (type) {
case 'read':
if (this.otherpartyId) {
- readUserMessagingMessage(this.user!.id, this.otherpartyId, [body.id]);
+ this.messagingService.readUserMessagingMessage(this.user!.id, this.otherpartyId, [body.id]);
// リモートユーザーからのメッセージだったら既読配信
- if (Users.isLocalUser(this.user!) && Users.isRemoteUser(this.otherparty!)) {
- MessagingMessages.findOneBy({ id: body.id }).then(message => {
- if (message) deliverReadActivity(this.user as ILocalUser, this.otherparty as IRemoteUser, message);
+ if (this.userEntityService.isLocalUser(this.user!) && this.userEntityService.isRemoteUser(this.otherparty!)) {
+ this.messagingMessagesRepository.findOneBy({ id: body.id }).then(message => {
+ if (message) this.messagingService.deliverReadActivity(this.user as ILocalUser, this.otherparty as IRemoteUser, message);
});
}
} else if (this.groupId) {
- readGroupMessagingMessage(this.user!.id, this.groupId, [body.id]);
+ this.messagingService.readGroupMessagingMessage(this.user!.id, this.groupId, [body.id]);
}
break;
}
@@ -91,7 +103,7 @@ export default class extends Channel {
if (now.getTime() - date.getTime() > 5000) delete this.typers[userId];
}
- const users = await Users.packMany(Object.keys(this.typers), null, { detail: false });
+ const users = await this.userEntityService.packMany(Object.keys(this.typers), null, { detail: false });
this.send({
type: 'typers',
@@ -105,3 +117,36 @@ export default class extends Channel {
clearInterval(this.emitTypersIntervalId);
}
}
+
+@Injectable()
+export class MessagingChannelService {
+ public readonly shouldShare = MessagingChannel.shouldShare;
+ public readonly requireCredential = MessagingChannel.requireCredential;
+
+ constructor(
+ @Inject(DI.usersRepository)
+ private usersRepository: UsersRepository,
+
+ @Inject(DI.userGroupJoiningsRepository)
+ private userGroupJoiningsRepository: UserGroupJoiningsRepository,
+
+ @Inject(DI.messagingMessagesRepository)
+ private messagingMessagesRepository: MessagingMessagesRepository,
+
+ private userEntityService: UserEntityService,
+ private messagingService: MessagingService,
+ ) {
+ }
+
+ public create(id: string, connection: Channel['connection']): MessagingChannel {
+ return new MessagingChannel(
+ this.usersRepository,
+ this.userGroupJoiningsRepository,
+ this.messagingMessagesRepository,
+ this.userEntityService,
+ this.messagingService,
+ id,
+ connection,
+ );
+ }
+}