diff --git a/src/app/module/chat/data/data-source/room/rooom-local-data-source.service.ts b/src/app/module/chat/data/data-source/room/rooom-local-data-source.service.ts index e3dca759e..4fd0f6c8f 100644 --- a/src/app/module/chat/data/data-source/room/rooom-local-data-source.service.ts +++ b/src/app/module/chat/data/data-source/room/rooom-local-data-source.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { RoomListItemOutPutDTO, RoomListOutPutDTO } from '../../dto/room/roomListOutputDTO'; -import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; +import { liveQuery, Observable } from 'Dexie'; import { err, ok, Result } from 'neverthrow'; import { z } from 'zod'; import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; @@ -8,8 +8,6 @@ import { MemberListUPdateStatusInputDTO } from '../../../domain/use-case/socket/ import { MemberTable } from '../../../infra/database/dexie/schema/members'; import { chatDatabase } from '../../../infra/database/dexie/service'; import { RoomTable, RoomTableSchema } from '../../../infra/database/dexie/schema/room'; -import { TypingTableSchema } from '../../../infra/database/dexie/schema/typing'; - @Injectable({ providedIn: 'root' @@ -19,15 +17,6 @@ export class RoomLocalDataSourceService { constructor() {} - @ValidateSchema(TypingTableSchema) - async addUserTyping(data: any) { - try { - const result = await chatDatabase.typing.add(data) - return ok(result) - } catch (e) { - return err(false) - } - } async removeUserTyping() { diff --git a/src/app/module/chat/data/data-source/userTyping/user-typing-local-data-source.service.ts b/src/app/module/chat/data/data-source/userTyping/user-typing-local-data-source.service.ts index 05429dcae..11465010f 100644 --- a/src/app/module/chat/data/data-source/userTyping/user-typing-local-data-source.service.ts +++ b/src/app/module/chat/data/data-source/userTyping/user-typing-local-data-source.service.ts @@ -2,29 +2,10 @@ import { Injectable } from '@angular/core'; import { z } from 'zod'; import { Dexie, EntityTable, liveQuery, Observable } from 'Dexie'; import { err, ok } from 'neverthrow'; - -export const TypingSchema = z.object({ - id: z.string().optional(), - userId: z.string().optional(), - userName: z.string(), - chatRoomId: z.string(), - entryDate: z.string() -}) - -export type TypingList = z.infer - -export type UserTypingList = z.infer +import { chatDatabase } from '../../../infra/database/dexie/service'; +import { TypingTable } from '../../../infra/database/dexie/schema/typing'; -// Database declaration (move this to its own module also) -export const TypingDataSource = new Dexie('UserTyping') as Dexie & { - TypingList: EntityTable; -} - - -TypingDataSource.version(1).stores({ - TypingList: 'id, userId, userName, chatRoomId, entryDate' -}); @Injectable({ providedIn: 'root' @@ -34,21 +15,22 @@ export class UserTypingLocalDataSourceService { constructor() { } - async addUserTyping(data: TypingList) { + async addUserTyping(data: TypingTable) { + data.id = data.chatRoomId + '@' + data.userName try { - const result = await TypingDataSource.TypingList.add(data) + const result = await chatDatabase.typing.add(data) return ok(result) } catch (e) { return err(false) } } - async removeUserTyping(data: TypingList) { + async removeUserTyping(data: TypingTable) { const id = data.chatRoomId + '@' + data.userName try { - const result = await TypingDataSource.TypingList.delete(id) + const result = await chatDatabase.typing.delete(id) return ok(result) } catch (e) { return err(false) @@ -57,7 +39,7 @@ export class UserTypingLocalDataSourceService { getUserTypingLive() { - return liveQuery(() => TypingDataSource.TypingList.toArray()); + return liveQuery(() => chatDatabase.typing.toArray()); } } diff --git a/src/app/module/chat/data/data-source/userTyping/user-typing-memory-data-source.service.ts b/src/app/module/chat/data/data-source/userTyping/user-typing-memory-data-source.service.ts index d3a1ca867..7c265461f 100644 --- a/src/app/module/chat/data/data-source/userTyping/user-typing-memory-data-source.service.ts +++ b/src/app/module/chat/data/data-source/userTyping/user-typing-memory-data-source.service.ts @@ -1,22 +1,22 @@ import { createAction, createFeatureSelector, createReducer, createSelector, on, props } from '@ngrx/store'; -import { TypingList } from './user-typing-local-data-source.service'; +import { TypingTable } from '../../../infra/database/dexie/schema/typing'; export const addUserTyping = createAction( '[Typing] Add User Typing', - props<{ data: TypingList }>() + props<{ data: TypingTable }>() ); export const removeUserTyping = createAction( '[Typing] Remove User Typing', - props<{ data: TypingList }>() + props<{ data: TypingTable }>() ); export const loadUserTyping = createAction('[Typing] Load User Typing'); export const loadUserTypingSuccess = createAction( '[Typing] Load User Typing Success', - props<{ data: TypingList[] }>() + props<{ data: TypingTable[] }>() ); export const loadUserTypingFailure = createAction( @@ -26,7 +26,7 @@ export const loadUserTypingFailure = createAction( export interface TypingState { - typingList: TypingList[]; + typingList: TypingTable[]; error: any; } @@ -64,7 +64,7 @@ export const selectAllUserSource = createSelector( (state: TypingState) => state.typingList ); -export const selectUserTypingList = () => createSelector( +export const selectUserTypingTable = () => createSelector( selectAllUserSource, (typingList) => typingList ); diff --git a/src/app/module/chat/data/repository/user-typing-repository.service.ts b/src/app/module/chat/data/repository/user-typing-repository.service.ts index f31378900..613f9d350 100644 --- a/src/app/module/chat/data/repository/user-typing-repository.service.ts +++ b/src/app/module/chat/data/repository/user-typing-repository.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; -import { TypingList, UserTypingLocalDataSourceService } from '../data-source/userTyping/user-typing-local-data-source.service'; +import { UserTypingLocalDataSourceService } from '../data-source/userTyping/user-typing-local-data-source.service'; import { UserTypingLiveDataSourceService } from '../data-source/userTyping/user-typing-live-data-source.service'; -import { SessionStore } from 'src/app/store/session.service'; +import { TypingTable } from '../../infra/database/dexie/schema/typing'; @Injectable({ providedIn: 'root' @@ -17,7 +17,7 @@ export class UserTypingServiceRepository { return await this.liveDataSource.sendTyping(ChatRoomId) } - async removeUserTyping(data: TypingList) { + async removeUserTyping(data: TypingTable) { return await this.localDataSource.removeUserTyping(data) } 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 index 8aebf07c8..9d6e88c79 100644 --- 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 @@ -24,7 +24,7 @@ export class SocketMessageUpdateUseCaseService { // delete data.chatRoomId if(result.isOk()) { - console.log('message exist') + console.log('message exist', result.value) return this.messageLocalDataSourceService.update(result.value.$id, incomingMessage) } else { console.log('message else') diff --git a/src/app/module/chat/infra/database/dexie/schema/message.ts b/src/app/module/chat/infra/database/dexie/schema/message.ts index 05312001a..d8a74c24b 100644 --- a/src/app/module/chat/infra/database/dexie/schema/message.ts +++ b/src/app/module/chat/infra/database/dexie/schema/message.ts @@ -28,4 +28,5 @@ export const MessageTable = z.object({ export type MessageTable = z.infer export type DexieMessageTable = EntityTable; -export const messageTableColumn = '++id, roomId, senderId, message, messageType, canEdit, oneShot, requireUnlock' +export const messageTableColumn = '++$id, id, roomId, senderId, message, messageType, canEdit, oneShot, requireUnlock' + diff --git a/src/app/module/chat/infra/database/dexie/schema/typing.ts b/src/app/module/chat/infra/database/dexie/schema/typing.ts index 7f0c72b4c..2cddf27f3 100644 --- a/src/app/module/chat/infra/database/dexie/schema/typing.ts +++ b/src/app/module/chat/infra/database/dexie/schema/typing.ts @@ -3,11 +3,12 @@ import { EntityTable } from 'Dexie'; export const TypingTableSchema = z.object({ id: z.string().optional(), - userId: z.string(), - roomId: z.string(), + userId: z.string().optional(), + userName: z.string(), + chatRoomId: z.string(), entryDate: z.string() }) export type TypingTable = z.infer export type DexieTypingsTableSchema = EntityTable; -export const TypingTableColumn = '++id, userId, roomId, entryDate' +export const TypingTableColumn = 'id, userId, userName, chatRoomId, entryDate' diff --git a/src/app/module/chat/infra/database/dexie/service.ts b/src/app/module/chat/infra/database/dexie/service.ts index c2810a6b7..8ddf9fb81 100644 --- a/src/app/module/chat/infra/database/dexie/service.ts +++ b/src/app/module/chat/infra/database/dexie/service.ts @@ -4,9 +4,10 @@ import { DexieMessageTable, messageTableColumn, MessageTable } from './schema/me import { DexieMembersTableSchema, MemberTableColumn } from './schema/members'; import { DexieRoomsTableSchema, RoomTableColumn } from './schema/room'; import { DexieTypingsTableSchema, TypingTableColumn } from './schema/typing'; +import { MessageEntity } from '../../../domain/entity/message'; // Database declaration (move this to its own module also) -export const chatDatabase = new Dexie('chat-database') as Dexie & { +export const chatDatabase = new Dexie('chat-database-infra') as Dexie & { message: DexieMessageTable, members: DexieMembersTableSchema, room: DexieRoomsTableSchema, @@ -19,3 +20,5 @@ chatDatabase.version(1).stores({ room: RoomTableColumn, typing: TypingTableColumn }); + +chatDatabase.message.mapToClass(MessageEntity) diff --git a/src/app/shared/chat/messages/messages.page.ts b/src/app/shared/chat/messages/messages.page.ts index ffdbf9dd7..e3caab98b 100644 --- a/src/app/shared/chat/messages/messages.page.ts +++ b/src/app/shared/chat/messages/messages.page.ts @@ -40,12 +40,12 @@ import { MessageTable } from 'src/app/module/chat/infra/database/dexie/schema/me import { MessageInputDTO } from 'src/app/module/chat/data/dto/message/messageInputDtO'; import { RoomListItemOutPutDTO } from 'src/app/module/chat/data/dto/room/roomListOutputDTO'; import { UserTypingServiceRepository } from 'src/app/module/chat/data/repository/user-typing-repository.service'; -import { UserTypingList } from 'src/app/module/chat/data/data-source/userTyping/user-typing-local-data-source.service'; import { ChatServiceService } from 'src/app/module/chat/domain/chat-service.service'; import { EditMessagePage } from 'src/app/modals/edit-message/edit-message.page'; import { tap } from 'rxjs/operators'; import { MessageEntity } from 'src/app/module/chat/domain/entity/message'; import { MemberTable } from 'src/app/module/chat/infra/database/dexie/schema/members'; +import { TypingTable } from 'src/app/module/chat/infra/database/dexie/schema/typing'; const IMAGE_DIR = 'stored-images'; @@ -127,8 +127,8 @@ export class MessagesPage implements OnInit, OnChanges, AfterViewInit, OnDestroy roomStatus$: DexieObservable roomMessage$: DexieObservable roomMembers$: DexieObservable - //userTyping$: DexieObservable - userTyping$: UserTypingList[] | undefined + //userTyping$: DexieObservable + userTyping$: TypingTable[] | undefined newMessagesStream!: Subscription selectedMessage: any = null;