add endpoint

This commit is contained in:
Peter Maquiran
2024-08-02 16:20:26 +01:00
parent 68a7eb8bad
commit 643bfe8310
9 changed files with 168 additions and 198 deletions
@@ -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
) { }
}
@@ -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')
}
}
}
@@ -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<RoomRemoteDataSourceState>,
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()
}
}
@@ -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}) {
}
}
@@ -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}) {
@@ -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)
}
}
}
@@ -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)
}
}
}
@@ -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')
}
}
}
@@ -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<MessageOutPutDataDTO> = new BehaviorSubject<MessageOutPutDataDTO>(null);
private sendDataSubject: BehaviorSubject<Object> = new BehaviorSubject<Object>(false);
private deadConnectionBackGround: Subject<any>;
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()
})
}