Files
doneit-web/src/app/module/chat/data/repository/room-repository.service.ts
T

281 lines
8.7 KiB
TypeScript
Raw Normal View History

2024-06-04 09:31:37 +01:00
import { Injectable } from '@angular/core';
2024-06-04 16:21:11 +01:00
import { RoomRemoteDataSourceService } from '../data-source/room/room-remote-data-source.service'
2024-06-13 12:11:17 +01:00
import { RoomInputDTO } from '../dto/room/roomInputDTO';
2024-06-04 16:21:11 +01:00
import { AddMemberToRoomInputDTO } from '../dto/room/addMemberToRoomInputDto';
import { RoomLocalDataSourceService } from '../data-source/room/rooom-local-data-source.service';
2024-06-07 12:29:53 +01:00
import { RoomByIdInputDTO } from '../dto/room/roomByIdInputDTO';
2024-07-11 10:28:21 +01:00
import { roomListDetermineChanges } from '../async/list/rooms/roomListChangeDetector';
2024-06-10 16:34:43 +01:00
import { UserRemoveListInputDTO } from '../dto/room/userRemoveListInputDTO';
2024-07-11 10:28:21 +01:00
import { roomMemberListDetermineChanges } from '../async/list/rooms/roomMembersChangeDetector';
2024-06-11 11:46:04 +01:00
import { captureAndReraiseAsync } from 'src/app/services/decorators/captureAndReraiseAsync';
2024-06-11 13:48:44 +01:00
import { RoomUpdateInputDTO } from '../dto/room/roomUpdateInputDTO';
2024-06-11 17:29:04 +01:00
import { SessionStore } from 'src/app/store/session.service';
2024-06-13 12:11:17 +01:00
import { RoomLiveDataSourceService } from '../data-source/room/room-live-data-source.service';
import { isHttpResponse } from 'src/app/services/http.service';
2024-06-14 12:00:03 +01:00
import { MessageLiveDataSourceService } from '../data-source/message/message-live-data-source.service';
function date(isoDateString) {
let date = new Date(isoDateString);
const tzOffset = -date.getTimezoneOffset(); // in minutes
const diff = tzOffset >= 0 ? '+' : '-';
const pad = (n: number) => (n < 10 ? '0' : '') + n;
return date.getFullYear() +
'-' + pad(date.getMonth() + 1) +
'-' + pad(date.getDate()) +
'T' + pad(date.getHours()) +
':' + pad(date.getMinutes()) +
':' + pad(date.getSeconds()) +
diff + pad(Math.floor(Math.abs(tzOffset) / 60)) +
':' + pad(Math.abs(tzOffset) % 60);
}
2024-06-04 09:31:37 +01:00
@Injectable({
providedIn: 'root'
})
export class RoomRepositoryService {
constructor(
private roomRemoteDataSourceService: RoomRemoteDataSourceService,
2024-07-11 10:28:21 +01:00
// private roomMemoryDataSourceService: Store<RoomRemoteDataSourceState>,
2024-06-13 12:11:17 +01:00
private roomLocalDataSourceService: RoomLocalDataSourceService,
2024-06-14 12:00:03 +01:00
private roomLiveDataSourceService: RoomLiveDataSourceService,
private messageLiveDataSourceService: MessageLiveDataSourceService,
2024-07-17 16:39:18 +01:00
) {}
2024-06-04 09:31:37 +01:00
2024-06-11 11:46:04 +01:00
@captureAndReraiseAsync('RoomRepositoryService/list')
2024-06-04 16:21:11 +01:00
async list() {
const result = await this.roomRemoteDataSourceService.getRoomList()
2024-06-10 09:33:02 +01:00
2024-06-08 14:58:49 +01:00
const localList = await this.roomLocalDataSourceService.getRoomList()
2024-06-05 11:09:03 +01:00
if(result.isOk()) {
2024-06-08 14:58:49 +01:00
const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges(result.value.data, localList)
2024-06-10 09:33:02 +01:00
for( const roomData of roomsToInsert) {
2024-06-14 12:00:03 +01:00
// roomData["lastMessage"] = {
// sentAt: date(roomData.createdAt),
// message: "",
// sender: {
// wxUserId: "",
// wxFullName: "",
// },
// }
2024-06-11 11:46:04 +01:00
this.roomLocalDataSourceService.createRoom(roomData)
}
for( const roomData of roomsToUpdate) {
2024-06-14 12:00:03 +01:00
// roomData["lastMessage"] = {
// sentAt: date(roomData.createdAt),
// message: "",
// sender: {
// wxUserId: "",
// wxFullName: "",
// },
// }
2024-06-11 11:46:04 +01:00
this.roomLocalDataSourceService.updateRoom(roomData)
}
for( const roomData of roomsToDelete) {
2024-06-14 12:00:03 +01:00
// roomData["lastMessage"] = {
// sentAt: date(roomData.createdAt),
// message: "",
// sender: {
// wxUserId: 0,
// wxFullName: "",
// },
// }
2024-06-11 11:46:04 +01:00
this.roomLocalDataSourceService.deleteRoomById(roomData.id)
2024-06-05 11:09:03 +01:00
}
}
2024-06-04 16:21:11 +01:00
return result
2024-06-04 09:31:37 +01:00
}
2024-06-11 13:48:44 +01:00
@captureAndReraiseAsync('RoomRepositoryService/updateRoomBy')
async updateRoomBy(data: RoomUpdateInputDTO) {
2024-06-12 09:44:28 +01:00
const result = await this.roomRemoteDataSourceService.updateRoom(data)
if(result.isOk()) {
const localList = await this.roomLocalDataSourceService.getRoomList()
const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([result.value.data], localList)
for( const roomData of roomsToUpdate) {
2024-06-12 11:49:41 +01:00
if(!roomData.createdBy?.wxUserId) {
delete roomData.createdBy;
}
2024-06-12 09:44:28 +01:00
this.roomLocalDataSourceService.updateRoom(roomData)
}
}
return result
2024-06-11 13:48:44 +01:00
}
2024-06-11 11:46:04 +01:00
@captureAndReraiseAsync('RoomRepositoryService/getRoomById')
2024-06-07 12:29:53 +01:00
async getRoomById(id: RoomByIdInputDTO) {
const result = await this.roomRemoteDataSourceService.getRoom(id)
if(result.isOk()) {
2024-06-10 17:04:04 +01:00
2024-06-11 17:29:04 +01:00
const localListRoom = await this.roomLocalDataSourceService.getRoomList()
const { roomsToDelete, roomsToInsert, roomsToUpdate } = roomListDetermineChanges([result.value.data], localListRoom)
2024-06-10 17:04:04 +01:00
2024-06-11 17:29:04 +01:00
for( const roomData of roomsToUpdate) {
this.roomLocalDataSourceService.updateRoom(roomData)
}
2024-06-11 11:46:04 +01:00
2024-06-11 17:29:04 +01:00
// ============================
const localList = await this.roomLocalDataSourceService.getRoomMemberById(id)
2024-06-11 11:46:04 +01:00
2024-06-11 17:29:04 +01:00
const { membersToInsert, membersToUpdate, membersToDelete } = roomMemberListDetermineChanges(result.value.data.members, localList, id)
2024-06-11 11:46:04 +01:00
for (const user of membersToInsert) {
2024-06-13 12:11:17 +01:00
await this.roomLocalDataSourceService.addMember({...user, roomId:id})
2024-06-07 12:29:53 +01:00
}
for(const user of membersToDelete) {
2024-06-13 12:11:17 +01:00
await this.roomLocalDataSourceService.removeMemberFromRoom(user.$roomIdUserId)
}
2024-06-13 12:11:17 +01:00
const __localListRoom = await this.roomLocalDataSourceService.getRoomList()
// this.roomLiveDataSourceService.getRoomById({
// type:'memberList',
// payload: __localListRoom
// })
} else if (isHttpResponse(result.error) ) {
if(result.error.status == 404) {
await this.roomLocalDataSourceService.deleteRoomById(id)
}
// this.httpErrorHandle.httpStatusHandle(result.error)
2024-06-07 12:29:53 +01:00
}
2024-06-10 16:34:43 +01:00
return result
2024-06-07 12:29:53 +01:00
}
2024-06-12 11:56:21 +01:00
@captureAndReraiseAsync('RoomRepositoryService/deleteRoomById')
async deleteRoomById(id: RoomByIdInputDTO) {
const result = await this.roomRemoteDataSourceService.deleteRoom(id)
if(result.isOk()) {
2024-06-14 13:10:11 +01:00
const result = await this.roomLocalDataSourceService.deleteRoomById(id)
2024-07-22 13:28:52 +01:00
// this.messageLiveDataSourceService.sendMessage({
// type: 'createRoom',
// payload: {a: '5'}
// })
2024-06-12 11:56:21 +01:00
2024-06-14 13:10:11 +01:00
return result
2024-06-13 12:11:17 +01:00
} else if (isHttpResponse(result.error)) {
if(result.error.status == 404) {
await this.roomLocalDataSourceService.deleteRoomById(id)
}
// this.httpErrorHandle.httpStatusHandle(result.error)
2024-06-12 11:56:21 +01:00
}
return result
}
2024-06-11 11:46:04 +01:00
@captureAndReraiseAsync('RoomRepositoryService/create')
2024-06-04 16:21:11 +01:00
async create(data: RoomInputDTO) {
2024-06-04 09:31:37 +01:00
const result = await this.roomRemoteDataSourceService.createRoom(data)
if(result.isOk()) {
2024-06-07 17:00:30 +01:00
2024-06-11 17:29:04 +01:00
if(!result.value.data.createdBy) {
2024-06-14 12:00:03 +01:00
let dataObject;
2024-06-11 17:29:04 +01:00
result.value.data.createdBy = {
wxeMail: SessionStore.user.Email,
wxFullName: SessionStore.user.FullName,
2024-06-14 09:30:14 +01:00
wxUserId: SessionStore.user.UserId,
2024-06-11 17:29:04 +01:00
}
2024-06-14 12:00:03 +01:00
dataObject = result.value.data
dataObject.lastMessage = {
sentAt: date(new Date()),
message: "",
sender: {
wxUserId: "",
wxFullName: "",
},
}
2024-06-11 17:29:04 +01:00
}
2024-07-11 10:28:21 +01:00
// this.roomMemoryDataSourceService.dispatch(addRoom(result.value))
2024-06-14 09:30:14 +01:00
const localResult = await this.roomLocalDataSourceService.createRoom(result.value.data)
2024-07-22 13:28:52 +01:00
// this.messageLiveDataSourceService.sendMessage({
// type: 'createRoom',
// payload: {a: '5'}
// })
2024-06-14 12:00:03 +01:00
2024-06-14 09:30:14 +01:00
return localResult.map(e => result.value)
2024-06-04 09:31:37 +01:00
}
return result
}
2024-06-04 09:58:04 +01:00
2024-06-04 16:21:11 +01:00
2024-06-12 12:54:38 +01:00
@captureAndReraiseAsync('RoomRepositoryService/addMemberToRoom')
2024-06-04 16:21:11 +01:00
async addMemberToRoom(data: AddMemberToRoomInputDTO) {
2024-06-04 09:58:04 +01:00
const result = await this.roomRemoteDataSourceService.addMemberToRoom(data)
return result
}
2024-06-04 16:21:11 +01:00
2024-06-10 16:34:43 +01:00
2024-06-12 12:54:38 +01:00
@captureAndReraiseAsync('RoomRepositoryService/removeMemberToRoom')
2024-06-10 16:34:43 +01:00
async removeMemberToRoom(data: UserRemoveListInputDTO) {
const result = await this.roomRemoteDataSourceService.removeMemberFromRoom(data)
return result
}
2024-06-12 11:49:41 +01:00
async leaveRoom(data: UserRemoveListInputDTO) {
const result = await this.roomRemoteDataSourceService.removeMemberFromRoom(data)
if(result.isOk()) {
2024-06-13 12:11:17 +01:00
this.roomLocalDataSourceService.leaveRoom(data.id)
} else if (isHttpResponse(result.error)) {
if(result.error.status == 404) {
await this.roomLocalDataSourceService.deleteRoomById(data.id)
2024-06-14 13:10:11 +01:00
2024-06-13 12:11:17 +01:00
}
// this.httpErrorHandle.httpStatusHandle(result.error)
2024-06-12 11:49:41 +01:00
}
return result
}
2024-06-04 16:21:11 +01:00
getItemsLive() {
return this.roomLocalDataSourceService.getItemsLive()
}
2024-06-05 10:28:38 +01:00
getItemByIdLive(id: any) {
return this.roomLocalDataSourceService.getRoomByIdLive(id)
}
2024-06-07 12:29:53 +01:00
getRoomMemberByIdLive(roomId: any) {
return this.roomLocalDataSourceService.getRoomMemberByIdLive(roomId)
}
2024-06-10 16:34:43 +01:00
getRoomMemberById(roomId: any) {
return this.roomLocalDataSourceService.getRoomMemberById(roomId)
}
2024-06-13 12:11:17 +01:00
2024-06-04 09:31:37 +01:00
}