diff --git a/src/app/module/chat/chat-service.service.ts b/src/app/module/chat/chat-service.service.ts index 60c87b303..f76466176 100644 --- a/src/app/module/chat/chat-service.service.ts +++ b/src/app/module/chat/chat-service.service.ts @@ -1,5 +1,4 @@ import { Injectable } from '@angular/core'; -import { MessageAsyncService } from 'src/app/module/chat/data/async/socket/message-async.service' import { UserTypingAsyncService } from 'src/app/module/chat/data/async/socket/user-typing-async.service' @Injectable({ @@ -8,7 +7,6 @@ import { UserTypingAsyncService } from 'src/app/module/chat/data/async/socket/us export class ChatServiceService { constructor( - private MessageAsyncService: MessageAsyncService, private UserTypingAsyncService: UserTypingAsyncService ) { } } diff --git a/src/app/module/chat/data/async/socket/message-async.service.ts b/src/app/module/chat/data/async/socket/message-async.service.ts deleted file mode 100644 index eabbd10f3..000000000 --- a/src/app/module/chat/data/async/socket/message-async.service.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Injectable } from '@angular/core'; -import { MessageLiveDataSourceService } from '../../data-source/message/message-live-data-source.service'; -import { IncomingMessageSchema, MessageLocalDataSourceService } from '../../data-source/message/message-local-data-source.service'; -import { MessageRemoteDataSourceService } from '../../data-source/message/message-remote-data-source.service'; -import { SignalRService } from '../../../infra/socket/signal-r.service'; -import { filter } from 'rxjs/operators'; -import { InstanceId } from '../../repository/message-respository.service'; -import { SafeValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; -import { MessageOutPutDataDTO } from '../../dto/message/messageOutputDTO'; - -@Injectable({ - providedIn: 'root' -}) -export class MessageAsyncService { - - constructor( - private messageRemoteDataSourceService: MessageRemoteDataSourceService, - private messageLiveDataSourceService: MessageLiveDataSourceService, - private messageLiveSignalRDataSourceService: SignalRService, - private messageLocalDataSourceService: MessageLocalDataSourceService - ) { - - this.messageLiveSignalRDataSourceService.getMessage().pipe( - filter((message) => { - if(!message?.requestId?.startsWith(InstanceId) == false) { - // console.log('exclude my message---') - } - return !message?.requestId?.startsWith(InstanceId) - }) - ).subscribe(async (message) => { - - if(message?.id) { - - // console.log('message async ', message) - - const id = message.id + '' - delete message.id; - - const incomingMessage = { - ...message, - messageId: id, - sending: false, - roomId:message.chatRoomId - } - - this.incomingMessage(incomingMessage) - } - - - }) - - - this.messageLiveSignalRDataSourceService.getMessageUpdate().pipe( - filter((message) => { - return !message?.requestId?.startsWith(InstanceId) - }) - ).subscribe(async (message) => { - - if(message?.id) { - - console.log('message async ', message) - - const id = message.id + '' - delete message.id; - - const incomingMessage = { - ...message, - messageId: id, - sending: false, - roomId:message.chatRoomId - } - - this.incomingUpdateMessage(incomingMessage) - } - - - }) - - this.messageLiveSignalRDataSourceService.getMessageDelete() - .pipe() - .subscribe(async (message) => { - if(message.id) { - this.incomingDeleted(message) - } - - }) - - } - - @SafeValidateSchema(IncomingMessageSchema, 'socket/incomingMessage') - async incomingMessage(IncomingMessageSchema: any) { - - const result = await this.messageLocalDataSourceService.sendMessage(IncomingMessageSchema) - - if(result.isOk()) { - - } else { - console.log(result.error) - } - } - - - async incomingDeleted(data: MessageOutPutDataDTO) { - const result = await this.messageLocalDataSourceService.deleteByMessageId(data.id) - - if(result.isOk()) { - - } else { - console.log(result.error) - } - } - - - async incomingUpdateMessage(data: MessageOutPutDataDTO & { messageId }) { - const result = await this.messageLocalDataSourceService.messageExist({messageId: data.messageId}) - - if(result.isOk()) { - console.log('message exist') - return this.messageLocalDataSourceService.update({...result.value, ...data}) - } else { - console.log('message else') - } - - } - -} diff --git a/src/app/module/chat/data/async/socket/room-async.service.ts b/src/app/module/chat/data/async/socket/room-async.service.ts deleted file mode 100644 index ce637ff6e..000000000 --- a/src/app/module/chat/data/async/socket/room-async.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Injectable } from '@angular/core'; -import { MessageLiveDataSourceService } from '../../data-source/message/message-live-data-source.service'; -import { RoomLiveDataSourceService } from '../../data-source/room/room-live-data-source.service'; -import { RoomRemoteDataSourceService } from '../../data-source/room/room-remote-data-source.service'; -import { roomDataSource, RoomLocalDataSourceService } from '../../data-source/room/rooom-local-data-source.service'; - -@Injectable({ - providedIn: 'root' -}) -export class RoomAsyncService { - - constructor( - private roomRemoteDataSourceService: RoomRemoteDataSourceService, - // private roomMemoryDataSourceService: Store, - private roomLocalDataSourceService: RoomLocalDataSourceService, - private roomLiveDataSourceService: RoomLiveDataSourceService, - private messageLiveDataSourceService: MessageLiveDataSourceService, - ) { - - - roomDataSource.typing.hook('creating', (primKey, obj, trans) => { - setTimeout(() => { - - }, 1000); - }) - } - - - incomingTyping() { - - } - - async removeUserTyping() { - const result = await this.roomLocalDataSourceService.removeUserTyping() - } -} diff --git a/src/app/module/chat/data/repository/message-respository.service.ts b/src/app/module/chat/data/repository/message-respository.service.ts index 21a8e661e..5dde781ef 100644 --- a/src/app/module/chat/data/repository/message-respository.service.ts +++ b/src/app/module/chat/data/repository/message-respository.service.ts @@ -6,7 +6,6 @@ import { MessageLocalDataSourceService, TableMessage } from '../data-source/mess import { SessionStore } from 'src/app/store/session.service'; import { SignalRService } from '../../infra/socket/signal-r.service'; import { v4 as uuidv4 } from 'uuid' -import { filter } from 'rxjs/operators'; import { err, ok } from 'neverthrow'; import { MessageDeleteInputDTO } from '../../domain/use-case/message-delete-live-use-case.service'; import { MessageUpdateInput } from '../../domain/use-case/message-update-use-case.service'; @@ -23,15 +22,7 @@ export class MessageRepositoryService { private messageLiveDataSourceService: MessageLiveDataSourceService, private messageLiveSignalRDataSourceService: SignalRService, private messageLocalDataSourceService: MessageLocalDataSourceService - ) { - // this.messageLiveDataSourceService.socket.messages$.subscribe(({payload, requestId, type}) => { - - - - - // }) - - } + ) {} async sendMessage(data: MessageInputDTO) { @@ -140,7 +131,6 @@ export class MessageRepositoryService { return this.messageLocalDataSourceService.getItemsLive(roomId) } - subscribeToNewMessages(roomId: any) { return this.messageLocalDataSourceService.subscribeToNewMessage(roomId) } @@ -153,7 +143,4 @@ export class MessageRepositoryService { }) } - getMemberByLive({roomId, userId}) { - - } } diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index dbd5cd0af..e0fbfe462 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -3,7 +3,12 @@ import { MessageDeleteLiveUseCaseService, MessageDeleteInputDTO } from 'src/app/ import { SessionStore } from 'src/app/store/session.service'; import { MessageReactionInput, MessageReactionUseCaseService } from 'src/app/module/chat/domain/use-case/message-reaction-use-case.service'; import { MessageUpdateInput, MessageUpdateUseCaseService } from 'src/app/module/chat/domain/use-case/message-update-use-case.service'; - +import { SignalRService } from '../infra/socket/signal-r.service'; +import { SocketMessageDeleteUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service'; +import { SocketMessageUpdateUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service'; +import { SocketMessageCreateUseCaseService } from 'src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service'; +import { filter } from 'rxjs/operators'; +import { InstanceId } from '../data/repository/message-respository.service'; @Injectable({ providedIn: 'root' @@ -13,8 +18,50 @@ export class ChatServiceService { constructor( private MessageDeleteLiveUseCaseService: MessageDeleteLiveUseCaseService, private MessageReactionUseCaseService: MessageReactionUseCaseService, - private MessageUpdateUseCaseService: MessageUpdateUseCaseService - ) { } + private MessageUpdateUseCaseService: MessageUpdateUseCaseService, + private SocketMessageDeleteUseCaseService: SocketMessageDeleteUseCaseService, + private messageLiveSignalRDataSourceService: SignalRService, + private SocketMessageUpdateUseCaseService: SocketMessageUpdateUseCaseService, + private SocketMessageCreateUseCaseService: SocketMessageCreateUseCaseService + ) { + this.messageLiveSignalRDataSourceService.getMessageDelete() + .pipe() + .subscribe(async (message) => { + if(message?.id) { + this.SocketMessageDeleteUseCaseService.execute(message) + } + + }) + + this.messageLiveSignalRDataSourceService.getMessageUpdate().pipe( + filter((message) => { + return !message?.requestId?.startsWith(InstanceId) + }) + ).subscribe(async (message) => { + + if(message?.id) { + this.SocketMessageUpdateUseCaseService.execute(message) + } + }) + + this.messageLiveSignalRDataSourceService.getMessage().pipe( + filter((message) => { + if(!message?.requestId?.startsWith(InstanceId) == false) { + // console.log('exclude my message---') + } + return !message?.requestId?.startsWith(InstanceId) + }) + ).subscribe(async (message) => { + + if(message?.id) { + console.log('create message') + this.SocketMessageCreateUseCaseService.execute(message) + } + + + }) + + } messageDelete(data: {roomId, messageId}) { diff --git a/src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service.ts new file mode 100644 index 000000000..b7b57d395 --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket/socket-message-create-use-case.service.ts @@ -0,0 +1,33 @@ +import { Injectable, Input } from '@angular/core'; +import { MessageLocalDataSourceService } from '../../../data/data-source/message/message-local-data-source.service'; + +@Injectable({ + providedIn: 'root' +}) +export class SocketMessageCreateUseCaseService { + + constructor( + private messageLocalDataSourceService: MessageLocalDataSourceService, + ) { } + + async execute(input: any) { + + const id = input.id + '' + delete input.id; + + const incomingMessage = { + ...input, + messageId: id, + sending: false, + roomId:input.chatRoomId + } + + const result = await this.messageLocalDataSourceService.sendMessage(incomingMessage) + + if(result.isOk()) { + + } else { + console.log(result.error) + } + } +} diff --git a/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts new file mode 100644 index 000000000..86e56ea9a --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket/socket-message-delete-use-case.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { MessageLocalDataSourceService } from '../../../data/data-source/message/message-local-data-source.service'; +import { MessageOutPutDataDTO } from '../../../data/dto/message/messageOutputDTO'; + +@Injectable({ + providedIn: 'root' +}) +export class SocketMessageDeleteUseCaseService { + + constructor( + private messageLocalDataSourceService: MessageLocalDataSourceService + ) { } + + + async execute(input: MessageOutPutDataDTO) { + const result = await this.messageLocalDataSourceService.deleteByMessageId(input.id) + + if(result.isOk()) { + + } else { + console.log(result.error) + } + } +} diff --git a/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts b/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts new file mode 100644 index 000000000..f0747e766 --- /dev/null +++ b/src/app/module/chat/domain/use-case/socket/socket-message-update-use-case.service.ts @@ -0,0 +1,37 @@ +import { Injectable } from '@angular/core'; +import { MessageLocalDataSourceService } from '../../../data/data-source/message/message-local-data-source.service'; +import { MessageOutPutDataDTO } from '../../../data/dto/message/messageOutputDTO'; + +@Injectable({ + providedIn: 'root' +}) +export class SocketMessageUpdateUseCaseService { + + constructor( + private messageLocalDataSourceService: MessageLocalDataSourceService + ) { } + + + async execute(data: MessageOutPutDataDTO) { + const result = await this.messageLocalDataSourceService.messageExist({messageId: data.id}) + + + const id = data.id + '' + delete data.id; + + const incomingMessage = { + ...data, + messageId: id, + sending: false, + roomId:data.chatRoomId + } + + if(result.isOk()) { + console.log('message exist') + return this.messageLocalDataSourceService.update({...result.value, ...incomingMessage}) + } else { + console.log('message else') + } + + } +} diff --git a/src/app/module/chat/infra/socket/signal-r.service.ts b/src/app/module/chat/infra/socket/signal-r.service.ts index 93c76db41..4291d0f54 100644 --- a/src/app/module/chat/infra/socket/signal-r.service.ts +++ b/src/app/module/chat/infra/socket/signal-r.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { BehaviorSubject } from 'rxjs'; +import { BehaviorSubject, Subject, timer } from 'rxjs'; import { Platform } from '@ionic/angular'; import { SignalRConnection } from './signalR'; import { Plugins } from '@capacitor/core'; @@ -7,6 +7,7 @@ import { UserTypingDTO } from '../../data/dto/typing/typingInputDTO'; import { MessageOutPutDataDTO } from '../../data/dto/message/messageOutputDTO'; import { MessageDeleteInputDTO } from '../../data/dto/message/messageDeleteInputDTO'; import { object, z } from 'zod'; +import { switchMap } from 'rxjs/operators'; const { App } = Plugins; @@ -32,27 +33,34 @@ export class SignalRService { private messageUpdateSubject: BehaviorSubject = new BehaviorSubject(null); private sendDataSubject: BehaviorSubject = new BehaviorSubject(false); + private deadConnectionBackGround: Subject; - constructor( - private platform: Platform) { - // this.startConnection(); - // this.addMessageListener(); + constructor(private platform: Platform) { + + + this.deadConnectionBackGround = new Subject() + this.deadConnectionBackGround.pipe( + switchMap(() => timer(300000)), + ).subscribe(() => { + this.newConnection() + }) try { if (!this.platform.is('desktop')) { App.addListener('appStateChange', ({ isActive }) => { if (isActive) { // The app is in the foreground. - console.log('App is in the foreground'); + // console.log('App is in the foreground'); + this.deadConnectionBackGround.next() - this.newConnection() - - } else { - // The app is in the background. - console.log('App is in the background'); - // You can perform actions specific to the background state here. } }); + } else { + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible') { + this.deadConnectionBackGround.next() + } + }); } } catch(error) {} @@ -75,6 +83,7 @@ export class SignalRService { }) this.connection.getMessages().subscribe((data) => { + console.log("receive message 55") this.messageSubject.next(data) }) this.connection.getTyping().subscribe((data) => { @@ -89,12 +98,9 @@ export class SignalRService { this.messageUpdateSubject.next(data) }) - this.connection.getMessageUpdateSubject().subscribe((data) => { - this.messageUpdateSubject.next(data) - }) - this.connection.getData().subscribe((data) => { - this.messageUpdateSubject.next(data) + this.sendDataSubject.next(data) + this.deadConnectionBackGround.next() }) }